250 likes | 448 Views
Алгоритмические этюды. на использование операторов цикла. Формат оператора : For пц:=нз To кз Do оператор ; For пц:=кц DownTo нз Do оператор ;. Особенности использования арифметического оператора цикла с заданным числом повторений. Особенности:.
E N D
Алгоритмические этюды на использование операторов цикла
Формат оператора: Forпц:=нзToкзDo оператор; Forпц:=кцDownToнзDo оператор; Особенности использования арифметического оператора цикла с заданным числом повторений
Особенности: • Правило 1. Параметр цикла (пц) может быть простого дискретного типа: byte, integer, char, интервального, перечислимого. • Правило 2.Начальное значение параметра цикла (нз) должно быть не больше конечного значения (кз). Если начальное значение больше конечного, то тело цикла не выполняется ни разу. • Правило 3. Начальное и конечное значения параметра цикла вычисляются один раз до выполнения тела цикла и не меняются, пока цикл не завершён. • Правило 4.Нецелесообразно менять значение параметра цикла в теле цикла. • Правило 5. В теле цикла может быть только один оператор, поэтому, если нужно выполнить несколько действий, они заключаются в операторные скобки begin … end; • Правило 6. После выполнения тела цикла параметр цикла автоматическипереходит к следующему значению (To) или к предыдущему значению (DownTo).
Определить, что будет выведено на экран после выполнения следующей программы: ЭТЮД 1 На экране: Program et1; Uses crt; Varn,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. цикл 1 12345 цикл 2 цикл 3 цикл 4 54321_
ЭТЮД 2 Определить, что будет выведено на экран после выполнения следующей программы: Program et2; 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); … На экране: 15 На экране: … 2) S:=0; For k:=1 to 5 do begin s:=s+k; Write(s); end; … 1361015 Какие изменения нужно внести во второй фрагмент, чтобы значения сумм выводились на экран монитора через пробел?
ЭТЮД 4 Определить, что будет выведено на экран после выполнения следующей программы, т.е. какое значение будет иметь переменная k после выхода из цикла: Program et2; 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<n, k<=n, k=n. Причём проверка может осуществляться до и после автоматического увеличения (уменьшения) на 1 значения параметра цикла. Всё это может приводить при одной и той же записи оператора к разным действиям.
Например, при входе в цикл k равно 1. В теле цикла оно увеличивается на 2 и становится равным 3. Так как 3 меньше 5, то значение k автоматически увеличивается ещё на 1, становится равным 4. Тело цикла выполняется ещё раз, k становится равным 6. Так как 6 не меньше 5, выполнение оператора цикла заканчивается. На экран выводится значение k=6. Ручной счёт: k n k<=n 5 1 1<=5 да 3 3<=5 да 4 4<=5 да 6 6<=5 нет Program et2; Uses crt; Var n,k: byte; BEGIN n:=5; For k:=1 To n Do k:=k+2; WriteLn(‘k=’,k); END. На экране: k=6 Так происходит, например, в версии PascalABC.
В 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 Dok:=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 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. А) uses crt; TYPE x=(b1,b2,b3); VAR b: x; BEGIN For b:=b1 to b3 do write(b); 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 б) б) Переменнаяk так и останется равной 1, переменная nстанет равной-1 a) Выполнение прервётся с сообщением об ошибке «выход за границы диапазона переменной типа 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 UNTILreadkey=‘*’; ОТВЕТ:
ЭТЮД 14 В чём смысл приведённого ниже фрагмента программы? … REPEAT Write(‘Введите верно год:’); ReadLn(g); UNTIL (g>=1990) and (g<=2010); … Ввод данных с проверкой правильности введённого значения. ОТВЕТ: