Вход/Регистрация
Программирование. Принципы и практика использования C++ Исправленное издание
вернуться

Страуструп Бьерн

Шрифт:

• Считывание значения.

• Предложение к вводу.

• Вывод сообщений об ошибках.

• Пропуск “плохих” входных символов.

• Проверка диапазона входных чисел.

Для того чтобы сделать код яснее, часто достаточно просто логически разделить задачи среди нескольких функций. Например, мы можем выделить код, восстанавливающий ввод после обнаружения “плохого” (т.е. неожиданного) символа.

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 до 10:\n";

int n = 0;

while (true) {

if (cin>>n) { // мы ввели целое число; теперь проверим его

if (1<=n && n<=10) break;

cout << "Извините, " << n

<< " выходит за пределы интервала [1:10]; попробуйте еще раз.\n";

}

else {

cout << "Извините, это не число; попробуйте еще раз.\n";

skip_to_int;

}

}

// если мы добрались до этой точки, значит, число n лежит

// в диапазоне [1:10]

Этот код лучше, но остается слишком длинным и запутанным для того, чтобы много раз применять его в программе. Мы никогда не добьемся желаемого результата, разве что после (слишком) долгой проверки. Какие операции мы бы хотели иметь на самом деле? Один из разумных ответов звучит так: “Нам нужны две функции: одна должна считывать любое число типа int, а другая — целое число из заданного диапазона”.

int get_int; // считывает число типа int из потока cin

int get_int(int low, int high); // считывает из потока cin число int,

// находящееся в диапазоне [low:high]

Если бы у нас были эти функции, то мы могли бы, по крайней мере, использовать их просто и правильно. Их несложно написать.

int get_int

{

int n = 0;

while (true) {

if (cin >> n) return n;

cout << "Извините, это не число; попробуйте еще раз \n";

skip_to_int;

}

}

В принципе функция

get_int
упорно считывает данные, пока не найдет цифры, которые можно интерпретировать как целое число. Если требуется прекратить работу функции
get_int
, то следует ввести целое число или признак конца файла (во втором случае функция
get_int
сгенерирует исключение).

Используя такую общую функцию

get_int
, можем написать проверку выхода за пределы диапазона
get_int
:

int get_int(int low, int high)

{

cout << "Пожалуйста, введите целое число из от "

<< low << " до " << high << " ( включительно ):\n";

while (true) {

int n = get_int;

if (low<=n && n<=high) return n;

cout << "Извините, " << n

<< " выходит за пределы интервала ["<< low << ':' << high

  • Читать дальше
  • 1
  • ...
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: