Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Zzaponka
0 / 0 / 0
Регистрация: 28.08.2012
Сообщений: 12
#1

Как ведет себя cin, если пользователь вводит некорректные данные? - C++

09.12.2012, 02:39. Просмотров 417. Ответов 2
Метки нет (Все метки)

Читаю C++ Primer Plus by Stephen Prata. В седьмой главе у него есть следующий пример.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// lotto.cpp -- probability of winning
#include <iostream>
// Note: some implementations require double instead of long double
long double probability(unsigned numbers, unsigned picks);
int main()
{
    using namespace std;
    double total, choices;
    cout << "Enter the total number of choices on the game card and\n"
            "the number of picks allowed:\n";
    while ((cin >> total >> choices) && choices <= total)
    {
        cout << "You have one chance in ";
        cout << probability(total, choices);      // compute the odds
        cout << " of winning.\n";
        cout << "Next two numbers (q to quit): ";
    }
    cout << "bye\n";
    // cin.get();
    // cin.get();
    return 0;
}
 
// the following function calculates the probability of picking picks
// numbers correctly from numbers choices
long double probability(unsigned numbers, unsigned picks)
{
    long double result = 1.0;  // here come some local variables
    long double n;
    unsigned p;
 
    for (n = numbers, p = picks; p > 0; n--, p--)
        result = result * n / p ; 
    return result;
}
Условием выхода из программы есть введение символа 'q' на запрос.

С другой стороны, в тексте программы я нигде не вижу явной проверки на равенство какой-либо переменной или результата вызова какой-либо функции на равенство этому самому 'q' (проверяется только choices <= total).

Далее, если откомпилировать исходик и запустить программу, то становится ясно, что программа выходит, если вы вводите не цифры. Создав простенький пример, в котором пользователю предлагается ввести значение типа int, а он вводит какую-нибудь белиберду, и после этой самой белиберды вывести значение переменной, то оно будет равным нулю.

Собственно, после этих многабукаф(тм) сам вопрос: расскажите (или ткните, где можно прочитать) поподробнее про поведение всех этих объектов и методов класса iostream? То есть, какие сведения о них могут гарантировать, что вышеприведенная программа будет работать именно таким образом? Прата после разбора исходного текста (по крайней мере, в этом месте) об этом не упоминает...

Thanks in advance, как говорится... =)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.12.2012, 02:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как ведет себя cin, если пользователь вводит некорректные данные? (C++):

cin странно себя ведет - C++
Здравствуйте! Если в самом начале в майне написать char tch; cin.getline(tch,32) То все Ок, работает как надо. Но в в мэйне...

Пользователь вводит текущее время в формате: часы:минута и если 0:00 - 5:59 программа пишет Night, если 6:00-11:59 morning - C++
Помогите написать код для этой задачи(на С++): Пользователь вводит текущее время в формате: часы:минута и если 0:00 - 5:59 программа...

Работаю с файлом *.txt. Прога ведет себя странно если последняя строка файла пуста. Почему так? - C++
Добрый день! Помогите пожалуйста с небольшой проблемой. Что хотел сделать: Есть текстовый файл, в нем содержатся любые...

Как ведет себя вектор при добавлении новых элементов пушбеком? - C++
Товарищи, ниже приведены несколько отрывков из моей программы. Интересует вопрос: почему не выполняется if в 23 строке? int...

пользователь вводит 3 произвольных числа. нужно проверить, составляют ли они геометрическую прогрессию и, если составляют, вывести на экран первые 10 - C++
помогите, пожалуйста. пользователь вводит 3 произвольных числа. нужно проверить, составляют ли они геометрическую прогрессию и, если...

Програма неадекватно себя ведет - C++
Доброго время суток , помогите пожалуйста с кодом... Тут такое дело - програма запрашивает длинну и высоту стены( ширина 2 едигицы ) ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
09.12.2012, 02:43 #2
std::cin - объект, тип которого наследуюется от std::istream

http://www.cplusplus.com/reference/istream/istream/
Member functions inherited from ios
good
Check if the state of the stream is good for i/o operations. (public member function)
eof
Check if eofbit is set (public member function)
fail
Check if either failbit or badbit is set (public member function)
bad
Check if badbit is set (public member function)
там же где-то могут быть еще функции для проверок и сброса.
в общем стрим становится бэдным и по хорошему после каждого ввода его нужно проверять на то, не попортился ли он.
Zzaponka
0 / 0 / 0
Регистрация: 28.08.2012
Сообщений: 12
09.12.2012, 03:04  [ТС] #3
Цитата Сообщение от DU Посмотреть сообщение
std::cin - объект, тип которого наследуюется от std::istream

http://www.cplusplus.com/reference/istream/istream/

там же где-то могут быть еще функции для проверок и сброса.
в общем стрим становится бэдным и по хорошему после каждого ввода его нужно проверять на то, не попортился ли он.
Ага-ага, открыл ссыль, надо почитать, там много всего понаписано. То есть, я могу сделать вывод, что автор, чтобы не пугать начинающих и не углубляться в дебри, просто все эти проверки на дуракоустойчивость пропустил, и пример стал несколько неочевидным? =)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.12.2012, 03:04
Привет! Вот еще темы с ответами:

Цикл While странно себя ведет - C++
Пишу программу которая считывает из каждой строки массив неизвестной длины.Цикл while(который помечен комментом) странно себя...

Итератор по разному себя ведет в цикле - C++
Есть такой кусочек кода: string findKey (string key) { for (auto it = sectionList.begin(); it != sectionList.end(); it++) ...

Файловая система C++ некорректно себя ведет - C++
Файловая система C++ некорректно себя ведет. Считываю .bmp-файл в структуру (не во всю сразу), при выводе значений переменных из структуры...

Объясните пожалуйста как работают cin.good(), cin.sync(), cin.clear() - C++
Такая проблема: сдаю в вуза лабораторные по программированию, писал все сам, до этого c++ не изучал, поэтому возникали некоторые проблемы....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru