лекция 3.pptx
- Количество слайдов: 16
КОНСТРУКЦИИ ЦИКЛА В ЯЗЫКЕ PASCAL
В практике программирования циклы повторяющиеся выполне ния однотипных действий играют очень важную роль. Существует три стандартных способа организации циклических действий: 1. оператор цикла с параметром ( цикл FOR ) 2. оператор цикла с предусловием ( цикл WHILE ) 3. оператор цикла с постусловием ( цикл REPEAT ) 1. Оператор цикла FOR организует выполнение одного оператора или группы операторов заранее известное число раз. Достигается это с помощью управляющей переменной, называемой параметром цик ла. Следующий простой пример иллюстрирует использование цикла с параметром: for I: =1 to 10 do writeln('Привет!'); В данном примере задано десятикратное повторение оператора вывода. Переменная I является параметром цикла и последовательно принимает значения 1, 2, 3, . . . , 10 , т. е. параметр цикла авто матически принимает последовательно все целые значения, начиная от начального значения (в примере от 1) до конечного значения (в примере до 10). В результате выполнения данного оператора на экран дисплея будет выведено десять строчек со словом 'При вет'. !
Существует другой вариант оператора цикла FOR. Рассмотрим его на примере: for I: =10 downto 1 do writeln(I); В данном примере вместо ключевого слова TO используется клю чевое слово DOWNTO. И это будет означать, что параметр цикла бу дет уменьшаться на 1 при каждом новом выполнении тела цикла. Т. е. переменная I будет принимать последовательно значения 10, 9, 8, . . . , 1. В общем виде оператор цикла с параметром имеет два варианта записи. Вариант 1: For <имя>: =<выражение 1> TO <выражение 2> DO <оператор> Вариант 2: For <имя>: =<выражение 1> DOWNTO <выражение 2> DO <оператор> В этих операторах: <имя> параметр цикла, являющийся переменной порядкового типа (перечислимого или ограниченного); <выражение 1> выражение, определяющее начальное значение параметра; <выражение 2> выражение, определяющее конечное значение параметра; <оператор> тело цикла (выполняемый оператор или группа операторов, оформленных как составной оператор: be gin. . . end).
Таким образом, оператор цикла с параметром определяет: диапазон изменения значений управляющей переменной и, од новременно, число повторений оператора, содержащего тело цикла; направление изменения значения переменной ( возрастание или убывание); собственно действия, выполняемые на каждом шаге (тело цикла). Цикл действует таким образом. Шаг 1. Сначала вычисляются и запоминаются начальное (<выра жение 1>) и конечное значение (<выражение 2>) параметра цикла. Шаг 2. Параметру цикла <имя> присваивается начальное значе ние <выражение 2>. Шаг 3. Значение параметра цикла сравнивается со значением <выражение 2>. Если параметр цикла больше конечного значения (в первом варианте оператора), или меньше конечного значения (во втором варианте оператора), то выполнение оператора цикла завер шается и управление передается команде, следующей за оператором цикла. Шаг 4. Выполняется тело цикла. Шаг 5. После выполнения тела цикла происходит присваивание
На использование управляющей переменной накладываются сле дующие ограничения: 1. Управляющая переменная должна быть описана в текущем блоке. 2. Управляющая переменная должна иметь дискретный тип. 3. Начальные и конечные значения диапазона должны иметь тип, совместимый с типом управляющей переменной. 4. В теле цикла запрещается явное изменение значения управ ляющей переменной ( например, оператором присваивания). 5. После завершения оператора цикла значение управляющей переменной становится неопределенным. Рассмотрим примеры использования цикла FOR. Предположим, что у нас есть следующее описание переменных: Var I: integer; C: char; B: boolean; Col=(Red, Yellow, Green, Blue, White); Тогда будут правильными с синтаксической точки зрения сле дующие конструкции цикла: а) for I: = 10 to 10 do writeln(I); б) for I: =10 downto 10 do writeln(I); в) for C: ='a' to 'r' do writeln(C); г) for b: =False to True do writeln(b); д) for Col: =Red to White do writeln(ord(Col);
2. Вычисление сумм и произведений. Ниже приводится пример программы, вычисляющей сумму квад ратов первых N целых чисел, SUM=1*1+2*2+. . . +N*N Пр. 1. program SUM; var N, sum, I: integer; begin начало тела главной программы writeln; writeln('<<< вычисления суммы квадратов первых N чисел>>>'); writeln; write('N = ? '); readln(N); sum: =0; FOR I: =1 TO N DO sum: =sum+I*I; writeln('сумма квадратов первых ', N, ' чисел pавна ', sum); readln; end.
Пр. 2 Подсчитать произведение Р= 1*2*3*. . . *N. program Proizv; var P: real; N, I: integer; begin начало тела главной программы writeln; writeln('<<< вычисление произведения N чисел >>>'); writeln; write('N = ? '); readln(N); P: =1; FOR I: =1 TO N DO P: =P*I; writeln('произведение ', N, ' чисел pавно ', P); readln; end.
В практике программирования достаточно часто возникает пот ребность использовать вложенные циклы. Примером такого использо вания вложенных циклов может быть программа, вычисляющая и печа тающая таблицу Пифагора: Пр. 3 program PIFAGOR; var I, J: integer; begin начало тела главной программы writeln('<<< ТАБЛИЦА ПИФАГОРА >>>'); writeln; for I: =1 to 10 do по вертикали begin for J: =1 to 10 do по горизонтали write((I*J): 4); writeln переход на следующую горизонталь end; readln end.
3. Максимымы и минимумы. Еще одна часто встречающаяся задача выбрать наибольшее число из вводимой последовательности. Идею алгоритма можно проиллюстрировать на такой ситуации: идет строй юношей, нам нужно определить рост самого высокого из них. Мы устанавливаем планку на высоте роста первого из них, а дальше действуем так: если юноша не проходит под планкой поднимаем планку на высоту его роста, если же проходит планка остается на месте. После того, как строй закончился, высота планки соответствует наибольшему росту. Вот, как это записывается на языке Pascal: program Pr; var i, max, a: real; begin Write('Введите рост: '); readln(a); вводим первое число max : = a; устанавливаем "планку" for i: =2 to n do начинаем с 2, т. к. первое число уже обработано begin write('Введите рост: '); readln(a); вводим очередное число if a > max если "не прошел под планкой" then max : = a; "подняли планку" end; max наибольшее число Read. Ln end.
Если кроме самого числа нас интересует его номер, то нужно в цикле запоминать номер каждого "подозрительного на наибольший" элемента: readln(a); вводим первое число max : = a; устанавливаем "планку" k : = 1; запоминаем номер for i: =2 to n do начинаем с 2, т. к. первое число уже обработано begin readln(a); вводим очередное число if a > max then если "не прошел под планкой" begin max : = a; "подняли планку" k : = i; запомнили номер end; max наибольшее число, k его номер
4. Цикл с предусловием WHILE Если какое то действие или несколько действий необходимо выполнить много раз, но заранее неизвестно сколько раз и это за висит от какого то условия, то тогда следует воспользоваться циклом с предусловием, имеющим вид: WHILE <условие> DO <оператор>; Конструкция читается: пока выполняется условие делать. . . Условие это логическое выражение, истинность которого проверяется в начале каждой итерации. Оператор, следующий за ключевым словом DO называется телом цикла. На месте тела цикла может быть записан составной оператор BEGIN. . . END. В этом случае цикл с предусловием будет иметь вид: WHILE <условие> DO BEGIN <операторы> END;
Перед каждым новым выполнением тела цикла проверяется усло вие и если оно истинно (TRUE), то выполняется тело цикла, а ина че цикл заканчивается и выполняется команда, следующая за данной алгоритмической конструкцией. Рассмотрим пример. Составить программу для вычисления и вывода на печать таблицы значений функции y=a*x*x, x=5, 6, . . . , N program Function 1; var y, a: real; x, N: integer; begin начало тела главной программы writeln; writeln('<<<Введите N и а >>>'); writeln; readln(N, a); x: =5; while x
5. Цикл с постусловием REPEAT Рассмотренный выше цикл с предусловием устроен так, что про верка условия производится до первой итерации (до первого выпол нения тела цикла). Иногда это не соответствует логике алгоритма. Например, в тех случаях, когда проверка условия актуальна лишь после завершения предыдущего шага. Тогда нам идеально подходит цикл с постусловием REPEAT. Оператор цикла REPEAT организует выполнение цикла, состоя щего из любого числа операторов, с неизвестным заранее числом повторений. Тело цикла выполняется хотя бы один раз. Выход из цикла осуществляется при истинности (!) некоторого логического выражения. Общий вид цикла с постусловием: REPEAT <оператор1>; <оператор2>; . . . <оператор. N>; UNTIL <условие>;
Операторы, записанные между ключевыми словами REPEAT и UN TIL, составляют тело цикла. Так как слова RPEAT и UNTIL являются своеобразными операторными скобками, то точку с запятой перед словом UNTIL ставить не нужно. Тело цикла может быть пустым или содержать один или более операторов. Условие, записанное после ключевого слова UNTIL, проверя ется в конце каждой итерации (после выполнения тела цикла). Ус ловие это логическое значение, переменная или выражение с ло гическим результатом. Но важно обратить внимание, что оно рабо тает здесь не совсем так, как в цикле WHILE. Если в цикле WHILE подразумевается алгоритм "пока условие истинно, выполнять опера торы тела цикла", то цикл REPEAT соответствует алгоритму "выпол нять тело цикла, пока не станет истинным условие". Иными слова ми, если условие является истинным (True), то выполнение цикла завершается. Если условие не выполняется (является ложным Fal se), то вновь выполняется тело цикла. Иллюстрацией к вышесказанному может быть конструкция веч ного цикла: REPEAT UNTIL False; Этот цикл пустой и никогда не прекращающийся. Он хорош только тогда, когда нужно заблокировать программу. Но вообще на совести программиста лежит выбор корректного условия, т. е. такого, кото рое на каком то шаге итерации станет False.
Рассмотрим пример программы с использованием цикла REPEAT. program Function 1; var y, a: real; x, N: integer; begin начало тела главной программы writeln; writeln('<<<Введите N и а >>>'); writeln; readln(N, a); x: =5; repeat y: =a*sqr(x); Writeln(x, y); x: =x+1 until x>N; end.
Пр 2. program MAX_repeat; подключение библиотеки var A, B: integer; begin начало тела главной программы writeln('<<< НАХОЖДЕНИЕ МАКСИМАЛЬНОГО ИЗ ДВУХ ЦЕЛЫХ ЧИСЕЛ>>>'); writeln(' программа закончит работу, если оба числа равны 0'); writeln; repeat начало цикла write('Первое число = ? '); readln(A); write('Второе число = ? '); readln(B); if A=B then writeln('Числа равны') else begin write('Максимальное из двух чисел '); if A>B then writeln(A) else writeln(B) end until (A=0) and (B=0); конец цикла end. Данная программа будет выполняться до тех пор, пока оба введенных числа не станут равны 0. Вообще цикл REPEAT достаточ но часто используется с целью многократного повторения выполне ния программы с различными данными.