Помогаем древнегреческому герою. (цикл с предусловием.) Цель

advertisement
Помогаем древнегреческому герою.
(цикл с предусловием.)
Цель:
1. Объяснить как организовать многократно повторяющиеся действия с
неизвестным числом повторений.
 Может ли цикл не разу не выполняться?
 В каком случае прекращается выполнение цикла?
2. Разобрать пример цикла с предусловием. Научиться применять
оператор цикла While <логическое условие>do<оператор>.
3. Самостоятельно решить задачу с циклом – предусловием.
Перенесёмся из Англии конца XIX века на две тысячи лет назад – В древнюю Грецию.
Древняя Греция - страна великих учёных, поэтов и легендарных героев. Познакомимся с
историей одного из них.
«…Сизиф, сын бога повелителя всех ветров Эола, был основателем города Коринфа,
который в древнейшие времена назывался Эфирой.
Никто во всей Греции не мог равняться по коварству, хитрости и изворотливости ума с
Сизифом. Сизиф благодаря своей хитрости собрал неисчислимые богатства у себя в
Коринфе; далеко распространилась слава о его сокровищах.
Когда пришёл к нему бог смерти мрачный Танат, чтобы низвести его в печальное
царство Аида, то Сизиф, ещё раньше почувствовав приближение бога смерти, коварно
обманул бога Таната и заковал его в оковы. Перестали тогда на земле умирать люди.
Нигде не совершались большие пышные похороны; перестали приносить и жертвы бога
подземного царства. Нарушился на земле порядок, заведенный Зевсом. Тогда
Громовержец Зевс послал к Сизифу могучего бога войны Ареса. Он освободил Таната из
оков, а Танат исторг душу Сизифа и отвёл её в царство теней умерших.
Но и тут сумел помочь себе хитрый Сизиф. Он сказал жене своей, чтобы она не
погребала его тела и не приносила жертвы подземным богам. Послушалась мужа жуна
Сизифа. Аид и Персефона долго ждали похоронных жертв. Всё нет их! Наконец
приблизился к трону Аида Сизиф и сказал владыке царства умерших, Аиду;
- О, властитель душ умерших, великий Аид, равный могуществу Зевса, отпусти меня на
светлую землю. Я велю жене моей принести тебе Богатые Жертвы и вернусь обратно в
царство теней.
Так обманул Сизиф владыку Аида, и тот отпустил его на землю. Сизиф не вернулся,
конечно, в царство Аида. Он остался в пышном дворце своём и весело пировал, радуясь ,
что один из всех смертных смог вернуться из мрачного царства теней.
Разгневался Аид , снова послал он Таната за душой Сизифа. Явился Танат во дворец
хитрейшего из смертных и застал его за роскошным пиром. Исторг душу Сизифа в
царство теней.
Тяжкое наказание насеет Сизиф в загробной жизни за коварства, за все обманы,
которые совершил он на земле. Он осуждён вкатывать на высокую, крутую гору
громадный камень. Напрягая все силы, трудится Сизиф. Пот градом струится с него от
тяжкой работы. Всё ближе вершина; ещё усилие, и окончен будут труд Сизифа; но
вырывается из рук его камель и с шумом катится вниз, поднимая облака пыли. Снова
принимается Сизиф за работу.
Так вечно катит камень Сизиф и никогда не может достигнуть цели – вершины
горы…»
Ничего не скажешь – грустная история! Ведь Сизиф – в общем-то, неплохой парень,
во всяком случае, в уме ему не откажешь! Нельзя ли помочь бедняге?
Вот что интересно – дайте прочитать древний миф программисту, он скажет:
«Ничего страшного. Речь идёт о выполнении бесконечного цикла. Я и сам иногда попадаю
в такое же положение и нахожу из него выход!»
Цикл является одной из важнейших алгоритмических структур и представляет собой
последовательность операторов, которая выполняется неоднократно. В программах,
связанных с обработкой данных или вычислениями, часто приходится выполнять
циклически повторяющиеся действия. Циклы позволяют записать такие действия в
компактной форме.
Циклы принадлежат к числу управляющих операторов. Внимательный ученик
мог заметить, что до сих пор мы использовали два вида операторов. Одни из них
(Read,Write, оператор присваивания) только выполняли какие – либо действия, другие же
управляли ходом выполнения программы (например условный оператор).Последние и
называются управляющими операторами.
Давайте познакомимся с примерами использования циклов в программах на Паскале.
Рассмотрим задачу на вычисление суммы большого числа слагаемых:
1+1/2+1/3+1/4+……+1/99+1/100
Можно было бы выбрать простое решение и записать вычисление данной суммы в
строчку, употребив 99 операций деления и 99 операций сложения. Ну а если число
элементов суммы равно 1000 или просто любому целому числу? Представьте себе
программу с оператором, который занимает несколько страниц и содержит 999 сложений!
Очевидно, простое решение здесь уже не подходит. Можно заметить, что при вычислении
суммы повторяются все три операции, причём в определённом порядке:
1. Разделить единицу на знаменатель.
2. Прибавить частное к раннее полученной сумме.
3. Увеличить на единицу значение знаменателя.
Следовательно, задачу можно решить, например, так:
1. Присвоить переменной Sum значение равное 0
(Sum:=0).
2. Присвоить переменной i значение равное 1
(i:=1).
3. Добавить к сумме значение 1/i
(Sum:=Sum+1/i).
4. Увеличить i на 1
(i:=i+1).
5. Повторить шаги 3 и 4.
Повторив операции 3 и 4 99 раз, мы получим требуемую сумму. Это пример
алгоритмической конструкции «цикл»:
В языке программирования Паскаль имеет три разновидности цикла:
 Цикл со счетчиком (чикл «для» - for ......to / downto);
 Цикл с предусловием (цикл «пока» - while);
 Цикл с постусловием (цикл «до тех пор, пока» - repeat…until).
