Чтение онлайн

на главную

Жанры

Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:

}

}

}

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

<< "]; попробуйте еще \n";

}

}

Этот вариант функции

get_int
работает так же упорно, как и остальные. Она продолжает ввод целых чисел, выходящих за пределы диапазона, пока не найдет число, лежащее в указанных пределах.

Теперь можем написать код для ввода целых чисел.

int n = get_int(1,10);

cout << "n: " << n << endl;

int m = get_int(2,300);

cout << "m: " << m << endl;

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

get_int
на самом деле не может ввести ни одного числа.

10.7.2. Отделение диалога от функции

Разные варианты функции

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

int strength = get_int(1,10,"Введите силу",

"Вне диапазона, попробуйте еще");

cout << " сила: " << strength << endl;

int altitude = get_int(0,50000,

"Пожалуйста, введите высоту в футах",

"Вне диапазона, пожалуйста, попробуйте еще");

cout << "высота: " << altitude << " футов над уровнем моря \n";

Эту задачу можно решить так:

int get_int(int low, int high, const string& greeting,

const string& sorry)

{

cout << greeting << ": [" << low << ':' << high << "]\n";

while (true) {

int n = get_int;

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

cout << sorry << ": [" << low << ':' << high << "]\n";

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

Ученичество. Книга 1

Понарошку Евгений
1. Государственный маг
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Ученичество. Книга 1

Идеальный мир для Лекаря 7

Сапфир Олег
7. Лекарь
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 7

Обыкновенные ведьмы средней полосы

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Обыкновенные ведьмы средней полосы

Треск штанов

Ланцов Михаил Алексеевич
6. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Треск штанов

Медиум

Злобин Михаил
1. О чем молчат могилы
Фантастика:
фэнтези
7.90
рейтинг книги
Медиум

"Фантастика 2023-123". Компиляция. Книги 1-25

Харников Александр Петрович
Фантастика 2023. Компиляция
Фантастика:
боевая фантастика
альтернативная история
5.00
рейтинг книги
Фантастика 2023-123. Компиляция. Книги 1-25

Гром над Тверью

Машуков Тимур
1. Гром над миром
Фантастика:
боевая фантастика
5.89
рейтинг книги
Гром над Тверью

Идеальный мир для Лекаря 11

Сапфир Олег
11. Лекарь
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 11

Совок

Агарев Вадим
1. Совок
Фантастика:
фэнтези
детективная фантастика
попаданцы
8.13
рейтинг книги
Совок

Табу на вожделение. Мечта профессора

Сладкова Людмила Викторовна
4. Яд первой любви
Любовные романы:
современные любовные романы
5.58
рейтинг книги
Табу на вожделение. Мечта профессора

Сонный лекарь 4

Голд Джон
4. Не вывожу
Фантастика:
альтернативная история
аниме
5.00
рейтинг книги
Сонный лекарь 4

Огненный князь 4

Машуков Тимур
4. Багряный восход
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Огненный князь 4

Войны Наследников

Тарс Элиан
9. Десять Принцев Российской Империи
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Войны Наследников

Бестужев. Служба Государевой Безопасности. Книга вторая

Измайлов Сергей
2. Граф Бестужев
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Бестужев. Служба Государевой Безопасности. Книга вторая