Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: маленький вопрос про потоки в С++  (Прочитано 791 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Scot_Tenorman

  • Автор темы
  • Любитель
  • *
  • Сообщений: 74
    • Просмотр профиля
маленький вопрос про потоки в С++
« : 06 Февраля 2012, 01:37:47 »
#include <iostream>
using namespace std;
int main()
{
char  h;
cout<<"Введите символ '+': ";cin>>h;
while(h!='+')
{
cout<<"Ошибка. Нужно ввести символ '+'.Введите символ: ";cin>>h;
    }
return 0;}
Ввожу не '+'. Выводит строку  "Ошибка. Нужно ввести символ '+'.Введите символ: ". Но если веду несколько символов то строка повториться числу символов. Как это избежать? Сделать так, чтобы строка после ввода любой ерунды повторялась только один раз  и просила выводить тока один раз.

Пользователь решил продолжить мысль 06 Февраля 2012, 01:40:37:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char h[3];
cout<<"Введите символ '+': ";cin>>h;
while(h[0]!='+' or strlen(h)>1)
{
cout<<"Ошибка. Нужно ввести символ '+'.Введите символ: ";cin>>h;
    }
return 0;
}
Как вариант частичного решения проблемы, но повтор строки возникает при вводе ерунды с пробелами.

Пользователь решил продолжить мысль 06 Февраля 2012, 02:24:37:
И еще есть похожая задача. Надо ввести только натуральное число. При вводе любой другой ерунды программа должны запрашивать повторный ввод.
« Последнее редактирование: 06 Февраля 2012, 02:24:37 от Scot_Tenorman »

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: маленький вопрос про потоки в С++
« Ответ #1 : 06 Февраля 2012, 07:51:09 »
читай строку,
обрезай пробельные символы сначала и с конца
проверяй что оставшаяся строка состоит из 1 символа
сравнивай символ с плюсом


Код: (CPP) [Выделить]
#include <boost/algorithm/string.hpp>
#include <boost/lexical_cast.hpp>
#include <iostream>
#include <cstdlib>
#include <locale>

int main()
{
    std::locale::global(std::locale(""));
    std::wstring line;
    std::wcout << L"Введите число: " << std::flush;
    while (std::getline(std::wcin, line)) {
        try {
            boost::trim(line);
            double d = boost::lexical_cast<double>(line);
            std::wcout << L"Вы ввели: " << d << std::endl;
            break;
        } catch (const std::exception &e) {
            std::wcerr << e.what() << std::endl;
            std::wcerr << L"Не могу преобразовать \"" << line << L"\" в число" << std::endl;
            std::wcout << L"Введите число: " << std::flush;
        }
    }
    return 0;
}

Оффлайн Дядюшка Ау

  • Участник
  • *
  • Сообщений: 123
  • Дайте две!
    • Просмотр профиля
Re: маленький вопрос про потоки в С++
« Ответ #2 : 06 Февраля 2012, 12:01:55 »
Уже жду вопрос про "Что такое L в выражении L"Не могу преобразовать \""?
Ubuntu 12.04 для поколупацца, Win7 для поработать

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: маленький вопрос про потоки в С++
« Ответ #3 : 06 Февраля 2012, 13:09:34 »
L для того чтобы байты было прикольнее на 10 делить.

Оффлайн Scot_Tenorman

  • Автор темы
  • Любитель
  • *
  • Сообщений: 74
    • Просмотр профиля
Re: маленький вопрос про потоки в С++
« Ответ #4 : 06 Февраля 2012, 13:55:10 »
#include <iostream>
using namespace std;
int main()
{
char h[256];
cout<<"Введите символ '+': ";cin.getline(h,256);
while(h[0]!='+' or h[1]!='\0')
{
cout<<"Ошибка. Нужно ввести символ '+'.Введите символ: ";cin.getline(h,256);
    }
return 0;
}
Как решение проблемы, если длина строки введеной будет меньше, чем 256. Хотя хотелось бы узнать как решить проблему при вводе символов количество которых больше, чем 256. Т.е. не хочется для строки h выделять  256 байт.

Пользователь решил продолжить мысль 06 Февраля 2012, 14:05:19:
#include <iostream>
using namespace std;
int main()
{
string h;
cout<<"Введите символ '+': ";getline(cin,h);
while(h[0]!='+' or h[1]!='\0')
{
cout<<"Ошибка. Нужно ввести символ '+'.Введите символ: ";getline(cin,h);;
    }
return 0;
}
Решение моей проблемы. Теперь буду работать над решением проблемы с вводом натурального числа.
« Последнее редактирование: 06 Февраля 2012, 14:05:19 от Scot_Tenorman »

Оффлайн Дядюшка Ау

  • Участник
  • *
  • Сообщений: 123
  • Дайте две!
    • Просмотр профиля
Re: маленький вопрос про потоки в С++
« Ответ #5 : 06 Февраля 2012, 14:30:00 »
L для того чтобы байты было прикольнее на 10 делить.

Ну делим-то не байты, а исходное число. А вопрос приведения числа 9 к коду символа "9" - он как бы отдельно стоит и можно привести хоть к одно-, хоть к 3-х байтной кодировке.
Ubuntu 12.04 для поколупацца, Win7 для поработать

Оффлайн Scot_Tenorman

  • Автор темы
  • Любитель
  • *
  • Сообщений: 74
    • Просмотр профиля
Re: маленький вопрос про потоки в С++
« Ответ #6 : 06 Февраля 2012, 14:42:02 »
#include <iostream>
using namespace std;
int main()
{
string h;int t;
cout<<"Введите число: ";cin>>t;
cout<<"Введите символ '+': ";getline(cin,h);
while((h[0]!='+' and h[0]!='-' and h[0]!='*' and h[0]!='/') or h[1]!='\0')
{
cout<<"Ошибка. Нужно ввести один из символов '+, -, *, /'.Введите: ";getline(cin,h);
    }
return 0;
}
Не добил я до конца вопрос про ввод '+'. В данном коде есть одна маленькая проблема. Если до ввода строки h был ввод переменной t, то и переменная t записывается в строку h. Как решить эту проблему? Как очистить объект cin после ввода переменной t?

Пользователь решил продолжить мысль 06 Февраля 2012, 15:12:24:
Вроде как мои проблемы решает строка
cin.ignore(1000,'\n');

Пользователь решил продолжить мысль 06 Февраля 2012, 16:17:03:
#include <iostream>
using namespace std;
int main()
{
int a;
while(true)
{
cout<<"Введите числитель дроби: "; cin>>a;
if (cin.good())
{
cin.ignore(1000,'\n');
break;
    }
    cin.clear();
    cout<<"Неправильный ввод числителя. ";
cin.ignore(1000,'\n');
   }
  return 0;
}
Как ввода целого числа. Но как преобразовать данный код, чтобы при вводе числа с точкой выдавалась ошибка а не только отбрасывались цифры после точки. И еще какие действия выполняет функция cin.clear() не могу понять.
« Последнее редактирование: 06 Февраля 2012, 16:17:03 от Scot_Tenorman »

 

Страница сгенерирована за 0.056 секунд. Запросов: 25.