Программирование циклов
Вложенные и итерационные циклы
Работа 3.4. Программирование циклических алгоритмов
Рассмотрим приемы программирования циклов на Паскале. На уроках "Программирование линейных алгоритмов" рассказывалось о том, что существуют две циклические алгоритмические структуры: цикл с предусловием (цикл-пока) и цикл с постусловием (цикл-до). Были показаны способы описания циклических структур в блок-схемах и на Алгоритмическом языке. Форматы соответствующих операторов цикла в Паскале следующие.
Цикл с предусловием (цикл-пока):
While < логическое выражение > Do < оператор >
Цикл с постусловием (цикл-до):
Repeat < оператор > Until < логическое выражение >
Различают циклы с заданным числом повторений и итерационные циклы.
На примерах конкретных задач рассмотрим приемы программирования циклов.
В математике известно, что сумма следующего бесконечного числового ряда:
в пределе стремится к значению константы е = 2,71828182... Функция ех называется экспонентой, а логарифм по основанию е называется натуральным логарифмом: 1пх.
Требуется составить программу, вычисляющую эту константу по сумме числового ряда. Напомним, что символ «!» читается как «факториал» — функция, определенная следующим образом:
Если слагаемые в вычисляемом выражении обозначить так:
то обобщенная формула для i-го элемента будет следующей:
Нетрудно увидеть, что между элементами данной последовательности имеется зависимость:
Такая зависимость называется рекуррентной зависимостью, а соответствующая числовая последовательность — рекуррентной последовательностью. Данная рекуррентная последовательность может быть описана следующей ветвящейся формулой, которая называется рекуррентной формулой:
Пример 1. Дано целое положительное значение N. Требуется вычислить сумму:
Ниже приводятся два варианта программы решения этой задачи. В первом варианте используется цикл с предусловием, во втором — цикл с постусловием.
Обратите внимание на то, как цикл с предусловием преобразуется в цикл с постусловием — условие цикла помещается после тела цикла и заменяется на противоположное:
Not(i ≤ N) = i > N.
И тот, и другой цикл повторят свое выполнение (N + 1) раз. Переменная i выполняет роль не только знаменателя в дроби 1/i!, но и является счетчиком числа повторений цикла. Такие переменные называются параметрами цикла. И еще: в цикле с постусловием служебные слова Repeat и Until сами выполняют роль операторных скобок. Поэтому писать Begin и End здесь не требуется.
Выполнение этих программ на компьютере для значения N = 7 приводит к следующему результату: Е=2,7182539.
Для программирования циклов с заданным числом повторений при постоянном шаге изменения параметра цикла в Паскале существует цикл с параметром. Вот как выглядит программа решения той же задачи с использованием цикла с параметром:
В программе используется оператор цикла For, для которого существуют два варианта:
1) For <параметр цикла>:=<выражение 1> То <выражение 2>
Do <оператор>
2) For <параметр цикла>:=<выражение 1> Downto <выражение 2>
Do <оператор>
Здесь <параметр цикла> — имя простой переменной порядкового типа. Выполнение оператора For в первом варианте (То) происходит по следующей схеме.
1. Вычисляются значения <выражения 1> и <выражения 2>. Это делается только один раз при входе в цикл.
2. Параметру цикла присваивается значение <выражения 1>.
3. Значение параметра цикла сравнивается со значением <выражения 2>. Если параметр цикла меньше или равен этому значению, то выполняется тело цикла (<оператор>), в противном случае выполнение цикла заканчивается.
4. Значение параметра цикла изменяется на следующее значение в его типе (для целых чисел — увеличивается на единицу); происходит возврат к пункту 3.
Оператор цикла For объединяет в себе действия, которые при использовании цикла While выполняют различные операторы: присваивание параметру начального значения, сравнение его с конечным значением, изменение значения параметра на следующее.
Во втором варианте оператора For слово Downto буквально можно перевести как «вниз до». В таком случае параметр цикла изменяется по убыванию, т. е. при каждом повторении цикла параметр изменяет свое значение на предыдущее (равносильно i : =pred (i)).
Работая с оператором For, учитывайте следующие правила:
• параметр цикла не может иметь вещественного типа;
• в теле цикла нельзя изменять переменную-параметр цикла;
• при выходе из цикла значение переменной-параметра является неопределенным.
Рассмотрим пример программы, в которой в теле цикла будет присутствовать ветвление.
Пример 2. Составим программу проверки знаний учеником таблицы умножения. Компьютер задает ученику 10 вопросов на умножение чисел от 2 до 9. На каждое задание ученик вводит свой ответ, компьютер сообщает, верный ответ или нет.
На рисунке 3.16 приведена блок-схема такого алгоритма.
Обратите внимание на то, как отображается на блок-схеме цикл с параметром.
В этом алгоритме использована функция random (х), результатом выполнения которой является случайное целое число из диапазона от 0 до х - 1. Следовательно, выражение random (8)+2 принимает случайные значения от 2 до 9. Функция random называется датчиком случайных чисел.
На Паскале этот алгоритм программируется так:
А вот фрагмент интерфейса исполнения этой программы:
Сколько будет 4*8? 21 Неправильно! 4*8=32 Сколько будет 6*9? 54 Правильно!
В программе используется стандартная процедура randomize. Ее исполнение производит установку случайного начального состояния датчика случайных чисел. Благодаря этому при повторном выполнении программы будут получаться разные последовательности случайных чисел.
1. Постройте трассировочную таблицу выполнения программы Summa_1 для значения n = 3.
2. Составьте программу, по которой компьютер десять раз запросит ввод любых чисел и в результате выведет среднее арифметическое значение введенных чисел (массив не использовать). Сделайте три варианта программы, используя операторы цикла While, Repeat и For.
3. Составьте программу, по которой компьютер десять раз запросит ввод целых чисел и в результате сообщит, сколько среди введенных чисел четных и сколько нечетных.
4. Составьте программу, по которой на экран будет выведена вся таблица умножения.
5. Усовершенствуйте программу TablMul (пример 2 данного параграфа) таким образом, чтобы в результате выводилось сообщение о количестве правильных и неправильных ответов.
6. Усовершенствуйте программу TablMul таким образом, чтобы в результате выводилась оценка, поставленная ученику. Критерии для выставления оценок придумайте сами.
7. Получите таблицу значений функции sin x и cos x на отрезке [0, 1] с шагом 0,1 в следующем виде:
8. Получите в возрастающем порядке все трехзначные числа, в десятичной записи которых нет одинаковых цифр.
9. Значение функции е х (экспонента от х) равно сходящейся сумме бесконечного ряда:
Получите рекуррентную формулу для слагаемых. Используя операторы цикла While, Repeat и For, составьте три варианта программы вычисления суммы с заданным числом слагаемых.
Следующая страница Вложенные и итерационные циклы