Каждая из трёх разновидностей цикла имеет свои особенности, для каждой из них есть
свой круг задач, наиболее естественно решаемых именно с её помощью.
Цикл с предусловием.
Цикл с предусловием имеет вид:
while условие do {Эта часть называется заголовком цикла}
оператор;
{Эта часть называется телом цикла}
Телом цикла может быть и группа операторов, заключённая в операторные скобки begin…
end (то есть составной оператор).
Цикл с предусловием выполняется до тех пор, пока истинно условие в заголовке цикла,
причём оно проверяется вначале, потом исполняется оператором.
Переменным, входящим в условие, должны быть присвоены значения до входа в цикл.
В теле цикла должны быть операторы, которые в какой-то момент изменят
значение условия, сделав его ложным. Если этого не случится, цикл будет бесконечным.
При возникновении в программе бесконечного цикла говорят, что программа
«зациклилась». Зациклившуюся программу приходится останавливать одновременным
нажатием клавиш Ctrl+Break, иначе она будет выполняться вечно (точнее, до первого
отключения компьютера).
Задача о вычислении суммы может быть решена с использованием цикла while…do
следующим образом:
Program summa1;
Const n=100; {Так объявляется именованная константа программы}
Var
I : integer;
Sum : real;
Begin
Sum :=0;
I :=1; {Присвоим переменной Sum начальное значение 0, а I – начальное значение 1}
While I<= N do
Begin
Sum:= Sum+1/I;
I :=I+1 {Переменная I меняется внутри цикла, и её величина определяет очередное
повторение тела цикла}
End;
Writeln (`сумма`, N,`элементов = ` Sum:10:5);
End.
Цикл в этой программе работает следующим образом:
 Вначале I=1, Sum=0.
 Условие I<=100 в заголовке оператора while , поэтому начинается выполнение
