Алгоритмические этюды на использование операторов цикла
ОСОБЕННОСТИ ИСПОЛЬЗОВАНИЯ АРИФМЕТИЧЕСКОГО ОПЕРАТОРА ЦИКЛА С ЗАДАННЫМ ЧИСЛОМ ПОВТОРЕНИЙ Формат оператора : For пц := нз To кз Do оператор ; For пц := кц DownTo нз Do оператор ;
Особенности : Правило 1. Параметр цикла ( пц ) может быть простого дискретного типа : byte, integer, char, интервального, перечислимого. Правило 2. Начальное значение параметра цикла ( нз ) должно быть не больше конечного значения ( кз ). Если начальное значение больше конечного, то тело цикла не выполняется ни разу. Правило 3. Начальное и конечное значения параметра цикла вычисляются один раз до выполнения тела цикла и не меняются, пока цикл не завершён. Правило 4. Нецелесообразно менять значение параметра цикла в теле цикла. Правило 5. В теле цикла может быть только один оператор, поэтому, если нужно выполнить несколько действий, они заключаются в операторные скобки begin … end ; Правило 6. После выполнения тела цикла параметр цикла автоматически переходит к следующему значению (To) или к предыдущему значению (DownTo).
ЭТЮД 1 Определить, что будет выведено на экран после выполнения следующей программы: Program et1; Uses crt; Var n,k: byte; BEGIN n:=5; WriteLn( цикл 1); For k:=1 To n Do Write(k); WriteLn; WriteLn( цикл 2); For k:=1 DownTo n Do Write(k); WriteLn; WriteLn( цикл 3); For k:=nTo 1 Do Write(k); WriteLn; WriteLn( цикл 4); For k:=1 DownTo n Do Write(k); END. На экране: цикл цикл 2 цикл 3 цикл _
ЭТЮД 2 Определить, что будет выведено на экран после выполнения следующей программы: Program et 2 ; Uses crt; Var n,k: byte; BEGIN n:=5; For k:=1 To n Do begin n:=n+1; WriteLn(k=,k,n=,n);end; END. На экране: k=1 n=6 k=2 n=7 k=3 n=8 k=4 n=9 k=5 n=10
ЭТЮД 3 Определить, что будет выведено на экран после выполнения следующих фрагментов программ: На экране: … 1) S:=0; For k:=1 to 5 do s:=s+k; Write(s); … … 2) S:=0; For k:=1 to 5 do begin s:=s+k; Write(s); end; … Какие изменения нужно внести во второй фрагмент, чтобы значения сумм выводились на экран монитора через пробел?
ЭТЮД 4 Определить, что будет выведено на экран после выполнения следующей программы, т.е. какое значение будет иметь переменная k после выхода из цикла: Program et 2 ; Uses crt; Var n,k: byte; BEGIN n:=5; For k:=1 To n Do k:=k+2; WriteLn(k=,k); END. Правило 4 гласит, что нецелесообразно менять значение параметра цикла for в теле цикла. Не запрещено, но нецелесообразно, потому что результат может быть непредсказуем. Всё зависит от того, как проверяется условие на конец цикла. В разных версиях языка используются разные варианты проверки : k
Например, при входе в цикл k равно 1. В теле цикла оно увеличивается на 2 и становится равным 3. Так как 3 меньше 5, то значение k автоматически увеличивается ещё на 1, становится равным 4. Тело цикла выполняется ещё раз, k становится равным 6. Так как 6 не меньше 5, выполнение оператора цикла заканчивается. На экран выводится значение k=6. Program et 2 ; Uses crt; Var n,k: byte; BEGIN n:=5; For k:=1 To n Do k:=k+2; WriteLn(k=,k); END. Ручной счёт: knk
В Borland Pascal реализуется сравнение k=n (строгое совпадение). При выполнении оператора цикла k будет последовательно принимать значения 3,6,9,12,…,252, 255, 2, 5. (Для переменной k задан тип byte, поэтому она может принимать значения от 0 до 255.) Тело цикла при этом будет выполняться 87 раз. А если в Borland Pascal включить в программу оператор: For k:=1 To n Do k:=k+ 3 ; то произойдёт зацикливание, поскольку k будет меняться таким образом (4, 8, 12, …, 252, 0, …), что никогда не станет равным 5. То есть, если не знать особенностей транслятора языка, изменение параметра цикла может привести к непредвиденным последствиям. При этом отыскать синтаксическую ошибку бывает очень трудно.
ЭТЮД 5 Какая из приведенных ниже программ не содержит ошибку и что будет выведено на экран после её выполнения? А) uses crt; TYPE x=(b1,b2,b3); VAR b: x; BEGIN For b:=b1 to b3 do write(b); END. Б) uses crt; TYPE x=(b1,b2,b3); VAR b: x; BEGIN For b:=b1 to b3 do case b of b1: write(b1); b2: write(b2); b3:write(b3); end; END. В) uses crt; TYPE x=(b1,b2,b3); VAR b: x; BEGIN For b:=b1 to b3 do case b of b1: write(b1); b2: write(b2); b3:write(b3); end; END. На экране: b1b2b3 Данные перечислимого типа могут быть параметрами цикла. Поэтому во всех трех программах в записи тела оператора цикла ошибок нет. Выполнится только программа варианта Б). В случаях А) и В) будет выдана ошибка, что данные перечислимого типа выводить нельзя.
ОСОБЕННОСТИ ИСПОЛЬЗОВАНИЯ ОПЕРАТОРА ЦИКЛА С ПРЕДУСЛОВИЕМ Формат оператора : WHILE условие DO оператор ;
Особенности : Правило 1. Тело цикла выполняется, пока условие верно. Правило 2. Если условие с самого начала неверно, то тело цикла не выполнится ни разу. Правило 3. В теле цикла может быть только один оператор, поэтому если нужно выполнить несколько действий, то они заключаются в операторные скобки begin … end ;. Правило 4. Значение параметра цикла ( переменной, входящей в условие ) должно быть определено до цикла и должно изменяться в теле цикла, чтобы не произошло зацикливания.
ЭТЮД 6 Определить, что будет выведено на экран после выполнения приведённого ниже фрагмента программы: … k:=1; n:=2; WHILE k < n Do begin k:=k+2; n:=n+3; end; Write(k, n); … На экране: Произойдет зацикливание, поскольку значение переменной k будет всегда меньше значения переменной n ( правило 1)
ЭТЮД 7 Определить, что будет выведено на экран после выполнения приведённого ниже фрагмента программы: … k:= 2 ; n:= 1 ; WHILE k < n Do begin k:=k+2; n:=n+3; end; Write(k, n); … На экране: 21 Тело цикла не выполнится ни разу, поскольку условие при входе в цикл изначально ложно ( правило 2). На экран выведутся значения k= 2 и n= 1.
ЭТЮД 8 Определить, что будет выведено на экран после выполнения приведённого ниже фрагмента программы: … k:=1 ; n:=5; WHILE k < n Do k:=k+2; n:=n+3; Write(k, n); … На экране: 58 В теле цикла только один оператор k:+k+2; ( правило 3). Он выполнится два раза. На экран выведутся значения k=5 и n=8.
ЭТЮД 9 Определить, что будет выведено на экран после выполнения приведённого ниже фрагмента программы: … s:=0; k:=1 ; n:=5; WHILE k < n Do begin readln(x); s:=s+x; end; Write(s); … На экране: Программа зациклится, поскольку параметры цикла не меняются в теле цикла ( правило 4 ).
ЭТЮД 10 Определить, что будет выведено на экран после выполнения приведённого ниже фрагмента программы, если k и n определены как: a) integer; б) byte; … k:=1 ; n:=5; WHILE k < n Do n:=n - 3; Write(k:3, n:3); … На экране: a) 1 -1 б)б) a) Переменная k так и останется равной 1, переменная n станет равной-1 б) Выполнение прервётся с сообщением об ошибке «выход за границы диапазона переменной типа byte »
ЭТЮД 11 Каков смысл приведённого ниже фрагмента программы? … WHILE not (keypressed) Do; … В Borland Pascal – ожидание нажатия какой-либо клавиши.
ОСОБЕННОСТИ ИСПОЛЬЗОВАНИЯ ОПЕРАТОРА ЦИКЛА С ПОСТУСЛОВИЕМ Формат оператора : REPEAT операторы UNTIL условие ;
Особенности : Правило 1. Тело цикла выполняется, пока условие неверно. Правило 2. Тело цикла выполняется хотя бы один раз. Правило 3. Значение параметра цикла ( переменной, входящей в условие ) целесообразно определять до цикла. В теле цикла оно должно изменяться, чтобы не произошло зацикливания.
ЭТЮД 12 Определить, что будет выведено на экран после выполнения приведённого ниже фрагмента программы: … S:=информатика; k:=1; n:=5; REPEAT gotoxy(35,12);write(s); delay(1000); clrscr; delay(1000); k:=k+1; UNTIL k>n; … На экране: информатика
ЭТЮД 13 Каков смысл приведённого ниже фрагмента программы? REPEAT UNTIL keypressed ОТВЕТ: Ожидание нажатия какой- либо клавиши. Если нужно дождаться конкретной клавиши, например, *, то можно использовать конструкцию: REPEAT UNTIL readkey= * ;
ЭТЮД 14 В чём смысл приведённого ниже фрагмента программы? … REPEAT Write(Введите верно год:); ReadLn(g); UNTIL (g>=1990) and (g
ЭТЮД 15
ЭТЮД 16