ЦИКЛИЧЕСКИЙ АЛГОРИТМ Цели: -Познакомиться с понятием циклического алгоритма. -Освоить языковые средства для реализации циклических алгоритмов. Цикл - это последовательность операторов, которая может выполняться один или более раз. Циклический алгоритм - это алгоритм, содержащий один или несколько циклов. Если циклический алгоритм содержит несколько циклов, то такие циклы называются вложенными. Последовательность операторов, которые выполняются в цикле, называется телом цикла. Количество операторов в теле цикла зависит от контекста задачи и может быть любым. Виды циклов Существует две разновидности циклических алгоритмов: с предусловием и с постусловием. Циклический алгоритм с предусловием существует в двух видах: с условием и со счетчиком. Во многих языках программирования существуют три типа операторов цикла, реализующих циклический алгоритм: циклы со счетчиком, циклы с предусловием, циклы с постусловием. Циклический алгоритм с предусловием Вход условие нет Выход из цикла входа в цикла да A1 ... A1 … Ak – тело цикла Ak Рисунок 3-1. Блок схема цикла с предусловием Циклический алгоритм с предусловием имеет 2 части: 1) Заголовок цикла, который содержит условие входа в цикл. В заголовке цикла должно стоять условное или логическое выражение, которое образно можно назвать «замком». Если «замок открыт», т.е. значение выражения равно «истина», то доступ к операторам тела цикла открыт. 2) Тело цикла, которое содержит операторы. Циклический алгоритм со счетчиком Вход 1 i – счетчик циклапеременная целого типа Присвоить начальное значение счетчика 2 3 Условие входа в цикл 6 нет Выход из цикла да A1 ... A1 … Ak – тело цикла 4 Ak 5 Изменить значение счетчика на величину шага Рисунок 3-2 Блок–схема циклического алгоритма со счетчиком Цикл со счетчиком алгоритм состоит из двух частей: 1) в первой части, называемой заголовком цикла, указывается переменная - счетчик цикла, задаются ее начальное и конечное значения. Шаг изменения счетчика и условие входа в цикл зависят от типа циклического алгоритма. 2) во второй части, называемой телом цикла, задаются операторы А1, ..., Аk, которые должны циклически повторяться. Циклический алгоритм с постусловием Вход • A1 ... A1 … Ak – тело цикла Ak нет Условие выхода из цикла да Выход Рисунок 3-3. Блок-схема выполнения циклического алгоритма с постусловием В отличие от цикла с предусловием, который может закончить работу, ни разу не выполнив тело цикла (если условие выполнения будет ложно при первом входе в цикл), тело цикла с постусловием выполняется хотя бы один раз, только потом проверяется условие выхода. Операторы цикла в языке Паскаль Оператор цикла с предусловием: WHILE <условие> DO <оператор>; Здесь WHILE, DO - резервированные слова (английский: пока, делать) Писать эти ключевые слова можно иначе: while, do, While, Do, смысл оператора от этого не изменится, потому что большие и маленькие английские буквы интерпретируются транслятором языка Паскаль одинаково, хотя и имеют разные порядковые номера, или коды, в таблице кодировки. <условие> - это условие входа в цикл, условное или логическое выражение, значение которого имеет логический тип; <оператор> - произвольный, возможно составной, оператор, который является телом цикла; WHILE <условие> DO – заголовок цикла; Оператор цикла с возрастающим значением счетчика FOR <имя счетчика цикла> := <начальное значение> TO <конечное значение> DO <оператор>; Здесь FOR <имя счетчика цикла> := <начальное значение> TO <конечное значение> DO – заголовок цикла; FOR, TO, DO - зарезервированные слова (английский: для, до, выполнить); <счетчик (параметр) цикла> - переменная целого типа, которая изменяется от , начального до конечного значения, увеличиваясь на единицу в конце каждого шага цикла; <оператор> - любой, возможно составной, оператор, который является телом цикла; Условие входа в цикл для данного оператора: <начальное значение счетчика> ≤<конечного значения счетчика> Если начальное и конечное значения счетчика равны, то тело цикла выполняется один раз. Если конечное значение счетчика меньше, чем начальное значение, то цикл игнорируется. Оператор цикла с убывающим значением счетчика FOR <имя счетчика цикла> := <начальное значение> DOWNTO <конечное значение> DO <оператор> ; Здесь FOR <имя счетчика цикла> := <начальное значение>DOWNTO <конечное значение> DO – заголовок цикла; FOR, DOWNTO, DO – ключевые слова, английские : для вниз до, делать; <счетчик (параметр) цикла>: переменная целого типа.. Замена TO на DOWNTO означает, что шаг изменения параметра цикла равен -1, то есть происходит пошаговое уменьшение счетчика на единицу; <оператор> - любой, возможно составной, оператор, который является телом цикла; Условие входа в цикл для данного оператора: <начальное значение счетчика> ≥<конечного значения счетчика> Оператор цикла с постусловием REPEAT <тело цикла> UNTIL <условие>; Здесь REPEAT, UNTIL - резервированные слова (англ.: повторять, пока не); <условие> - условное и логическое выражение, его значение имеет логический тип. Если значение условия истинно, то происходит выход из цикла; <тело цикла> - простой или составной оператор. Только в этом случае операторные скобки составного оператора begin-end писать не нужно, т.к.ключевые слова REPEAT, UNTIL Вложенные циклы Часто для решения задач требуется конструкция, когда нужны два или более циклов, которые нужно поместить один внутри другого. Такая конструкция называется вложенными циклами. 1 For i := 1 to 10 do <тело цикла 1>; 2 For j := 1 to 10 do <тело цикла 2>; 3 Repeat<оператор>until<условие>; 4 While <условие> do <тело цикла 4>; {конец цикла 2} {Конец цикла 1} Рисунок 3.4. Вложенные циклы при использовании вложенных циклов следует соблюдать следующие правила: внутренний цикл является одним из операторов тела внешнего цикла; имена счетчиков вложенных циклов с параметрами разные; следует помнить о количестве повторений тел циклов. В нашем примере тело цикла 1 будет повторяться 10 раз. Тело цикла 2 будет повторяться 100 раз, для каждого значения счетчика I счетчик j будет пробегать значения от 1 до 10. Тело цикла 4 будет повторяться 100*k, где k зависит от условия задачи. Тело цикла 3 будет повторяться 10*n, где n зависит от условия задачи. Дано натуральное число N. Вычислить N! (Nфакториал) Для любого натурального числа N значение N! определяется как произведение всех натуральных чисел от 1 до N: N! = 1*2*3*...*N. (Целое число называется натуральным, если оно больше 0.) Задача 1. Вход Ввод N n>0 нет Вывод "Неверно задано значение N" да res:=1 i:=2 (начальное значение) i<=n конечное значение i – счетчик цикла нет Выход из цикла да res:=res*i i:=i+1 Тело цикла. Увеличение счетчика цикла. PROGRAM FACTORIAL; {Вычисляет n!} Var n:Integer; i, res :Integer; Begin Write ('Введите n :');Readln (n); if (n>0) then begin res := 1; For i := 2 to n do res := res * i; Writeln('N - факториал = ', res); end; еlse Writeln ('Неверно задано значение N'); Readln; End. Задача 2. Дана последовательность N натуральных чисел А1,..., АN, элементы которой нужно ввести с клавиатуры. Определить, сколько элементов последовательности являются четными числами. PROGRAM CH; {Подсчитывает количество четных элементов последовательности} Var n: Integer; a:Integer; {переменная для хранения элемента последовательности} i, kol:Integer; Begin Write ('Введите n :'); Readln (n); {ввод количества всех элементов } if (n>0) then begin kol := 0; {счетчик количества четных элементов} For i := 1 to n do Begin Writeln('Введите a[', i, '] : '); Readln(a); if not Odd(a) the kol := kol + 1; {проверка четности: Функция Odd() возвращает значение true, если ее аргумент - нечетное число, false - если четное } End; Writeln('В последовательности ', kol, ' четных чисел'); end else Writeln ('Неверно задано значение N'); Readln; End. Задача 3. Дано натуральное число n и действительное число х. Вычислить: 1/sin(x) + 1/sin(1x) +...+ 1/sin(nx); Домашнее задание: Даны натуральное число n. Выдать на экран последовательность чисел: 1, 2, 3, ... , n; 1, 1/2, 1/3, ... , 1/n;