Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп
Книгу Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп читаем онлайн бесплатно полную версию! Чтобы начать читать не надо регистрации. Напомним, что читать онлайн вы можете не только на компьютере, но и на андроид (Android), iPhone и iPad. Приятного чтения!
Шрифт:
Интервал:
Закладка:
cout << "Извините, "
<< n << " выходит за пределы интервала [1:10];
попробуйте еще n";

1. Что делать, если пользователь вводит число, находящееся за пределами допустимого диапазона?
2. Что делать, если пользователь не вводит никакого числа (признак конца файла)?
3. Что делать, если пользователь вводит неправильные данные (в данном случае не целое число)?
Что же делать во всех этих ситуациях? При создании программ часто возникает вопрос: чего мы на самом деле хотим? В данном случае для каждой из трех ошибок у нас есть три альтернативы.
1. Решить проблему в коде при вводе данных.
2. Сгенерировать исключение, чтобы кто-то другой решил проблему (возможно, прекратив выполнение программы).
3. Игнорировать проблему.

Заманчиво сказать, что третья альтернатива, т.е. игнорировать проблему, ни в коем случае не является приемлемой, но это было бы преувеличением. Если я пишу простую программу для своего собственного использования, то могу делать все, что захочу, даже забыть о проверке ошибок, которые могут привести к ужасным результатам. Однако если я пишу программу, которую буду использовать через несколько часов после ее создания, то было бы глупо оставлять такие ошибки. Если же я планирую передать свою программу другим людям, то не стану оставлять такие дыры в системе проверки ошибок. Пожалуйста, обратите внимание на то, что местоимение “я” здесь использовано намеренно; местоимение “мы” могло бы ввести в заблуждение. Мы не считаем третью альтернативу приемлемой, даже если в проекте участвуют только два человека.
Выбор между первой и второй альтернативами является настоящим; иначе говоря, в программе могут быть веские причины выбрать любой из них. Сначала отметим, что в большинстве программ нет локального и элегантного способа обработать ситуацию, когда пользователь не вводит данные, сидя за клавиатурой: после того, как поток ввода был закрыт, нет большого смысла предлагать пользователю ввести число. Мы могли бы заново открыть поток cin (используя функцию cin.clear()), но пользователь вряд ли закрыл этот поток непреднамеренно (как можно случайно нажать комбинацию клавиш <Ctrl+Z>?). Если программа ждет ввода целого числа и обнаруживает конец файла, то часть программы, пытающаяся прочитать это число, должна прекратить свои попытки и надеяться, что какая-то другая часть программы справится с этой проблемой; иначе говоря, наш код, требующий ввода от пользователя, должен сгенерировать исключение. Это значит, что выбор происходит не между локальным генерированием исключений и решением проблемы, а между задачами, которые следует решить локально (если они возникают).
10.7.1. Разделение задачи на управляемые части
Попробуем решить проблемы, связанные с выходом за пределы допустимого диапазона при вводе и при вводе данных неправильного типа.
cout << "Пожалуйста, введите целое число от 1 до 10:n";
int n = 0;
while (true) {
cin >> n;
if (cin) { // мы ввели целое число; теперь проверим его
if (1<=n && n<=10) break;
cout << "Извините, "
<< n << " выходит за пределы интервала [1:10];
попробуйте еще n";
}
else if (cin.fail()) { // обнаружено нечто, что является
// целым числом
cin.clear(); // возвращаем поток в состояние good();
// мы хотим взглянуть на символы
cout << "Извините, это не число; попробуйте еще раз n";
char ch;
while (cin>>ch && !isdigit(ch)); // отбрасываем не цифры
if (!cin) error(" ввода нет "); // цифры не обнаружены:
// прекратить
cin.unget(); // возвращаем цифру назад,
// чтобы можно было считать число
}
else {
error(" ввода нет "); // состояние eof или bad: прекратить
}
}
// если мы добрались до этой точки, значит, число n лежит
// в диапазоне [1:10]

• Считывание значения.
• Предложение к вводу.
• Вывод сообщений об ошибках.
• Пропуск “плохих” входных символов.
• Проверка диапазона входных чисел.

void skip_to_int()
{
if (cin.fail()) { // обнаружено нечто, что является целым числом
cin.clear(); // возвращаем поток в состояние good();
// мы хотим взглянуть на символы
char ch;
while (cin>>ch){ // отбрасываем не цифры
if (isdigit(ch) || ch == '-')
cin.unget(); // возвращаем цифру назад,
// чтобы можно было считать число
}
}
}
error(" ввода нет "); // состояние eof или bad: прекратить
}
Имея вспомогательную функцию skip_to_int(), можем написать следующий код:
cout << "Пожалуйста, введите целое число от
Прочитали книгу? Предлагаем вам поделится своим отзывом от прочитанного(прослушанного)! Ваш отзыв будет полезен читателям, которые еще только собираются познакомиться с произведением.
Уважаемые читатели, слушатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.
- 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
- 2. Просьба отказаться от оскорблений, угроз и запугиваний.
- 3. Просьба отказаться от нецензурной лексики.
- 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.
Надеемся на Ваше понимание и благоразумие. С уважением, администратор knigkindom.ru.
Оставить комментарий
-
Гость Татьяна24 сентябрь 22:20 Как то не очень... Невеста по ошибке. Я не дам тебе развод - Майя Линн
-
Римма24 сентябрь 21:52 Почему главные героинитпкие идиотки? И сюжет не плохой, и написано хорошо. Но как героиня - так дура дурой.... Хозяйка маленького дома, или Любимая для дракона - Кира Рамис
-
Римма20 сентябрь 12:27 Много ненужных пояснений и отступлений. Весь сюжет теряет свою привлекательность. Героиня иногда так тупит, что читать не... Хозяйка приюта для перевертышей и полукровок - Елена Кутукова