Уроки 35 - 41
§ 20. Программирование циклических алгоритмов
Содержание урока
Как организовать цикл?
Циклы с предусловием
Алгоритм Евклида
Циклы в других языках программирования
Обработка потока данных
Циклы с постусловием
Циклы по переменной
Циклы по переменной в других языках программирования
Выводы. Интеллект-карта
Вопросы и задания
Практическая работа № 15 «Циклы с условием»
Практическая работа № 16 «Алгоритм Евклида»
Практическая работа № 17 «Обработка потока данных»
Практическая работа № 18 «Циклы с постусловием»
Практическая работа № 19 «Циклы по переменной»
Циклы с предусловием
Цикл, в котором проверка условия выполняется при входе (перед выполнением очередного шага), называется циклом с предусловием, т. е. циклом с предварительной проверкой условия. Перед тем как начать выполнение цикла, мы проверяем, нужно ли это делать вообще. Это можно сравнить с такой ситуацией: перед тем как прыгнуть в бассейн, нужно проверить, есть ли в нём вода.
Все циклы, записанные в начале параграфа, — это циклы с предусловием. У них есть два важных свойства:
• условие проверяется при входе в цикл, поэтому цикл не выполнится ни разу, если условие в самом начале ложно;
• как только нарушается условие в заголовке цикла, работа цикла заканчивается.
Рассмотрим ещё одну задачу, которая решается с помощью цикла с условием. Требуется ввести с клавиатуры натуральное число и найти сумму цифр его десятичной записи.
Например, если ввели число 123, программа должна вывести сумму 1 + 2 + 3 = 6.
Сначала составим алгоритм решения это задачи. Предположим, что число записано в переменной N. Нам нужно как-то разбить число на отдельные цифры.
Запишите в тетрадь команды, с помощью которых можно:
1) записать в переменную d последнюю цифру числа, находящегося в переменной N;
2) отбросить последнюю цифру числа, находящегося в переменной N;
3) добавить значение переменной d к неизвестному значению, находящемуся в переменной s.
Остаток от деления числа на 10 равен последней цифре десятичной записи числа:
d:=mod(N, 10) d:=N mod 10;
Эту цифру числа нужно добавить к сумме всех цифр, которые мы уже обработали раньше. Сумма цифр — целое число, поэтому будем хранить её в целой переменной sum:
цел sum var sum: integer;
sum:=0 sum:=0;
В самом начале (пока ни одну цифру мы не обработали) значение этой переменной равно нулю.
Для того чтобы добавить к предыдущей сумме новую цифру, нужно заменить значение переменной sum на sum + d, т. е. выполнить присваивание:
sum:=sum+d sum:=sum+d;
Для того чтобы затем удалить последнюю цифру числа N, разделим N на 10 (основание системы счисления):
N:=div(N, 10) N:=N div 10;
Эти три операции — выделение последней цифры числа, увеличение суммы и удаление последней цифры — нужно выполнять несколько раз, пока все цифры не будут обработаны (и удалены!) и в переменной N не останется ноль:
Выполните ручную прокрутку программы при N = 123. Определите итоговое значение переменной sum.
Для введённого числа 123 программа должна выдать ответ 6 (последнее значение переменной sum). Это правильный ответ.
В отличие от предыдущего примера здесь количество шагов цикла заранее неизвестно, оно определяется введённым числом.
Сколько раз выполнится цикл, если ввести однозначное число? Двузначное? К-значное?
Какова может быть сумма цифр двузначного числа? Трёхзначного? К-значного?
Докажем, что эта программа не зациклится, т. е. не будет работать бесконечно. Цикл завершается, когда переменная N становится равна нулю, поэтому нужно доказать, что это обязательно случится. По условию заданное число — натуральное, на каждом шаге цикла оно делится на 10 (остаток отбрасывается), поэтому значение переменной
N каждый раз уменьшается. В результате после очередного уменьшения оно обязательно станет равно нулю.
Следующая страница Алгоритм Евклида
Cкачать материалы урока