цикла.
 Значение суммы увеличивается на 1: Sum=0+1.
 I увеличивается на 1 I=2.
 Условие I<=100 вновь истинно, поэтому тело цикла повторяется очередной раз;
 Значение суммы Sum = 0+1+1/2, а переменной I=3.
 После выполнения данной последовательности действий необходимое число раз
получаем Sum = .....+1/100, I=101.
 Условие I<=100 ложно, поэтому цикл завершается. Следующим действием будет
вывод результата.
Отметим, что в данном решении использовалась константа. Константа может иметь имя,
тогда она называется именной константой. Объявляется именная константа в
предложении описания констант, которое размещается в разделе описания программы и
имеет вид:
Const имя = значение;
Использование именных констант преследует две цели:
 Сделать программу более удобной для понимания. Если, допустим, в программе
часто используется число 12, то иногда удобнее один раз дать ему имя, например
dozen, а затем использовать это имя.
 Облегчить изменение программы. Если скажем нужно изменить количество
элементов суммы, то лучше изменить одну строку в предложении описания
констант, чем вносить исправления по всей программе.
Самостоятельная работа.
Уровень А.
Вычисление суммы большого числа слагаемых:
1+1/2+1/4+1/6+1/8+……+1/198+1/200
Program summa2
Const n=200; {Так объявляется именованная константа программы}
Var
I : integer;
Sum : real;
Begin
Sum :=0;
I :=2; {Присвоим переменной Sum начальное значение 0, а I – начальное значение 2}
While I<= N do
Begin
Sum:= 1+(Sum+1/I);
I :=I+2 {Переменная I меняется внутри цикла, и её величина определяет очередное
повторение тела цикла}
End;
Writeln (`сумма`, N,`элементов = ` Sum:10:5);
End.
Уровень В.
Использование цикла while для приближённого вычисления суммы
1+Х/1!+Х/2!+Х/3!+….с точностью e
Program summa3
Var
I : integer; {Счетчик числа шагов}
X: real; {Основание степени в числе дроби}
Sum : real; {в этой переменной будем накапливать сумму}
Eps : real; {Заданное число «эпсилон»}
Y: real; {Для хранения очередного слагаемого}
Begin
Writeln (`Введите X и Epsilon:`);
Readln (Х,Eps);
Y: =1; {Первое слагаемое}
Sum: =Y; {Положим в сумматор первое слагаемое}
I: =0; {Обнулим счетчик шагов}
While abs(Y) >=eps do {Пока добавленное слагаемое не меньше «эпсилон», считаем
сумму. Если «эпсилон» сразу не меньше 1, цикл не выполнится ни разу!}
Begin {Началось тело цикла}
I:=I+1; {Вычислили номер текущего шага}
Y :=Y*X/I; {Посчитали новое слагаемое}
Sum :=Sum +Y; {Увеличили сумму на текущее слагаемое}
End;
Writeln (`сумма чисел=`, Sum:6:4);
Readln
End.
Уровень С.
Использование цикла while для подсчета суммы вводимых чисел до первого
отрицательного числа.
Program summa4
Const n=100; {Так объявляется именованная константа программы}
Var
A, Sum : real;
Begin
Sum :=0; {Обнуляем сумму}
Write(`введите число:` ); {Ввод первого числа}
Readln (A); {Так как мы собираемся проверять переменную А до начала цикла., ей
необходимо присвоить начальное значение}
While A>= 0 do {Проверяем введённое число на отрицательность}
Begin
Sum:= Sum+A; {Добавляем введённое число к сумме}
Write(`введите число:` ); {Ввод очередного числа}
Readln(A);
End;
Writeln (`сумма чисел=`, Sum:5:3);
End.
Литература:
1. С. Немнюгин, Л. Перколаб «Изучаем Turbo Pascal.» Питер Москва. 2008г.
2. Д.М. Ушаков, Т.А. Юркова «Паскаль для школьников.» Питер Москва 2008г.
Download