ОПЕРАТОРЫ ПОВТОРА Если в программе возникает необходимость неоднократно выполнять некоторые операторы, то используются операторы повтора (цикла). В языке Паскаль различают три вида операторов цикла: while, repeat, for. Они используются для организации циклов разных типов. Выражение, управляющее повторениями, должно иметь булевский тип. Если число повторений оператора (составного оператора) заранее неизвестно, а задано лишь условие его повторения (или окончания), используются операторы while, repeat. Оператор for используется, если число повторений заранее известно. Оператор WHILE. Оператор while (пока) часто называют оператором цикла с предусловием за то, что проверка условия выполнения тела цикла производится в самом начале оператора. Формат записи: While <условие продолжения повторений> do <тело цикла>; Условие продолжения повторений – булевское выражение, тело цикла – простой или составной оператор. Перед каждым выполнением тела цикла вычисляется значение выражения – условия. Если результат равен True, тело цикла выполняется и снова вычисляется выражение условия. Если результат равен False, происходит выход из цикла и переход к первому после While оператору. Пример работы While: найти сумму 10 введенных с клавиатуры чисел. Program DemoWhile; Var C:integer; I, Sum: real; Begin C:=1; Sum:=0; While (C<=10) do {Условие выполнения цикла} Begin Write (’Введите ’,С,’-е число: ’);readln(I); {Ввод числа} Sum:=Sum+I; C:=C+1; End; Writeln(’Сумма равна ’, Sum:5:2); End. 1 Оператор REPEAT. Оператор повтора repeat аналогичен оператору while, но отличается от него, во-первых, тем, что условие проверяется после очередного выполнения операторов цикла и, таким образом, гарантируется хотя бы однократное выполнение цикла, а во-вторых, тем, что критерием прекращения цикла является равенство константе True. Также в операторе Repeat нет необходимости в операторных скобках. Формат записи: Repeat <оператор;> … <оператор;> Until <условие окончания цикла>; Операторы, заключенные между словами repeat и until, являются телом цикла. Вначале выполняется тело цикла, затем проверяется условие выхода из цикла. Именно поэтому цикл, организованный с помощью Repeat, в любом случае выполняется хотя бы один раз. Если результат булевского выражения равен False, то тело цикла активизируется еще раз; если результат равен True, то происходит выход. При программировании операторов тела цикла следует обеспечить их влияние на значение условия, иначе цикл будет выполняться бесконечно. Пример работы цикла Repeat: вывести на экран фразу и приостановить работу, когда будет нажата клавиша ввода. Program DemoRepeat; Uses crt; Var F:char; Begin writeln(’для продолжения нажмите клавишу ввода’); Repeat {Повторять} {Начало тела цикла} F:=readkey; Until F=#13; {Условие окончания цикла} End. Оператор For. В случаях, когда число повторений может быть заранее известно, для организации цикла применяется оператор For. Часто этот оператор называют оператором цикла с параметром, т.к. число повторений задается переменной, называемой параметром цикла или управляющей переменной. Оператор повтора состоит из заголовка и тела цикла. Два формата записи: For <параметр цикла>: =<S1> to <S2> do <оператор>; For <параметр цикла>: =<S1> downto <S2> do <оператор>; где S1 и S2 – выражения, определяющие начальное и конечное значение параметра цикла. For… do – заголовок цикла; <оператор> - тело цикла. Тело цикла может быть простым или составным оператором. 2 Оператор For обеспечивает выполнение тела цикла до тех пор, пока не будут перебраны все значения параметра цикла от начального до конечного. Заголовок цикла For определяет: Диапазон изменения управляющей переменной и одновременно число повторений оператора, содержащегося в теле цикла; Направление изменения значения параметра цикла (возрастание – to, убывание – downto). При первом обращении вначале вычисляется выражения S1, S2 и осуществляется присваивание <параметр цикла>:=S1. После этого циклически повторяются следующие действия: 1. Проверяется условие <параметр цикла> <=S2. 2. Если условие выполнено, то цикл For продолжает работу (выполняется оператор в теле цикла), если условие <параметр цикла> <=S2 не выполнено, то цикл завершает работу, и управление передается на оператор, следующий за циклом. 3. Значение управляющей переменной изменяется на +1(to) или –1(downto). На использование управляющей переменной (параметра цикла) в цикле For налагаются следующие ограничения: 1. В качестве параметра должна использоваться простая переменная, описанная в текущем блоке. 2. Управляющая переменная должна иметь дискретный тип. 3. Начальные и конечные значения диапазона должны иметь тип, совместимый с типом управляющей переменной. При этом допустим любой скалярный тип, кроме вещественного. 4. В теле цикла запрещается явное изменение значения управляющей переменной (например, оператором присвоения). 5. После завершения оператора значение управляющей переменной становится неопределенным, если только выполнение оператора не было прервано оператором перехода. Пример действия оператора For: вывести на экран таблицу перевода из градусов Цельсия (С) в градусы по Фаренгейту (F) для значений от 15 С до 30 С с шагом в 1 градус. Перевод осуществляется по формуле: F=C*1.8+32. Program DemoFor; Var I: integer; F: real; Begin Writeln (‘ Температура ’); For I:=15 to 30 do {Заголовок цикла} Begin {Начало тела цикла } F:=I*1.8+32; Writeln (‘По Цельсию= ’,I,’ по Фаренгейту=’,F:5:2); End; {Конец тела цикла} End. 3 Задачи 1. Напечатать ряд чисел 20 в виде: 20 20 20 20 20 20 20 20 20 20. 2. Составить программу вывода любого числа (вводится с клавиатуры), любое заданное число раз (вводится с клавиатуры) в виде, аналогичном показанному в предыдущей задаче. 3. Напечатать “столбиком”: а) все целые числа от 20 до 35; б) квадраты всех целых чисел от 10 до B (значение В вводится с клавиатуры; В 10); в) третьи степени всех целых чисел от А до 50 (значение А вводится с клавиатуры; А 50); г) все целые числа от А до В (значение А и В вводятся с клавиатуры; В А). 4. Напечатать числа следующим образом: а) 10 10.4 б) 25 25.5 24.8 11 11.4 26 26.5 25.8 … … 25 25.4 35 35.5 34.8 5. Напечатать числа следующим образом: а) 21 20.4 б) 16 15.5 16.8 22 21.4 17 16.5 17.8 … … 35 34.4 24 23.5 24.8 6. Одна штука некоторого товара стоит 20,4 руб. Напечатать таблицу стоимости 2, 3, …, 20 штук этого товара. 7. Напечатать таблицу перевода расстояний в дюймах в сантиметры для значений 10, 11, …, 12 дюйма (1 дюйм = 25.4 мм) 8. Напечатать таблицу перевода 1, 2, …, 20 долларов США в рубли по текущему курсу (значение курса вводится с клавиатуры). 9. Составить таблицу умножения на 7. 10. Составить таблицу умножения на число n (значение числа n вводится с клавиатуры; 1 n 9). 11. Среди двузначных чисел найти те, сумма квадратов цифр которых делится на 13. 12. Написать программу поиска двузначных чисел, таких, что если к сумме цифр этого числа прибавить квадрат этой суммы, то получится это число. 13. Дано натуральное число n. Получить все его натуральные делители. 14. Дано натуральное число n (n9999). Определить, является ли оно палиндромом («перевертышем»), с учетом четырех цифр. Например, палиндромами являются числа: 2222, 6116, 0440. 15. Натуральное число из n цифр является числом Армстронга, если сумма его цифр, возведенная в n-ю степень, равна самому числу (например, 153=13+53+33). Получить все числа Армстронга, состоящие из трех и четырех цифр. 4 16. 1. 2. 3. 4. 5. 6. Для приведенного фрагмента программы ответьте на вопросы: а) Сколько операторов образуют тело цикла. б) Какая переменная является управляющей переменной цикла. с) Что будет выведено на экран при выполнении фрагмента программы. k:=1; for m:=2 to 6 do begin k:=k*m; writeln(m,’ ’,k); end; for h:=1 to 7 do writeln(h,’ ’,h*h); s:=0; for i:=1 to 7 do begin s:=s+i; writeln(i,’ ’,s); end; for n:=1 to 8 do begin p:=7*n; writeln(n,’ ’,p); end; for p:=0 to 8 do writeln(p,’ ’,p*p); t:=1; for x:=1 to 5 do begin t:=x+t; writeln(x,’ ’,t); end; 17. Имеется фрагмент программы в виде оператора цикла с параметром, обеспечивающий вывод на экран «столбиком» всех целых чисел от 10 до 30. Оформить этот фрагмент в виде: а) оператора цикла с предусловием; б) оператора цикла с постусловием; 18. Имеется фрагмент программы в виде оператора цикла с параметром, обеспечивающий вывод на экран «столбиком» квадратных корней из всех целых чисел от А до В (А>В) Оформить этот фрагмент в виде: а) оператора цикла с предусловием; б) оператора цикла с постусловием; 19. Дано натуральное число. Определить: а) количество цифр в нём; б) сумму его цифр; в) произведение его цифр; г) среднее арифметическое его цифр; д) сумму квадратов его цифр; е) сумму кубов его цифр; ж) его первую цифру; з) сумму его первой и последней цифр. 20. Найти минимальное число больше 200, которое нацело делится на 17. 21. Найти максимальное из натуральных чисел, не превышающих 5000, которое нацело делится на 39. 5 Вариант № 1. 1. Дано натуральное число: Найти сумму его цифр; Верно ли, что число начинается и заканчивается одной и той же цифрой? 2. Найти все трехзначные числа, сумма цифр которых равна А, а само число делится на В (А и В вводятся с клавиатуры). Вариант № 2. 1. Дано натуральное число: Найти произведение его цифр; Верно ли, что в данном числе нет данной цифры А (А вводится с клавиатуры)? 2. Найти все трехзначные числа, которые при увеличении на 1 делятся на 2, при увеличении на 2 делятся на 3, при увеличении на 3 делятся на 4, а при увеличении на 4 делятся на 5. Вариант № 3. 1. Дано натуральное число: Найти количество четных цифр числа; Верно ли, что данная цифра А встречается в числе более двух раз (А вводится с клавиатуры)? 2. Найти все четырехзначные числа, у которые сумма крайних цифр равна сумме средних цифр, а само число делится на 6 и 27. Вариант № 4. 1. Дано натуральное число: Найти количество цифр данного числа; Верно ли, что данное число начинается на нечетную цифру? 2. Найти количество трехзначных чисел, сумма цифр которых равна А, а само число заканчивается цифрой В (А и В вводятся с клавиатуры). Вариант № 5. 1. Дано натуральное число: Найти первую и последнюю цифры числа; Верно ли, что сумма цифр данного числа равна А (А вводится с клавиатуры)? 2. Найти все трехзначные числа, которые при делении на 2 дают остаток 1, при делении на 3 дают остаток 2, при делении на 3 дают остаток 2, при делении на 4 дают остаток 3, а само число делится на 5. Вариант № 6. 1. Дано натуральное число: Сколько раз данная цифра А встречается в данном числе (А вводится с клавиатуры); Верно ли, что в данном числе сумма цифр больше В, а само число делится на В (В вводится с клавиатуры)? 2. Найти все четырехзначные числа, в которых есть две одинаковые цифры. Вариант № 7. 1. Дано натуральное число: Найти вторую (с начала) цифру данного числа; Верно ли, что в данное число делится на А и В и сумма цифр меньше С (А, В, С вводятся с клавиатуры)? 2. Найти все двузначные числа, которые при умножении на 2 заканчиваются на 8, а при умножении на 3 – на 4. Вариант № 8. 1. Дано натуральное число: Найти количество цифр данного числа, больших А (А вводится с клавиатуры); Верно ли, что первая цифра данного числа четная? 2. Найти сумму всех чисел из промежутка от А до В, кратных 13 и 5 (А, В вводятся с клавиатуры). Вариант № 9. 1. Дано натуральное число: Сколько четных цифр в данном целом числе? Верно ли, что в данном числе встречаются цифры А и В (А, В вводятся с клавиатуры)? 2. Найти все симметричные четырехзначные числа, например, 7667, 2332. Вариант № 10. 1. Дано натуральное число: Сколько раз первая цифра встречается в данном числе? Верно ли, что в данное число начинается на А, а заканчивается на В (А, В вводятся с клавиатуры)? 2. Найти все трехзначные числа, которые состоят из разных цифр, а их сумма равна А (А вводится с клавиатуры). 6 1. Сколько раз будут выполнены операторы из циклов в следующих фрагментах программ: For k:=-1 to 1 do ... For k:=10 to 20 do ... For k:=20 to 10 do ... k:=5; r:=15; For i:=k+1 to r-1 do ... k:=5; r:=15; For i:=0 to k * r do ... k:= r; For i:= k to r do ... 2. Определить значение переменной S после выполнения следующих операторов: S:=0; n:=10; For i:=2 to n do s:=s+100 div i. 3. Какие из приведенных операторов правильные и почему? В цикле должны выполняться два оператора. For i:=12 to 15 do s:= s + i ; For a:= 30 to 20 do if a mod 3 = 0 then d:= d+ 1; For x:= 1 to 20 do s:= s + x; if (x mod 2 = 0) or (x mod 3 = 0) then d:= d + 1; 4. Var k,i:integer; X,y:real; Найти ошибки в следующих фрагментах программ: y:=0; for x:=0.1 to 0.9 do y:=y+sin(x); k:=81; y:=1; for i:=1 to sqrt(k) do y:=2*y; k:=0; for i:=1 to 9 do k:=k+sqr(i); k:=k*i; k:=1; for i:=1 to 64 do begin i:=2*i; k:=k+i; end; 5. Ниже представлен фрагмент программы вычисления количества цифр в заданном натуральном числе. a:=n; ck:=0; While a>=0; do Begin ck:=ck+1; a:=a div 10 End; Найдите и исправьте в нем ошибки. 6. Каким условиям должны удовлетворять значения переменной k; чтобы следующие циклы были бесконечны: While c<0 do c:= c + k; While k<>0 do k:= k + 1; While k<>0 do k:= k - 2; 7. Определить значение переменной s после выполнения следующих операторов: S:=0; i:=1; Repeat s:= s + 5 div i; i:=i-1; Until i<=1; 8. Для приведенного фрагмента программы ответьте на вопросы: а) Сколько операторов образуют тело цикла. б) Какая переменная является управляющей переменной цикла. с) Что будет выведено на экран при выполнении фрагмента программы. 1) k:=1; for m:=2 to 6 do begin k:=k*m; writeln(m,’ ’,k); end; 2) for h:=1 to 7 do writeln(h,’ ’,h*h); 3) s:=0; for i:=1 to 7 do begin s:=s+i; writeln(i,’ ’,s); end; 4) for n:=1 to 8 do begin p:=7*n; writeln(n,’ ’,p); end; 5) for p:=0 to 8 do writeln(p,’ ’,p*p); 6) t:=1; for x:=1 to 5 do begin t:=x+t; writeln(x,’ ’,t); end; 9. Для приведенного фрагмента программы ответьте на вопросы: а) Сколько операторов образуют тело цикла. б) Какая переменная является управляющей переменной цикла. с) Что будет выведено на экран при выполнении фрагмента программы. 1) f:=0; while f<=15 do begin writeln(2*f,’ ’,f*f); f:=f+3 end; 2) j:=4; while j<=20 do begin writeln(j,’ ’,j*7); j:=j+2 end; 3) i:=5; while i<=20 do begin writeln(i,’ ’,i*i); i:=i+5 end; 4) p:=16; while p>6 do begin writeln(p,’ ’,p*p); p:=p–2 end; 5) h:=20; while h>=0 do begin c:=h–8; writeln(h,’ ’,c); h:=h–6 end; 6) x:=1; while x<=30 do begin d:=x+2; writeln(x,’ ’,d); x:=x+d end; 7 Задачи на обработку клавиатуры. 1. Написать программу, печатающую код нажимаемой клавиши и заканчивающей работу после нажатия клавиши ESC. Определить все клавиши, не генерирующие кода и генерирующие расширенный код. Program VKB; Uses Crt; Var c,c2:char; Begin Repeat c:=ReadKey; If c=#0 then begin c2:=ReadKey;WriteLn('0 ',ord(c2)) end else WriteLn(ord(c)) Until c=#27 { 27 -код клавиши ESC } End. Не генерируют кода клавиши: Генерируют расширенный код: Расширенный код также генерируют: 2. Дана программа рисования звездочки в центре экрана; при нажатии букв U, D, R, L рисуется звездочка выше, ниже, правее, левее предыдущей звездочки соответственно. Программа заканчивает работу по нажатии клавиши Esc. Program Stars; Uses Crt; Var x,y:byte; c: char; Begin ClrScr; TextColor(7); x:=40; y:=13; GotoXY(x,y); Write('*'); Repeat c:=ReadKey; Case c of 'R','r': Inc(x); 'L','l': Dec(x); 'D','d': Inc(y); 'U','u': Dec(y); end; GotoXY(x,y); Write('*') Until c=#27 End. Таким образом, программа является очень упрощенной моделью графического редактора. Попытку выхода за границу экрана она отрабатывает неправильно. Также не корректно она обрабатывает нажатие некоторых клавиш. Например, нажатие клавиши F10 оказывает такой же эффект, как и нажатие буквы D (так как 'D'=#68, а клавиша F10 генерирует последовательность символов #0#68). Усовеpшенствуйте программу так, чтобы: 1. вместо клавиш U, D, R, L она реагировала на соответствующие клавиши передвижения курсора... 2. ... и не реагировала бы на них при попытке выхода за границы экрана; 3. с помощью функциональных клавиш F1-F7 можно было бы менять цвет; номер цвета вновь печатаемых звездочек должен устанавливаться в значение от 1 до 7 соответственно; 4. при нажатии на клавишу ESC должен очищаться экран; 5. при нажатии клавиш ALT+X программа заканчивает работу. Решение. Все усовершенствования касаются только основного цикла Repeat-Until. Главное изменение заключается в том, чтобы обрабатывать правильно клавиши расширенного кода. Тогда пункт 1) достигается заменой символов 'U' и 'u' на #0 и #72 во внешнем и внутреннем операторах Case соответственно и т.д. Для пункта 2) достаточно перед процедурами Inc и Dec поставить соответствующие условия. Пункты 3)-5) выполняются путем расширения списков обрабатываемых клавиш в операторах Case. 8