1 Программирование на языке Паскаль © К.Ю. Поляков, Введение Введение 2. Ветвления Ветвления 3. Сложные условия Сложные условия 4. Циклы Циклы 5. Циклы с условием Циклы с условием 6. Оператор выбора Оператор выбора 1. Графика Графика 2. Графики функций Графики функций 3. Процедуры Процедуры 4. Рекурсия Рекурсия 5. Анимация Анимация 6. Случайные числа Случайные числа 7.Функции Функции
2 Программирование на языке Паскаль Тема 5. Циклы с условием © К.Ю. Поляков,
3 Цикл с неизвестным числом шагов Пример: Отпилить полено от бревна. Сколько раз надо сделать движения пилой? Задача: Ввести целое число (< ) и определить число цифр в нем. Идея решения: Отсекаем последовательно последнюю цифру, увеличиваем счетчик. Проблема: Неизвестно, сколько шагов надо сделать. Решение: Надо остановиться, когда n = 0, т.е. надо делать «пока n <> 0». ncount
4 Алгоритм начало count конец нет да n <> 0? count := 0 ; count := count + 1; n := n div 10; обнулить счетчик цифр ввод n выполнять «пока n <> 0»
5 Программа program qq; var n, count: integer; begin writeln('Введите целое число'); read(n); count := 0; while n <> 0 do begin count := count + 1; n := n div 10; end; writeln('В числе ', n, ' нашли ', count, ' цифр'); end. program qq; var n, count: integer; begin writeln('Введите целое число'); read(n); count := 0; while n <> 0 do begin count := count + 1; n := n div 10; end; writeln('В числе ', n, ' нашли ', count, ' цифр'); end. while n <> 0 do begin count := count + 1; n := n div 10; end; while n <> 0 do begin count := count + 1; n := n div 10; end; выполнять «пока n <> 0» Что плохо? ?
6 Программа program qq; var n, count: integer; begin writeln('Введите целое число'); read(n); count := 0; while n <> 0 do begin count := count + 1; n := n div 10; end; writeln('В числе ', n, ' нашли ', count, ' цифр'); end. program qq; var n, count: integer; begin writeln('Введите целое число'); read(n); count := 0; while n <> 0 do begin count := count + 1; n := n div 10; end; writeln('В числе ', n, ' нашли ', count, ' цифр'); end. while n <> 0 do begin count := count + 1; n := n div 10; end; while n <> 0 do begin count := count + 1; n := n div 10; end;, n1: integer; n1 := n; n1, выполнять «пока n <> 0»
7 Цикл с предусловием while do begin {тело цикла} end; while do begin {тело цикла} end; Особенности: можно использовать сложные условия: если в теле цикла только один оператор, слова begin и end можно не писать: while (a<b) and (b<c) do begin {тело цикла} end; while (a<b) and (b<c) do begin {тело цикла} end; while a < b do a := a + 1; while a < b do a := a + 1;
8 Цикл с условием Особенности: условие пересчитывается каждый раз при входе в цикл если условие на входе в цикл ложно, цикл не выполняется ни разу если условие никогда не станет ложным, программа зацикливается 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;
9 Сколько раз выполняется цикл? 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; зацикливание раз b = -2 1 раз b = -2
10 Замена for на while и наоборот for i:=1 to 10 do begin {тело цикла} end; for i:=1 to 10 do begin {тело цикла} end; i := 1; while i <= 10 do begin {тело цикла} i := i + 1; end; i := 1; while i <= 10 do begin {тело цикла} i := i + 1; end; for i:=a downto b do begin {тело цикла} end; for i:=a downto b do begin {тело цикла} end; i := a; while i >= b do begin {тело цикла} i := i - 1; end; i := a; while i >= b do begin {тело цикла} i := i - 1; end; Замена while на for возможна только тогда, когда можно заранее рассчитать число шагов цикла. Замена цикла for на while возможна всегда.
11 Задания «4»: Ввести целое число и найти сумму его цифр. Пример: Введите целое число: 1234 Сумма цифр числа 1234 равна 10. «5»: Ввести целое число и определить, верно ли, что в его записи есть две одинаковые цифры. Пример: Введите целое число: Введите целое число: Нет. Да.
12 Последовательности Примеры: 1, 2, 3, 4, 5, … 1, 2, 4, 7, 11, 16, … 1, 2, 4, 8, 16, 32, … an = nan = n an = nan = n a 1 = 1, a n+1 = a n +1 a 1 = 1, a n+1 = a n + n a n = 2 n-1 a 1 = 1, a n+1 = 2 a n b 1 = 1, b n+1 = b n +1 c 1 = 2, c n+1 = 2 c n
13 Последовательности Задача: найти сумму всех элементов последовательности, которые по модулю больше 0,001: Элемент последовательности (начиная с 2): n b12345 c z b := b+1; c := 2*c; z := -z;
14 Алгоритм начало S конец нет да |a| > 0.001? S := S + a; S := 0 ; b := 1; c := 2 ; z := -1; a := 1; начальные значения a := z*b/c; b := b + 1; c := 2*c; z := -z; первый элемент a := 1; S := 0 ; новый элемент изменение Перестановка? ?
15 Программа program qq; var b, c, z: integer; S, a: real; begin S := 0; z := -1; b := 1; c := 2; a := 1; while abs(a) > do begin S := S + a; a := z * b / c; z := - z; b := b + 1; c := c * 2; end; writeln('S =', S:10:3); end. program qq; var b, c, z: integer; S, a: real; begin S := 0; z := -1; b := 1; c := 2; a := 1; while abs(a) > do begin S := S + a; a := z * b / c; z := - z; b := b + 1; c := c * 2; end; writeln('S =', S:10:3); end. z := - z; b := b + 1; c := c * 2; переход к следующему слагаемому S := 0; z := -1; b := 1; c := 2; a := 1; начальные значения увеличение суммы расчет элемента последовательности
16 Задания «4»: Найти сумму элементов последовательности с точностью 0,001: Ответ: S = «5»: Найти сумму элементов последовательности с точностью 0,001: Ответ: S = 1.220
17 Цикл с постусловием Задача: Ввести целое положительное число (< ) и определить число цифр в нем. Проблема: Как не дать ввести отрицательное число или ноль? Решение: Если вводится неверное число, вернуться назад к вводу данных (цикл!). Особенность: Один раз тело цикла надо сделать в любом случае => проверку условия цикла надо делать в конце цикла (цикл с постусловием). Цикл с постусловием – это цикл, в котором проверка условия выполняется в конце цикла.
18 Цикл с постусловием: алгоритм начало конец да нет n > 0? тело цикла условие ВЫХОДА блок «типовой процесс» ввод n основной алгоритм
19 Программа program qq; var n: integer; begin repeat writeln('Введите положительное число'); read(n); until n > 0;... { основной алгоритм } end. program qq; var n: integer; begin repeat writeln('Введите положительное число'); read(n); until n > 0;... { основной алгоритм } end. repeat writeln('Введите положительное число'); read(n); until n > 0; условие ВЫХОДА Особенности: тело цикла всегда выполняется хотя бы один раз после слова until ("до тех пор, пока не…") ставится условие ВЫХОДА из цикла
20 Сколько раз выполняется цикл? a := 4; b := 6; repeat a := a + 1; until a > b; a := 4; b := 6; repeat a := a + 1; until a > b; 3 раза a = 7 3 раза a = 7 a := 4; b := 6; repeat a := a + b; until a > b; a := 4; b := 6; repeat a := a + b; until a > b; 1 раз a = 10 1 раз a = 10 a := 4; b := 6; repeat a := a + b; until a < b; a := 4; b := 6; repeat a := a + b; until a < b; зацикливание a := 4; b := 6; repeat b := a - b; until a < b; a := 4; b := 6; repeat b := a - b; until a < b; 2 раза b = 6 2 раза b = 6 a := 4; b := 6; repeat a := a + 2; until a < b; a := 4; b := 6; repeat a := a + 2; until a < b; зацикливание 1 раз a = 10 1 раз a = 10 1 раз a = 10 1 раз a =
21 Задания (с защитой от неверного ввода) «4»: Ввести натуральное число и определить, верно ли, что сумма его цифр равна 10. Пример: Введите число >= 0: Введите число >= 0: Нужно положительное число. Нет Введите число >= 0: 1234 Да «5»: Ввести натуральное число и определить, какие цифры встречаются несколько раз. Пример: Введите число >= 0: Повторяются: 2, 3 Нет повторов.