Книга: Песни о Паскале
Глава 17 И вновь за парту
Разделы на этой странице:
Глава 17
И вновь за парту
Натешившись глупой игрушкой, сотворенной нами в предыдущей главе, с новыми силами набросимся на экзаменатора, ведь он ещё не совсем настоящий. Настоящий экзаменатор выставляет оценку, не так ли? Пусть наша программа оценивает ученика по количеству допущенных ошибок. Ответив, к примеру, на 15 вопросов, ученик получит:
• «отлично» – за ноль ошибок;
• «хорошо» – за 1-2 ошибки;
• «удовлетворительно» – за 3-5 ошибок;
• «неуд» – за 6 ошибок и более.
Цикл со счетчиком
Очевидно, что новая версия экзаменатора будет циклической (рис. 39), только условие выхода из цикла будет теперь другим.
Рис. 39 – Блок-схема экзаменатора, выставляющего оценку
Основное отличие этой версии от предыдущих состоит в применении счетчиков. Один из них подсчитывает количество заданных вопросов (то есть проходов цикла), а другой – количество ошибок. Что такое счетчик? Это числовая переменная, наращиваемая по ходу выполнения программы. Сначала рассмотрим тонкости, связанные с подсчетом вопросов.
Зададимся простой задачей: распечатать на экране числа от 1 до 10. Вот как это делается оператором REPEAT-UNTIL.
var N : integer; { счетчик }
begin
N:=1;
repeat
Writeln(N);
N:= N+1;
until N>10
end.
Первый из выделенных операторов устанавливает счетчик цикла в единицу, – программисты называют это инициализацией цикла. Другой выделенный оператор наращивает счетчик. Эта пара операторов, как принято говорить, организует цикл. Слабость такой организации в том, что действуют операторы порознь, а это таит две неприятности.
Человеку свойственно ошибаться, и программисты забывают порой вставить в программу ту или иную строчку. Что случится, если пропустить инициализацию? Значение счетчика N останется неопределенным, и цикл выполнится непонятно сколько раз. А если проворонить второй оператор? Счетчик наращиваться не будет, и цикл станет повторяться вечно, – программа, как говорят, зациклится! Во избежание таких ошибок в Паскале предусмотрен цикл со счетчиком.
Цикл со счетчиком объединяет в одной конструкции три действия: инициализацию счетчика, его приращение и проверку условия завершения цикла. Если б написать его по-русски, то оператор выглядел бы так:
ДЛЯ N:= начальное_значение ДО конечное_значение ВЫПОЛНИТЬ оператор
Но русским Паскаль не владеет, а потому переведем это на английский:
FOR N:= начальное_значение TO конечное_значение DO оператор
Как видите, конструкция построена на трех ключевых словах: FOR-TO-DO. После слова FOR следует оператор присваивания начального значения счетчику цикла. За словом TO указывают конечное значение счетчика, а после DO – выполняемый внутри цикла оператор. Но где наращивается счетчик? А нигде, это происходит автоматически! Теперь задача распечатки чисел может быть решена одним составным оператором.
var N : integer; { счетчик }
begin
for N:=1 to 10 do Writeln(N);
end.
Испытайте эту программку. Согласитесь, что ошибиться здесь труднее, чем в варианте с REPEAT. Как только вы написали FOR, то обязаны тут же указать начальное и конечное значения счетчика, а наращивать его Паскаль будет и без вас. В качестве начального и конечного значений вы вправе указать не только числа, но и выражения, – они будут вычислены один раз в начале цикла. Если начальное значение счетчика окажется равным конечному, цикл выполнится единожды. А если конечное значение окажется меньше начального, то ни разу!
Осталось ответить лишь на один вопрос: что, если внутри цикла надо выполнить несколько операторов? Ведь после слова DO предусмотрен лишь один. Впрочем, те, кто помнит об операторных скобках BEGIN-END, знают ответ. Напомню, что эти скобки превращают группу операторов в единый блок, этим мы и воспользуемся в новой версии экзаменатора.
{ P_17_1 – экзаменатор, выставляющий оценку }
var A, B, C : integer; { сомножители и произведение }
Q, E : integer; { счетчик вопросов и счетчик ошибок }
S: string;
begin
Randomize;
E:= 0; { обнуляем счетчики ошибок }
for Q:= 1 to 15 do begin { 15 вопросов }
A:= 1+ Random(10); B:= 1+ Random(10);
Write(Q,’) Сколько будет ’, A,’ x ’,B, ’ ? ’);
Readln(C);
{ Если ответ неверный, увеличиваем счетчик ошибок }
if A*B <> C then E:= E+1;
end; { цикл и блок завершаются здесь}
case E of { выставляем оценку }
0: S:=’Отлично!’;
1,2: S:=’Хорошо’;
3..5: S:=’Удовлетворительно’;
else S:=’Ну оччччень плохо!’;
end;
Writeln(S, ’ Нажмите Enter’); Readln;
end.
Рассмотрим изюминки этой программы. В операторе
Write(Q,’) Сколько будет ’, A,’ x ’,B, ’ ? ’);
вместе с вопросом печатается его порядковый номер Q.
Но самое интересное – это метки в операторе CASE. Напротив оценки «хорошо» стоит метка из двух разделенных запятой чисел (1, 2), – эта ветвь оператора CASE выполнится для этих двух значений. Такие объединенные метки могут содержать несколько чисел. А если числа следуют подряд, их заменяют числовым диапазоном – это два числа, разделенные двумя точками («многоточием»), причем первое число должно быть меньше второго. Такой диапазон (3..5) служит меткой для ветви «Удовлетворительно».
Итоги
• Цикл со счетчиком FOR-TO-DO удобен при известном количестве повторений, которое вычисляется при входе в цикл.
• Счетчик цикла внутри оператора наращивается автоматически, цикл завершается, когда счетчик превысит указанное максимальное значение.
• Оператор выбора CASE-OF-ELSE-END допускает метки из нескольких чисел, и даже диапазоны целых чисел.
А слабо?
А) Позвольте ученику отказаться от сдачи экзамена. Признаком отказа будет ввод нуля в качестве ответа. В этом случае надо досрочно выйти из цикла и обойти выставляющий оценку оператор (вспомните о процедуре Break).
Б) Напишите программу, которая по введенному числу дает заключение о том, какому дню недели оно соответствует – рабочему (1-5) или выходному (6,7), например:
День = 2
Рабочий
День = 7
Выходной
День = 20
Ошибка!
Здесь выделенные числа напечатаны пользователем.
В) Напишите программу, которая, запросив число N, печатала бы числа от 1 до N в обратном порядке, например:
N = 3
3
2
1
Г) Существует вариант цикла FOR, где счетчик цикла не наращивается, а уменьшается, этот оператор выглядит так:
FOR N:= начальное_значение DOWNTO конечное_значение DO оператор
Ключевое слово DOWNTO задает счет в обратном порядке (DOWN – «вниз»); при этом начальное значение счетчика должно быть больше или равно конечному, иначе цикл не выполнится ни разу. Воспользуйтесь этим оператором для решения предыдущей задачи (задание В).
Д) Пусть программа запросит два числа N и M, а затем вычислит их произведение без использования операции умножения (*). Подсказка: организуйте цикл суммирования N раз числа M.
Е) Напишите программу, вычисляющую сумму чисел от 1 до N, где N – число, вводимое пользователем.
Ж) Напишите программу, вычисляющую сумму только тех чисел от 1 до N, которые делятся либо на три, либо на пять.
Задачи на темы предыдущих глав
И) Платный участок трассы протянулся с километра P1 до километра P2 (P1<P2). А пост ГАИ размещен на километре M. Попадает ли этот пост на платный участок трассы? Пусть ваша программа разберется с этим.
К) Дорожная служба запланировала ремонт трассы на участке с R1 по R2 (R1<R2). В сочетании с условием предыдущей задачи ваша программа должна определить:
• Будут ли ремонтировать весь платный участок P1–P2 ?
• Будут ли ремонтировать хотя бы часть платного участка P1–P2 ? Если да, то определить длину ремонтируемой платной части.
• Будут ли ремонтировать хотя бы часть бесплатного участка? Если да, то определить длину ремонтируемой бесплатной части.
- Только для взрослых
- Детям до 16–ти
- Глава 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 Множества
- Глава 36 Множества в Паскале
- Глава 37 Ввод и вывод множеств
- Глава 38 Множества в «бою»
- Глава 39 Командная игра (массивы)
- Глава 40 Пристрелка на знакомых мишенях
- Глава 41 По порядку, становись!
- Глава 42 Кто ищет, тот всегда найдет
- Глава 43 Сортировка по-взрослому
- Глава 44 Строки
- Глава 45 Очереди и стеки
- Глава 46 Огромные числа
- Глава 47 Системы счисления
- Глава 48 Железная логика
- Глава 49 Сложные массивы
- Глава 50 Неспортивные рекорды (записи)
- Глава 51 Указатели в море памяти
- Глава 52 Динамические переменные
- Глава 53 Массив указателей
- Глава 54 Односвязные списки
- Глава 55 Слова, слова, слова…
- Глава 56 И снова очереди, и снова стеки…
- Глава 57 Графомания
- Глава 58 По графу шагом марш!
- Глава 59 Крупные проекты
- Глава 60 Мелкие хитрости
- Глава 61 «Кубики» программиста (ООП)
- Глава 62 Самое интересное только начинается!
- Приложение А Установка и настройка IDE Borland Pascal
- Приложение Б Консольная программа в среде Delphi
- Приложение В Особенности IDE Pascal ABCNet
- Приложение Г Зарезервированные слова
- Приложение Д Ошибки компиляции
- Приложение Е Ошибки исполнения
- Приложение Ж Директивы управления компиляцией
- Приложение З Назначение пунктов меню
- Приложение И Стандартная кодировка символов MS–DOS
- Приложение К Некоторые встроенные процедуры и функции
- Приложение Л Перечень программ
- Приложение М Пример олимпиадной задачи
- Библиография
- Содержание книги
- Популярные страницы