Операторы языка PASCAL. Операторы повторений (циклов). Для организации повторяющихся действий или вычислений в алгоритмических языках используют специальные операторы – операторы циклических вычислений, или операторы циклов. В языке PASCAL (и в том числе в версиях TURBOPASCAL) реализованы три варианта операторов циклов: - оператор цикла с предварительной проверкой условия ("ПОКА") - оператор цикла с последующей проверкой условия ("ПОВТОРЯТЬ, ПОКА ЛОЖЬ") - оператор цикла с параметром (счётчиком) ("ДЛЯ КАЖДОГО") С помощью этих операторов можно разрешать практически все варианты организации повторяющихся действий. Кроме того, можно использовать один или более операторов цикла внутри другого (вложенные операторы). Телом цикла называется один или несколько операторов, выполняющихся (повторяющихся) как единый блок. 1)Оператор цикла с предусловием ("ПОКА"). Применяется в тех случаях, когда заранее не известно число повторений, а известно условие для продолжения работы цикла. условие -- + Тело цикла Обобщённая синтаксическая запись: WHILE <условие> DO <оператор> где: <условие> - выражение логического типа (чаще всего - операция сравнения); <оператор> - произвольный оператор PASCALя. Схема работы: Пока <условие> истинно (TRUE), выполняется <оператор>, затем снова проверяется <условие>, и если оно истинно, снова повторяется <оператор>, и так до тех пор, пока не нарушится истинность условия. Примеры записи. Пример 1. k:=1; S:=0; WHILE K<>0 DO { как только с клавиатуры введется 0, работа закончена } BEGIN READ(K); S:=S+1; END; WRITE(S); Пример 2. RTT:=1; WHILE RTT<100 DO RTT:=RTT+2; Примечание. Если "тело цикла" состоит более чем из одного оператора, необходимо применять составной оператор ( BEGIN … END) в качестве тела цикла (см. Пример 1). Задача 1. Написать программу для вычисления факториала числа n!. Пояснение. Факториалом натурального числа N! называется произведение всех предыдущих чисел, включая его само. Например, 5!=1*2*3*4*5=120, то есть 5!=120. PROGRAM fact1; VAR N,I,P:INTEGER; { P:LONGINT } BEGIN WRITELN(' Введи число N'); READ(N); P:=1; I:=0; WHILE I<=N DO BEGIN I:=I+1; P:=P*I END; WRITELN('N!=',P); END. Примечание. Не следует задавать большое N (N<=8) во избежания выхода разрядности результата за границу диапазона базового типа INTEGER. Или можно использовать другой тип данных LONGINT. Задача 2. Написать программу, реализующую алгоритм Евклида для нахождения НОД двух целых чисел. (A B 0). PROGRAM EVKL; VAR A,B,C:INTEGER; BEGIN WRITE(' Введи значения А и В'); READLN(A,B); WHILE B>0 DO BEGIN C:=A MOD B; A:=B; B:=C; END; WRITELN(' НОД=',A); END. Задачи на самостоятельное решение. 3Вычислить сумму значений ряда: а) S=1+3+…+37 б) SUM=1+1/2+1/3+…+1/N 4) Построить таблицу значений функции (табулировать функцию) Y=X2+3 в интервале значений Х от 1 до 9 с шагом ∆Х=0.5. 5)* Подсчитать количество цифр в произвольном натуральном числе. Математические и строковые функции не использовать. 2) Оператор цикла с постусловием ("ПОВТОРЯТЬ, ПОКА ЛОЖЬ"). Применяется в тех случаях, когда неизвестно число повторений цикла, но известно условие для прекращения работы цикла. тело цикла - условие + Обобщённая синтаксическая запись: REPEAT <тело цикла> UNTIL <условие> где: - <тело цикла> - произвольная последовательность операторов PASCALя; - <условие> - выражение логического типа. Схема работы. Операторы <тело цикла> выполняются хотя бы один раз, после чего проверяется <условие>: если его значение есть FALSE, операторы <тело цикла> повторяются, в противном случае оператор REPEAT ... UNTIL завершает свою работу. Примеры записи. Пример 3. REPEAT FTA1:=FTA1+0.73; WRITE(V,' ',FTA1) UNTIL FTA1<36.5; Пример 4. REPEAT read(DDR); Y:=Y+7; UNTIL NOT KEYPRESSED; { бесконечный цикл до нажатия любой клавиши } Примечание. Если "тело цикла" состоит более чем из одного оператора, составной оператор (BEGIN … END) можно не использовать, так как конструкция REPEAT … UNTIL выполняет функции составного оператора. Задача 5. Записать задаваемое натуральное число М (M<1010) в обратном порядке (не используя специальные и строковые функции!). PROGRAM OVERNUM; VAR M,A:LONGINT; BEGIN A:=0; WRITELN(' Введи число M'); READ(M); REPEAT A:=A*10+M mod 10; M:=M div 10 UNTIL M=0; WRITELN('Overnum ',A); END. Задачи на самостоятельное решение. 6. Вычислить сумму модулей и среднее арифметическое значение для нескольких произвольных чисел, введённых с клавиатуры (с точностью до 2-х знаков дробной части). Программа должна остановиться и выдать результат, если введён 0. 7. Найти сумму цифр натурального задаваемого числа N (N<1010). 3) Оператор цикла с параметром (регулярный цикл) ("ДЛЯ КАЖДОГО"). Применяется в тех случаях, когда известно число повторений цикла или параметры (начальные и конечные значения) цикла. заголовок цикла Тело цикла Обобщённая синтаксическая запись: FOR <пц>:=<нз> TO <кз> DO <оператор> где: <пц> - параметр цикла - переменная порядкового типа (чаще всего типа INTEGER); <нз> - начальное значение - выражение того же типа, что и <пц>; <кз> - конечное значение выражение того же типа, что и <пц>; <оператор> - произвольный оператор PASCALя. Схема работы. При выполнении этого оператора цикла вначале вычисляется выражение <нз> и осуществляется присваивание <пц>:=<нз>. После этого циклически повторяется: - проверка условия <пц> <= <кз>; если условие не выполнено, оператор FOR завершает свою работу; - выполнение оператора <оператор>; - наращивание <пц> на единицу (если ТО, то на +1) (если вместо ТО используется конструкция DOWNTO, то значение <пц> уменьшается на -1 и <нз> > <кз>) Примеры записи. Пример 5. FOR I:=1 TO 25 DO WITELN(I,' ',SQR(I),' ',I*I*I); Пример 6. FOR TU:=D1+1 TO D8 DO BEGIN READ(S); A67:=A67+TU+S; END; Задача 8. Написать программу для вычисления факториала числа N! (n<8). PROGRAM FACT3; VAR N,I,P:INTEGER; { P:LONGINT } BEGIN WRITELN(' Введи число N'); READ(N); P:=1; FOR I:=1 TO N DO P:=P*I; WRITELN( 'Факториал N!= ',P ); END. Задачи на самостоятельное решение. 1. Вычислить сумму и среднее арифметическое значение K-произвольных чисел 2. Написать программу, печатающую на экране таблицу умножения (от 1 до 10) произвольного натурального числа (не более 999). 3. Определить сумму всех чисел из первой сотни, кратных числу 3. Вывести список таких чисел на экран в одну строку. 4. Напишите программу, печатающую на экране 20 случайных целых чисел из диапазона 5..500 и подсчитывающую сумму всех нечётных значений из этих чисел. 5. Напишите программу "Угадай число" (от 1 до 100). 6. С помощью while написать программу вывода суммы всех чётных чисел от 12 до 204. 7. Даны натуральные числа a, b. Вычислите их произведение при условии, что в программе возможны лишь операции +, -, =, <>. 8. Вычислить сумму n первых слагаемых бесконечного ряда: 1+1/2+1/3+1/4+...+1/n ВЛОЖЕННЫЕ ЦИКЛЫ. Конструкции вида "цикл в цикле" называют вложенными циклами. Уровень вложенности в PASCALe ограничивается 6-ю уровнями; можно использовать различные операторы циклов. Следует соблюдать условие разноимённости цикловых переменных для вложенных циклов. Внутренние циклы, как правило, "крутятся" быстрее внешних. Динамические циклы.