Помогаем древнегреческому герою. (цикл с предусловием.) Цель: 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г.