1 Программирование на языке Паскаль 1. Циклы с параметром
2 Циклы Цикл – это многократное выполнение одинаковой последовательности действий. цикл с известным числом шагов цикл с неизвестным числом шагов (цикл с условием) Задача. Вывести на экран квадраты и кубы целых чисел от 1 до 8 (от a до b ). Особенность: одинаковые действия выполняются 8 раз. Можно ли решить известными методами? ?
3 Алгоритм начало i, i2, i3 конец нет да i
4 Алгоритм (с блоком «цикл») начало i, i2, i3 конец i2 := i * i; i3 := i2 * i; i := 1,8 блок «цикл» тело цикла
5 Программа program qq; var i, i2, i3: integer; begin for i:=1 to 8 do begin i2 := i*i; i3 := i2*i; writeln(i:4, i2:4, i3:4); end; end. переменная цикла переменная цикла начальное значение конечное значение
6 Цикл с уменьшением переменной Задача. Вывести на экран квадраты и кубы целых чисел от 8 до 1 (в обратном порядке). Особенность: переменная цикла должна уменьшаться. Решение: for i:=8 1 do begin i2 := i*i; i3 := i2*i; writeln(i:4, i2:4, i3:4); end; for i:=8 1 do begin i2 := i*i; i3 := i2*i; writeln(i:4, i2:4, i3:4); end; downto
7 Цикл с переменной for := to do begin {тело цикла} end; for := to do begin {тело цикла} end; Увеличение переменной на 1: for := downto do begin {тело цикла} end; for := downto do begin {тело цикла} end; Уменьшение переменной на 1:
8 Цикл с переменной Особенности: переменная цикла может быть только целой ( integer ) шаг изменения переменной цикла всегда равен 1 ( to ) или -1 ( downto ) если в теле цикла только один оператор, слова begin и end можно не писать: если конечное значение меньше начального, цикл ( to ) не выполняется ни разу (проверка условия в начале цикла, цикл с предусловием) for i:=1 to 8 do writeln('Привет'); for i:=1 to 8 do writeln('Привет');
9 Цикл с переменной Особенности: в теле цикла не разрешается изменять переменную цикла (почему?) при изменении начального и конечного значения внутри цикла количество шагов не изменится: n := 8; for i:=1 to n do begin writeln('Привет'); n := n + 1; end; n := 8; for i:=1 to n do begin writeln('Привет'); n := n + 1; end; нет зацикливания
10 Сколько раз выполняется цикл? a := 1; for i:=1 to 3 do a := a+1; a := 1; for i:=1 to 3 do a := a+1; a = 4a = 4 a = 4a = 4 a := 1; for i:=3 to 1 do a := a+1; a := 1; for i:=3 to 1 do a := a+1; a = 1a = 1 a = 1a = 1 a := 1; for i:=1 downto 3 do a := a+1; a := 1; for i:=1 downto 3 do a := a+1; a = 1a = 1 a = 1a = 1 a := 1; for i:=3 downto 1 do a := a+1; a := 1; for i:=3 downto 1 do a := a+1; a = 4a = 4 a = 4a = 4
11 for i:=1 to 9 do begin if ??? then begin i2 := i*i; i3 := i2*i; writeln(i:4, i2:4, i3:4); end; for i:=1 to 9 do begin if ??? then begin i2 := i*i; i3 := i2*i; writeln(i:4, i2:4, i3:4); end; Как изменить шаг? Задача. Вывести на экран квадраты и кубы нечётных целых чисел от 1 до 9. Особенность: переменная цикла должна увеличиваться на 2. Проблема: в Паскале шаг может быть 1 или -1. Решение: i mod 2 = 1 i2 := i*i; i3 := i2*i; writeln(i:4, i2:4, i3:4); i2 := i*i; i3 := i2*i; writeln(i:4, i2:4, i3:4); выполняется только для нечетных i Что плохо? ?
12 Как изменить шаг? – II Идея: Надо вывести всего 5 чисел, переменная k изменяется от 1 до 5. Начальное значение i равно 1, с каждым шагом цикла i увеличивается на 2. Решение: ??? for k:=1 to 5 do begin i2 := i*i; i3 := i2*i; writeln(i:4, i2:4, i3:4); ??? end; ??? for k:=1 to 5 do begin i2 := i*i; i3 := i2*i; writeln(i:4, i2:4, i3:4); ??? end; i := i + 2; i := 1;
13 Как изменить шаг? – III Идея: Надо вывести всего 5 чисел, переменная k изменяется от 1 до 5. Зная k, надо рассчитать i. Решение: k12345 i13579 i = 2k-1 for k:=1 to 5 do begin ??? i2 := i*i; i3 := i2*i; writeln(i:4, i2:4, i3:4); end; for k:=1 to 5 do begin ??? i2 := i*i; i3 := i2*i; writeln(i:4, i2:4, i3:4); end; i := 2*k – 1;
14 2. Циклы с условием
15 Цикл с условием while do begin {тело цикла} end; while do begin {тело цикла} end; Особенности: можно использовать сложные условия: если в теле цикла только один оператор, слова begin и end можно не писать: while (a
16 Цикл с условием Особенности: условие пересчитывается каждый раз при входе в цикл если условие на входе в цикл ложно, цикл не выполняется ни разу если условие никогда не станет ложным, программа зацикливается a := 4; b := 6; while a > b do a := a – b; a := 4; b := 6; while a > b do a := a – b; a := 4; b := 6; while a < b do d := a + b; a := 4; b := 6; while a < b do d := a + b;
17 Сколько раз выполняется цикл? a := 4; b := 6; while a < b do a := a + 1; a := 4; b := 6; while a < b do a := a + 1; 2 раза a = 6 2 раза a = 6 a := 4; b := 6; while a < b do a := a + b; a := 4; b := 6; while a < b do a := a + b; 1 раз a = 10 1 раз a = 10 a := 4; b := 6; while a > b do a := a + 1; a := 4; b := 6; while a > b do a := a + 1; 0 раз a = 4 0 раз a = 4 a := 4; b := 6; while a < b do b := a - b; a := 4; b := 6; while a < b do b := a - b; 1 раз b = -2 1 раз b = -2 a := 4; b := 6; while a < b do a := a - 1; a := 4; b := 6; while a < b do a := a - 1; зацикливание
18 Замена for на while и наоборот for i:=1 to 10 do begin {тело цикла} end; for i:=1 to 10 do begin {тело цикла} end; i := 1; while i = b do begin {тело цикла} i := i - 1; end; Замена while на for возможна только тогда, когда можно заранее рассчитать число шагов цикла. Замена цикла for на while возможна всегда.