
Тема 4.3.3. Операторы цикла.ppt
- Количество слайдов: 51
Программирование на языке Паскаль Тема 4. 3. 3. Операторы цикла
Что такое цикл? Давайте отвлечемся на некоторое время от программирования и попытаемся на природных явлениях, примерах из повседневной жизни человека, а затем и его мыслительной деятельности дать понятие цикла. Если вас спросят, что такое цикл, то, наверное, вы не задумываясь ответите, что это повторяемость чего-то. И это совершенно правильно! Повторяемость времен года в природе - это цикл, кругооборот воды в природе это цикл, смена дня и ночи - это цикл и многие другие процессы в природе повторяются, образуя циклы или, что чаще нами употребляется, цикличность. Циклы в математике - явление очень часто встречающееся. Например, пока натуральные числа меньше 10, тогда надо суммировать их. Другими словами, мы находим сумму чисел от 1 до 10. В этом примере повторяется сложение натуральных чисел, пока выполняется условие (числа меньше 10). Такие циклы называются циклами с предыдущим условием или, коротко, с предусловием, потому что условие записывается перед выполнением повторяющейся группы операторов. Цикл в программировании - это многократно выполняемая группа команд, часть программы.
Сразу заметим, что в программе может быть такая ситуация, когда цикл вообще не выполняться ни разу. На языке Паскаль возможны циклы с предусловием, которые организуются с помощью оператора: while (пока). . . do (выполнять). . . Формат оператора: while <условие> do <операция>. Работа оператора заключается в том, что операция выполняется до тех пор, пока будет выполняться условие, указанное в операторе while. Если операция содержит не один оператор, а несколько, то их объединяют с помощью ОПЕРАТОРНЫХ СКОБОК begin и end, например; while <условие> do begin S 1; S 2; S 3; . . . end; В этом примере символами s 1, s 2, s 3, . . . обозначены операторы. Действие цикла while. . . do. . . можно изобразить графически следующей схемой
Программа Program Problem 1; {Опред. и вывод на экран цифр числа. } uses Win. Crt; var n, p, i : integer; begin write('Введите натуральное число n <= 32767 '); readln(n); i : = 1; while n <> 0 do begin p : = n mod 10; writeln(i, ' - я цифра справа равна ', p); n : = n div 10; i : = i + 1 end.
Программа Program Problem 2; { Перест. первой и последней цифр числа } uses Win. Crt; var n, n 1, p, a, i : integer; begin write('Введите натуральное число n '); readln(n); a : = n; i : = 1; p : = n mod 10; {последняя цифра введенного числа} while n >= 10 do begin i : = i*10; n : = n div 10; end; n 1 : = a - n*i - p + n + p*i; writeln('Число после перестановки цифр ', n 1); end.
Цикл воплощает всю мощь компьютера, способного без устали совершать огромное количество одних и тех же действий. Оператор цикла полностью соответствует алгоритму «цикл» и имеет следующий вид: while <выражение> do <оператор>; Здесь <выражение> — логическое выражение, <оператор> — оператор, выполняющийся, пока <выражение> истинно. Слово «while» по-английски означает «пока» , «do» — делать. Зацикливание — семантическая ошибка, при которой внутри цикла изменение значений переменных никогда не приводит <выражение> к ложному значению. Найдем факториал заданного числа (n! = 1 ⋅ 2 ⋅ 3 ⋅ … ⋅ n). {Вычисление факториала числа} {i - переменная цикла, m - умножитель} var n, i, m : integer; begin n : = 7; i : = 0; m : = 1; while (i < n) do begin i : = i+1; m : = m*i; end; writeln (n, '! = ', m); end.
Циклы Цикл – это многократное выполнение одинаковой последовательности действий. • цикл с известным числом шагов • цикл с неизвестным числом шагов (цикл с условием) Задача. Вывести на экран квадраты и кубы целых чисел от 1 до 8 (от a до b). Особенность: одинаковые действия выполняются 8 раз. 7
8 Алгоритм начало задать начальное значение переменной цикла i : = 1; проверить, все ли сделали i <= 8? да i 2 : = i * i; i 3 : = i 2 * i; нет конец вычисляем квадрат и куб вывод результата i, i 2, i 3 i : = i + 1; перейти к следующему i
Алгоритм (с блоком «цикл» ) начало i : = 1, 8 i 2 : = i * i; i 3 : = i 2 * i; i, i 2, i 3 блок «цикл» конец тело цикла 9
10 Программа program qq; var i, i 2, i 3: integer; begin начальное значение переменная цикла конечное значение for i: =1 to 8 do begin i 2 : = i*i; i 3 : = i 2*i; writeln(i: 4, i 2: 4, i 3: 4); end.
Оператор цикла с предварительным условием При решении многих задач вычислительный процесс имеет циклический характер Это означает, что часть операторов многократно выполняется при разных значениях переменных. В языке ПАСКАЛЬ имеется три вида операторов цикла : 1. Оператор с предварительным условием (предусловие); 2. Оператор с последующим условием (постусловие); 3. Оператор цикла с параметром. Операторы для записи циклов являются сложными, так как в их состав входят другие операторы. Для всех операторов цикла характерна следующая особенность. Повторяющиеся вычисления записываются всего один раз. Вход в цикл возможен только через его начало. Переменные оператора цикла должны быть определены до входа в циклическую часть. Необходимо предусмотреть выход из цикла: или по естественному его окончанию, или по оператору перехода. Если этого не предусмотреть, то циклические вычисления будут повторяться бесконечно. В этом случае говорят что произошло “зацикливание” программы.
Оператор цикла с предварительным условием Цикл с предварительным условием (с предусловием) используется, как правило, в тех случаях, когда заранее известно число повторений цикла. Форма записи цикла с пред условием: WHILE логическое выражение DO BEGIN операторы циклической части программы END; Здесь WHILE ( пока ) и DO (выполнить) --- служебные слова. Оператор цикла действует следующим образом. Предварительно прверяется значение логического выражения. Пока оно истинно выполняются, операторы циклической части. Как только оно становится ложным, происходит выход из цикла. Если с самого начала значение логического выражения ложно, то операторы циклической части не выполняются ни разу. Возможен случай, когда в циклической части стоит оператор перехода, передающий управление за пределы цикла. В такой ситуации цикл может завершится до его естественного окончания.
Оператор цикла с предварительным условием Если в циклической части стоит всего один оператор, то операторные скобки BEGIN ---END можно не указывать, и оператор цикла принимает вид WHILE логическое выражение DO оператор Рассмотрим фрагмент программы с использованием оператора цикла с предусловием : A: =1 ; N: =1 ; WHILE 2*A < = 3* N +1 DO BEGIN A: =A+2 ; N: =N+1 ; END; Пока условие 2 a<=3 n+1 является истинным, выполняются операторы циклической части. Переменные А и N, а также логическое выражение принимают следующие значения в процессе выполнения этой части программы: A N 2 A<=3 N+1 1 1 2<=4 Истинно 3 2 6<=7 Истинно 5 3 10<=10 Истинно 7 4 14<=13 Ложно При A=7 и N=4 логическое выражение становится ложным и управление передается за пределы цикла (т. е. за END).
Общая форма записи следующая while <булево выражение> do begin группа операторов end; На русском языке это звучит примерно так: пока выполняется это условие делай от начала группа операторов до конца; При использовании цикла с предусловием надо помнить следующее: 1) значение условия выполнения цикла должно быть определено до начала цикла; 2) если значение условия истинно, то выполняется тело цикла, после чего повторяется проверка условия. Если условие ложно, то происходит выход из цикла; 3) хотя бы один из операторов, входящих в тело цикла, должен влиять на значение условия выполнения цикла, иначе цикл будет повторяться бесконечное число раз.
Возьмем для примера задачу: найти сумму некоторого количества чисел, задаваемых пользователем. Исходными данными в этом случае являются переменная N - количество чисел и сами эти числа. Значение очередного числа обозначим переменной Х. Результатом работы алгоритма станет сумма этих чисел, которую обозначим переменной S. S=x 1+x 2+x 3+. . . +xn Допустимые значения переменной N должны удовлетворять условию n>0, так количество слагаемых не может быть числом отрицательным. Как же мы должны решать эту задачу? Сначала нужно запросить, сколько чисел нужно будет сложить и считать это число в переменную N. Затем нужно так организовать операторы, чтобы программа запрашивала очередное число и каждый раз складывала его с предыдущими; и повторяла эту группу операторов N раз. При вычислении суммы используем следующий прием: вначале, когда еще не задано ни одно слагаемое, сумму полагают равной нулю (S: =0), а затем, получая очередное слагаемое, прибавляют его к сумме (S: =S+x) (см. программу ниже). Очень важное значение в операторе цикла имеет так называемая переменная цикла. В нашей программе она называется i. С ее помощью мы обращаемся к пользователю за очередным числом (write (‘Введите ‘, i, ’-ое число ’)) и считаем количество уже введенных чисел (i: =i+1), чтобы не запросить лишнее. Одновременно переменная цикла участвует в булевом выражении (i<=N).
Рассмотрите внимательно программу, решающую нашу задачу. Program Summa; Uses Crt; Var i, N : integer; x, S : real; Begin Clr. Scr; write (‘Сколько чисел для сложения? ‘); readln (N); S: =0; i: =1; while i<=N do begin write (‘Введите ‘, i, ’-е число ’); readln (x); S: =S+x; i: =i+1; end; write (‘Сумма введенных чисел равна ‘, s: 5: 2); readln; End.
Оператор цикла с последующим условием Цикл с последующим условием, как правило, используется в тех случаях, ког да заранее не известно число повторений цикла. Оператор цикла имеет вид : REPEAT операторы циклической части программы ; UNTIL логическое выражение ; Здесь REPEAT (повторить) и UNTIL (до тех пор пока) -- служебные слова. Оператор цикла с последующим условием действует следующим образом. Операторы циклической части выполняются повторно ( по крайней мере один раз ) до тех пор, пока значение логического выражения ложно. Условием прекращения циклических вычислений является истинное значение логического выражения. Итак, сначала выполняется циклическая часть, а затем проверяется условие. Обратите внимание, что эти действия прямо противоположны действиям оператора цикла с предварительным условием, где сначала проверяется условие, а затем выполняются операторы циклической части. Следует подчеркнуть, что нижняя граница операторов циклической части четко обозначена словом UNTIL, поэтому нет надобности заключать операторы циклической части в скобки вида BEGIN --- END. В то же время и дополнительное наличие скобок не является ошибкой.
Оператор цикла с последующим условием repeat. Если в циклической части встречается оператор перехода, указывающий на метку за пределами цикла, то цикл может завершиться до его естественного окончания. Пример: Вычислить значение функции Y=X*X при X=8, 6, 4, 2. Фрагмент программы имеет вид: X: =8; REPEAT Y: =X*X; WRITELN(X: 3, Y: 5); X: =X-2; UNTIL X<0 Здесь сначала задается первое значение аргумента X=8. Внутри циклической части выполняются следующие действия: вычисляется значение Y при текущем значении X; выводится на экран дисплея значение и X и Y; вычисляется новое значение аргумента X путем вычитания числа 2 из предыдущего значения X. Циклическоя частьб программы повторяется до тех пор, пока выражение X<2 не станет истинным. В процессе выполнения этой цасти программы переменные принимают следующие значения: X 8 6 4 2 0 Y 64 36 16 4 _ Выражение X<2 истинно или ложно False TRUE
Иногда при решении задач возникает необходимость выполнить тело цикла хотя бы один раз, а потом исследовать условие повторять ли его еще раз. Эту задачу выполнит другой вид цикла Repeat. repeat повторяй операторы until <условие>; до тех пор, пока условие не будет верным Есть небольшое отличие в организации цикла repeat по сравнению с while: для выполнения в цикле repeat нескольких операторов не следует помещать эти операторы в операторные скобки begin. . . end. Зарезервированные слова repeat и until действуют как операторные скобки. Конструкция repeat. . . until работает аналогично циклу while. Различие заключается в том, что цикл while проверяет условие до выполнения действий, в то время как repeat проверяет условие после выполнения действий. это гарантирует хотя бы одно выполнение действий до завершения цикла. Например, a) repeat b) repeat read (Number); i : = i+1; Sum : = Sum+Number; writeln (Sqr(i)) until Number=-1
Задача. Определить, является ли введенное число простым. Алгоритм решения этой задачи будет следующий. При помощи операции mod проводим проверку всех целых чисел от 2 до введенного числа Number. Мы проверяем является ли очередное проверяемое число делителем нашего числа (значит, остаток от деления введенного числа на проверяемое число равен нулю). Если такой делитель найден, значит, цикл досрочно завершает свою работу на некотором i-том шаге. Если делитель не найден, значит цикл проверил все числа и значение переменной цикла i будет равно конечному значению, т. е. Number. Поэтому, после записи цикла следует анализ значения переменной i и выводится соответствующее сообщение. Примечание. Напомним, что простым называется число, которое не имеет делителей кроме 1 и самого себя. Цикл не может продолжаться бесконечно, так как любое число всегда делится само на себя.
Program Prostoe; Uses Crt; Var i, {возможный делитель} Number : integer; {исследуемое число} Begin Clr. Scr; writeln (‘Какое число должно быть проверено? ‘); read (Number); i : = 1; repeat i : = i+1; until Number mod i = 0; if Number=i then writeln (Number, ’ является простым‘) else writeln (Number, ’ делится на ‘, i); readln; End. При построении циклов нужно быть очень аккуратным: следить за отсутствием ошибок как в фазе входа в цикл, так и в фазе завершения цикла.
Оператор цикла с параметром используется в тех случаях, когда заранее известно, сколько раз должна повторится циклическая часть программы. Оператор цикла имеет вид: FOR i: =m 1 TO m 2 DO BEGIN операторы циклической части программы END Здесь FOR (для), TO(до), DO (выполнить) - служебные слова; i - параметр цикла; m 1, m 2 - начальное и конечное значение параметра цикла. Циклическая часть программы выполняется повторно для каждого значения параметра цикла i от его начального значения m 1 до конечного значения m 2 включительно. В качестве параметра цикла может быть только переменная, в качестве m 1 и m 2 могут быть выражения, за исключением действительного типа (REAL); Чаще всего параметр цикл i используют как переменную целого типа, а шаг его изменения равен +1 или -1. Если значение параметра увеличивается, то шаг его изменения +1. Если значение параметра цикла уменьшается, то шаг его изменения -1 и в операторе цикла FOR вместо служебного слова TO записывается служебное слово DOWNTO.
Оператор цикла с параметром Рассмотрим использование оператора цикла с параметром: Пример: Пусть имеется фрагмент программы с переменными целого типа. FOR I: =1 TO 5 DO BEGIN A: =2*I; B: =2*I+1; WRITELN(A: 3, B: 3) END Циклическая часть программы выполняется повторно пять раз, при этом параметр цикла i изменяет свое значение от 1 до 5. В результате выполнения программы переменная получает следующие значения: I ………………. . 1 A ………………. . 2 B ………………. . 3 2 4 5 3 6 7 4 8 9 5 10 11
Оператор цикла с параметром Фрагмент программы с убыванием значений параметра цикла от 5 до 1 имеет вид: FOR I: =1 DOWNTO 1 DO BEGIN A: =2*I; B: =2*I+1; WRITELN(A: 3, B: 3) END; В процессе выполнения программы переменные принимают следующие значения: I ……………. 5 4 3 2 1 A ……………. 10 8 6 4 2 B ……………. . 11 9 7 5 3
Оператор цикла с параметром Если циклическая часть содержит только один оператор, то операторные скобки BEGIN - END можно не указывать. В этом случае цикл с параметром записывают в следующем виде: FOR I: =m 1 или TO m 2 DO оператор; FOR I: =m 1 TO m 2 DO оператор; Параметр цикла i не должен переопределяться внутри циклической части. Если шаг изменения параметра цикла равен +1 и m 1 > m 2, то циклическая часть не выполниться ни разу. После естественного завершения цикла значение параметра цикла не определено. Это означает, что при последнем выполнении циклической части значение i =m 2, а после ухода за пределы цикла значение i теряется.
Оператор цикла с параметром Пример: Напечатать все буквы латинского алфавита. Так как буквы латинского алфавита упорядочены, то можно составить программу, где используется цикл с параметрами символьного типа: PROGRAM Pr 9; Var sim: char; BEGIN writeln(‘Латинский алфавит’); For sim: =‘A’ TO ‘Z’ DO WRITE(‘ ‘, sim) END. Результат выполнения программы: Латинский алфавит ABCDEFGHIJKLMNOPQRSTUVWXYZ
Вложенные циклы Циклы могут быть вложены один в другой. При использовании вложенных циклов необходимо составлять программу таким образом, чтобы внутренний цикл полностью укладывался в циклическую часть внешнего цикла. Рассмотрим на примере структуру вложенных циклов. Пример: Вычислить значение переменной Y=2 K+N при всех значениях переменных N=1, 2, 3 и K=2, 4, 6, 8. Обратите внимание на то, что если перебирать все значения N и K получим 12 значений Y. Составить программу можно следующим образом: N - параметр внешнего цикла, K - параметр внутреннего цикла. Тогда при одном значении N переменная K будет принимать значения 2, 4, 6, 8. Предполагается, что все переменные N, K, Y целого типа. Фрагмент циклической части программы имеет вид:
Вложенные циклы PROGRAM PR; VAR N, K, Y: INTEGER; BEGIN FOR N: =1 TO 3 DO BEGIN K: =2; WHILE K<=8 DO BEGIN Y: =2*K+N; WRITELN (N: 4, Y: 4); K: =K+2 END END. Здесь внешний цикл организован с использованием оператора FOR, а внутренний - с использованием оператора WHILE. В процессе выполнения вложенных циклов переменные получат следующие значения: N ………… 1 1 2 2 3 3 K ………… 2 4 6 8 Y ………… 5 9 13 17 6 10 14 18 7 11 15 19
Программирование циклических вычислительных процессов Пример: Даны действительные числа. Вычислить их среднее арифметическое. { среднеарифметическое} Pujgram CA; var i: integer; { параметр цикла} n: integer; { количество чисел} s : real; { вводимое число} t: real; { среднее арифметическое} begin t: =0; writeln(‘введите количество чисел’); read(n); for i: =1 to n do begin write(‘введите число ‘); read(s); t: =t+s; end; t: =t/n; writeln(‘---------------------’); writeln(‘среднее арифметическое=’, t: 5: 2); end. Результат выполнения программы: введите количество чисел 6 введите число 8 введите число 7 введите число 9 ----------------------среднее арифметическое = 7. 50
Программирование циклических вычислительных процессов Пример: Вычислить объем каждого из нескольких шаров, а затем найти их суммарный объем. Известно, что радиус первого шара - R, радиус каждого последующего шара больше предыдущего на величину DR; радиус последнего шара - RK. Объем шара обозначим V, суммарный объем - VM. Program e 10 ; const pi=3. 14; Результат выполнения программы: var r, rk: real; (* радиус *); введите начальное значение радиуса r : v, vm: real; (* объём *); 0. 2 dr: real; (* изменение радиуса *); begin введите конечное значение радиуса rk : writeln( ‘ введите начальное значение радиуса r : ‘ ); 1. 8 read(R); введите шаг изменения радиуса dr : writeln( ‘ введите конечное значение радиуса rk : ‘ ); read(rk); 0. 4 writeln( ‘ введите шаг изменения радиуса dr : ‘) r= 0. 20 v= 0. 033 read(dr); vm: =0; r= 0. 60 v= 0. 904 while r<= rk do r= 1. 00 v= 4. 187 begin v: =4*pi*r*r*r/3; r= 1. 40 v= 11. 488 vm: =vm+v; r= 1. 80 v 24. 417 writeln(‘ r=‘ , r: 6: 2, ‘ ‘ : 5, ‘ v=‘ , v: 7: 3); *************** r: =r+dr; end; общий объем VM= 41. 029 Writeln (‘ ************** ’); Writeln(‘ общий объем VM=‘, VM: 8: 3) end.
Программирование циклических вычислительных процессов Пример: Дан произвольный текст. Признаком конца текста считается нажатие клавиши Enter. Подсчитать общее количество введенных символов текста и число букв Т в тексте. Пояснение: так как заранее не известно, сколько раз будет выполняться цикл, для его организации используется оператор WHILE. Условием окончания цикла является проверка конца строки. Пока не обнаружен конец строки (NOT EOLN), цикл продолжает выполняться. program e 3 ; var buck: char; k, n : integer; begin k: =0; n: =0; writeln(‘Введите текст’); while not eoln do begin read(buk); n: =n+1; if buk=‘T’ then k: =k+1; end; writeln(‘Количество символов в тексте = ’, n: 3); writeln(‘Число буквы Т в тексте =’, k: 3) end. Результат выполнения программы: Введите текст PTSPTWETPOGZPRTLO Количество символов в тексте = 17 Число букв Т в тексте = 4
Программирование циклических вычислительных процессов Пример: Составить программу, результатом выполнения которой является таблица значений градусов температуры по Цельсию и Фаренгейту. Результат: Program pr; по цельсию по фаренгейту const 0 32. 0 1 33. 8 const 1=1. 8; ( * множитель перевода * ) 2 35. 6 const 2=32. 0; ( * слагаемое перевода *) 3 37. 4 4 39. 2 var 5 41. 0 centemp: integer; ( * температура по цельсию *) 6 42. 8 fartemp: real; ( * температура по фаренгейту *) 7 44. 6 8 46. 4 begin 9 48. 2 writeln( ‘ по цельсию по фаренгейту ‘); 10 50. 0 11 51. 8 for centemp: =0 to 20 do 12 53. 6 begin 13 55. 4 fartemp: =centemp*const 1+const 2; 14 57. 2 15 59. 0 writeln(centemp: 3, ‘ ‘: 8, ‘*’, ‘ ‘, fartemp: 6: 1); 16 60. 8 end; 17 62. 6 18 64. 4 end. 19 20 66. 2 68. 0
Программирование циклических вычислительных процессов Пример: В последовательности целых чисел подсчитать количество четных и нечетных чисел. Для определения четности воспользуемся стандартной функцией ODD. Если число не делится на 2, то результат этой функции - истинный; иначе - ложный. Организуем цикл с помощью оператора WHILE , в который введем стандартную функцию EOLN: цикл выполняется до тех пор, пока в вводимой строке чисел не встретится символ конца строки Enter. Program e 4; Результата выполнения var программы: kn, kc, x: integer; Вводите числа 5 begin 7 kc: =0; kn: =0; 33 writeln(‘Вводите числа ’); 16 while not eoln do 13 begin 4 read(x); 10 if odd(x) then kn: =kn+1 71 else kc: =kc+1; end; writeln(‘результат : ‘); writeln(‘ Количество четных чисел’, kc: 4); writeln(‘Количество нечетных чисел ‘, kn: 4); end. 9 Результат: Количество четных чисел 3 Количество нечетных чисел 6 EXIT
Цикл со счетчиком. Циклы со счетчиком составляют такой класс, в которых выполнение исполнительной части должно повторяться заранее определенное число раз. Циклы со счетчиком используются довольно часто, и поэтому в языке Паскаль для этих целей имеется специальная конструкция. Можно, конечно, циклы со счетчиком моделировать при помощи операторов while и Repeat, но структура цикла со счетчиком проще. Общая форма записи цикла со счетчиком for i : = A to B do for i : = A downto B do begin. . . end; Здесь переменная i - управляющая переменная или переменная цикла, А - начальное значение переменной цикла, В - конечное значение переменной цикла. При переходе к обработке оператора цикла for управляющей переменной присваивается заданное начальное значение. Затем в цикле выполняется исполнительный оператор (или составной оператор). каждый раз при выполнении исполнительного оператора управляющая переменная увеличивается на 1 (для for. . . to) или уменьшается на 1 (для for. . . downto). Цикл завершается при достижении управляющей переменной своего конечного значения.
При использовании цикла for компьютер выполняет за программиста черновую работу по инициализации управляющей переменной и по ее увеличению (уменьшению) при каждом повторении цикла. Единственное ограничение заключается в том, что тип управляющей переменной не должен быть real. Переменная цикла не должна изменяться какими-либо операторами внутри цикла. К ней можно обращаться и использовать в вычислениях, но нельзя присваивать новое значение. Присваивания могут выполняться только механизмом самого цикла. Таким образом, следующий цикл является некорректным: for i : = 1 to 10 do begin. . . i : = i-1; . . . end;
Цикл с уменьшением переменной Задача. Вывести на экран квадраты и кубы целых чисел от 8 до 1 (в обратном порядке). Особенность: переменная цикла должна уменьшаться. Решение: for i: =8 downto 1 do begin i 2 : = i*i; i 3 : = i 2*i; writeln(i: 4, i 2: 4, i 3: 4); end; 36
Цикл с переменной Увеличение переменной на 1: for <переменная> : = <начальное значение> to <конечное значение> do begin {тело цикла} end; Уменьшение переменной на 1: for <переменная> : = <начальное значение> downto <конечное значение> do begin {тело цикла} end; 37
Цикл с переменной Особенности: • переменная цикла может быть только целой (integer) • шаг изменения переменной цикла всегда равен 1 (to) или -1 (downto) • если в теле цикла только один оператор, слова begin и end можно не писать: for i: =1 to 8 do writeln('Привет'); • если конечное значение меньше начального, цикл (to) не выполняется ни разу (проверка условия в начале цикла, цикл с предусловием) 38
Цикл с переменной Особенности: • в теле цикла не разрешается изменять переменную цикла (почему? ) • при изменении начального и конечного значения внутри цикла количество шагов не изменится: n : = 8; for i: =1 to n do begin writeln('Привет'); нет n : = n + 1; зацикливания end; 39
40 Цикл с переменной Особенности: • после выполнения цикла во многих системах устанавливается первое значение переменной цикла, при котором нарушено условие: for i: =1 to 8 do writeln('Привет'); writeln('i=', i); for i: =8 downto 1 do writeln('Привет'); writeln('i=', i); i=9 i=0
41 Сколько раз выполняется цикл? a : = 1; for i: =1 to 3 do a : = a+1; a= 4 a : = 1; for i: =3 to 1 do a : = a+1; a= 1 a : = 1; for i: =1 downto 3 do a : = a+1; a= 1 a : = 1; for i: =3 downto 1 do a : = a+1; a= 4
42 Как изменить шаг? Задача. Вывести на экран квадраты и кубы нечётных целых чисел от 1 до 9. Особенность: переменная цикла должна увеличиваться на 2. Проблема: в Паскале шаг может быть 1 или -1. Решение: выполняется for i: =1 to 9 do begin только для if i mod 2 = 1 then begin ? ? ? нечетных i i 2 : = i*i; i 3 : = i 2*i; writeln(i: 4, i 2: 4, i 3: 4); end; ? Что плохо?
Как изменить шаг? – II Идея: Надо вывести всего 5 чисел, переменная k изменяется от 1 до 5. Начальное значение i равно 1, с каждым шагом цикла i увеличивается на 2. Решение: i : = ? ? ? 1; for k: =1 to 5 do begin i 2 : = i*i; i 3 : = i 2*i; writeln(i: 4, i 2: 4, i 3: 4); ? ? ? i + 2; i : = end; 43
44 Как изменить шаг? – III Идея: Надо вывести всего 5 чисел, переменная k изменяется от 1 до 5. Зная k, надо рассчитать i. k 1 2 3 4 5 i 1 3 5 7 9 Решение: for k: =1 to 5 do begin i ? ? ? 2*k – 1; : = i 2 : = i*i; i 3 : = i 2*i; writeln(i: 4, i 2: 4, i 3: 4); end; i = 2 k-1
45 Циклы с условием
Цикл с неизвестным числом шагов Пример: Отпилить полено от бревна. Сколько раз надо сделать движения пилой? Задача: Ввести целое число (<2000000) и определить число цифр в нем. Идея решения: Отсекаем последовательно последнюю цифру, увеличиваем счетчик. n count 123 0 12 1 1 2 0 3 Проблема: Неизвестно, сколько шагов надо сделать. Решение: Надо остановиться, когда n = 0, т. е. надо делать «пока n <> 0» . 46
47 Алгоритм начало обнулить счетчик цифр ввод n count : = 0; выполнять «пока n <> 0» n <> 0? нет да count : = count + 1; n : = n div 10; count конец
48 Программа program qq; , n 1: integer; var n, count: integer; begin writeln('Введите целое число'); read(n); n 1 : = n; выполнять count : = 0; «пока n <> 0» while n <> 0 do begin count : = count 1; count : = count + +1; : = div 10; n n: = n ndiv 10; end; writeln('В числе ', n 1, ' нашли ', n, count, ' цифр'); end. Что плохо? ?
Цикл с условием while <условие> do begin {тело цикла} end; Особенности: • можно использовать сложные условия: while (a
Цикл с условием Особенности: • условие пересчитывается каждый раз при входе в цикл • если условие на входе в цикл ложно, цикл не выполняется ни разу a : = 4; b : = 6; while a > b do a : = a – b; • если условие никогда не станет ложным, программа зацикливается a : = 4; b : = 6; while a < b do d : = a + b; 50
Различия между циклом - while и циклом - repeat 1. Оператор, находящийся в цикле while, повторяется до тех пор, пока условие удовлетворено (т. е. истинно). Последовательность операторов, находящихся в цикле repeat, повторяется до тех пор, пока условие не удовлетворено (т. е. ложно). Следовательно, в цикле while используется условие продолжения цикла, а в цикле repeat - условие окончания цикла. 2. В цикле while повторяется один оператор (несколько операторов надо объединять в составной оператор с помощью операторных скобок begin. . . end), а в цикле repeat можно повторять несколько операторов без операторных скобок. 3. В цикле while сначала проверяется условие, а после этого в зависимости от значения условия выполняется или не выполняется оператор или группа операторов после слова do. В цикле repeat последовательность операторов выполняется один раз, а после этого проверяется условие, т. е. эта последовательность всегда выполняется хотя бы один раз, а в цикле while операторы, составляющие тело цикла могут вообще не выполняться ни одного раза.