Основы программирования Pascal ABC
2 Циклы Цикл – это многократное выполнение одинаковой последовательности действий. цикл с известным числом шагов цикл с неизвестным числом шагов (цикл с условием) бесконечный цикл Задача. Вывести на экран 5 раз слово «Привет». Особенность: одинаковые действия выполняются 5 раз. Можно ли решить известными методами? ?
3 Циклы program qq; begin writeln('Привет'); end. program qq; begin writeln('Привет'); end. Что плохо? ?
program Z; label m1; begin m1: writeln('Привет'); goto m1; end. Бесконечный цикл Программа не завершится никогда!!!
5 Циклы program qq; begin { сделай 5 раз } writeln('Привет'); end. program qq; begin { сделай 5 раз } writeln('Привет'); end. Как отсчитать ровно 5 раз? ? Как запоминать, сколько раз уже сделали? ? i := i + 1;
6 Алгоритм начало Привет! конец да нет i = 5?i = 5? i := 0 ; i := i + 1; еще не сделали ни одного раза проверить, все ли сделали вывод на экран считаем очередной шаг
program Z; label m1; var i:integer; begin i:=0; m1: if i5 then begin writeln('Привет'); i:=i+1; goto m1; end; end. Цикл с помощью оператора goto и условия
8 Циклы program qq; var i: integer; begin for i:=1 to 5 do writeln('Привет'); end. program qq; var i: integer; begin for i:=1 to 5 do writeln('Привет'); end. «Для всех i от 1 до 5 делай …» «Для всех i от 1 до 5 делай …» for i:=1 to 5 do Если в цикле более одного оператора: for i:=1 to 5 do begin write('Привет'); writeln(', Вася!'); end; for i:=1 to 5 do begin write('Привет'); writeln(', Вася!'); end; begin end; Что получится? ?
9 Циклы Задача. Вывести на экран квадраты и кубы целых чисел от 1 до 8 (от a до b ). Особенность: одинаковые действия выполняются 8 раз. Можно ли решить известными методами? ? i := 1; { очередное число } i2 := i*i;{ его квадрат } i3 := i2*i;{ куб } writeln(i:4, i2:4, i3:4); i := 2;... i := 1; { очередное число } i2 := i*i;{ его квадрат } i3 := i2*i;{ куб } writeln(i:4, i2:4, i3:4); i := 2;... А если начальное и конечное значения вводятся с клавиатуры? ?
10 Алгоритм начало i, i2, i3 конец нет да i
11 Алгоритм (с блоком «цикл») начало i, i2, i3 конец i2 := i * i; i3 := i2 * i; i := 1,8 блок «цикл» тело цикла
12 Программа 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. переменная цикла переменная цикла начальное значение конечное значение
13 Цикл с уменьшением переменной Задача. Вывести на экран квадраты и кубы целых чисел от 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
14 Цикл с переменной for := to do begin {тело цикла} end; for := to do begin {тело цикла} end; Увеличение переменной на 1: for := downto do begin {тело цикла} end; for := downto do begin {тело цикла} end; Уменьшение переменной на 1:
15 Цикл с переменной Особенности: переменная цикла может быть только целой ( integer ) шаг изменения переменной цикла всегда равен 1 ( to ) или -1 ( downto ) если в теле цикла только один оператор, слова begin и end можно не писать: если конечное значение меньше начального, цикл ( to ) не выполняется ни разу (проверка условия в начале цикла, цикл с предусловием) for i:=1 to 8 do writeln('Привет'); for i:=1 to 8 do writeln('Привет');
16 Цикл с переменной Особенности: в теле цикла не разрешается изменять переменную цикла (почему?) при изменении начального и конечного значения внутри цикла количество шагов не изменится: 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; нет зацикливания
17 Цикл с переменной Особенности: после выполнения цикла во многих системах устанавливается первое значение переменной цикла, при котором нарушено условие: for i:=1 to 8 do writeln('Привет'); writeln('i=', i); for i:=1 to 8 do writeln('Привет'); writeln('i=', i); for i:=8 downto 1 do writeln('Привет'); writeln('i=', i); for i:=8 downto 1 do writeln('Привет'); writeln('i=', i); i=9 i=0 НЕ ДОКУМЕНТИРОВАНО
18 Сколько раз выполняется цикл? 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
19 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 Что плохо? ?
20 Как изменить шаг? – 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;
21 Как изменить шаг? – 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;
команда if a=3 then continue; команда команда Иногда, при выполнении в теле цикла какого- либо условия, нужно экстренно прервать цикл, не доводя до конца очередной повтор. В таких случаях используется команда break Экстренные события в теле цикла Иногда, при выполнении в теле цикла какого- либо условия, нужно экстренно перейти к следующему повтору, не доводя до конца очередной повтор. В таких случаях используется команда continue. (Если это происходит в цикле FOR, то счётчик получает при этом следующее значение.) Команды break и continue могут применяться в любом из видов циклов. Вне цикла их использование запрещено.
Многие специалисты (в том числе и автор языка Паскаль) не рекомендуют использовать команду goto, считая её потенциально опасной (источником логических ошибок). Поэтому в некоторых реализациях Паскаля (в том числе и Pascal ABC) эта команда отсутствует! Оператор goto запрещен!
Пример. Дано натуральное число N. Определить, является ли оно простым. Для решения задачи: формируем тело программы и описываем переменные; вводим натуральное число N; в интервале от 2 до N/2 берем натуральные числа и проверяем, являются ли они делителями числа N; в зависимости от значения флага F выводим результат. program pN; var i, n, f : integer; begin f := 0; for i := 2 to n div 2 do if n mod i = 0 then f := 1; if f = 0 then writeln('Число ', n:6, ' простое') else writeln('Число ', n:6, ' нe простое') end.
Пример. Вводится последовательность из N целых чисел. Найти, сколько в ней нулей (нулевых значений). Для решения задачи: формируем тело программы и описываем переменные; вводим длину последовательности N и устанавливаем начальное значение К; последовательно считываем числа, и если число равно нулю, то увеличиваем значение счетчика К; в зависимости от значения К выводим результат. program pNULL; var n, x, k, i : integer; begin k := 0; for i := 1 to n do begin write('Ввeдитe x ='); readln(x); if x = 0 then k := k + 1 end; if k = 0 then writeln('Нулей нет') else writeln('Количество нулей равно k = ', k); end.
26 Домашнее задание по теме ЦИКЛЫ 1. Ввести a и b и вывести квадраты и кубы чисел от a до b. Пример: Введите границы интервала: Вывести квадраты и кубы 10 чисел следующей последовательности: 1, 2, 4, 7, 11, 16, … Пример:
3. На продуктовый склад привезли в понедельник продукции на сумму 1000 р. Каждый следующий день недели кроме воскресенья привозят продукции на 10% больше. Со следующего понедельника опять начинают с 1000 руб. Когда на складе накапливается продукции не менее, чем на руб, со склада увозят потребителям партию стоимостью ровно руб. На какую сумму будет иметься на складе продукция через a дней после начала его работы? 4. Пойманную мышь посадили в клетку. За первый день она съела s граммов сыра. Каждый следующий день ей давали на 10% больше, чем в предыдущий. Но каждый 5-й день сыра давали меньше, чем в предыдущий день на 1 грамм. Сколько сыра съела мышь за d дней? 5. Агент 007 узнал, что в секретном сейфе трёхзначный код, в котором все три цифры разные. При этом средняя цифра равна разности крайних цифр. Составить программу, которая напечатает для него все такие числа.