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


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

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

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 символа
сравнивай символ с плюсом


Код: C++
  1. #include <boost/algorithm/string.hpp>
  2. #include <boost/lexical_cast.hpp>
  3. #include <iostream>
  4. #include <cstdlib>
  5. #include <locale>
  6.  
  7. int main()
  8. {
  9.     std::locale::global(std::locale(""));
  10.     std::wstring line;
  11.     std::wcout << L"Введите число: " << std::flush;
  12.     while (std::getline(std::wcin, line)) {
  13.         try {
  14.             boost::trim(line);
  15.             double d = boost::lexical_cast<double>(line);
  16.             std::wcout << L"Вы ввели: " << d << std::endl;
  17.             break;
  18.         } catch (const std::exception &e) {
  19.             std::wcerr << e.what() << std::endl;
  20.             std::wcerr << L"Не могу преобразовать \"" << line << L"\" в число" << std::endl;
  21.             std::wcout << L"Введите число: " << std::flush;
  22.         }
  23.     }
  24.     return 0;
  25. }
  26.  

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

  • Участник
  • *
  • Сообщений: 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.066 секунд. Запросов: 24.