63. Анализ работы программ, содержащих циклы с заданным числом повторений

63. Анализ работы программ, содержащих циклы с заданным числом повторений

Цикл с заданным числом повторений (цикл-ДЛЯ) программируется в языке Паскаль с помощью оператора for. Его общий вид:

for <параметр>:=<начальное_значение> to <конечное_значение> do <оператор>

Здесь:

<параметр> — переменная целого типа;
<начальное_значение> и <конечное_значение> — выражения того же типа, что и параметр, вычисляемые перед началом цикла;
<оператор> — простой или составной оператор — тело цикла.

При выполнении этого оператора после каждого выполнения тела цикла происходит увеличение на единицу параметра цикла; условием выхода из цикла является превышение параметром конечного значения.

Запишем на языке Паскаль рассмотренный в п. 2.4.3 (пример 19) алгоритм вычисления степени с натуральным показателем n для любого вещественного числа а.

program n_16;
var i, n: integer; a, y: real;
begin
writeln ('Возведение в степень');
write ('Введите основание а>>');
readln (а);
write ('Введите показатель n>>');
readln (n);
у:=1;
for i:=1 to n do y:=y*a;
writeln ('y=', y)
end.

Домашнее задание

Выучить §3.5.3 «Программирование циклов с заданным числом повторений»

Повторить §3.5.1,§3.5.2

Выполнить №№ 10,11,12,13 к §3.5

Оператор цикла с параметром for

Оператор цикла с параметром используется в тех случаях, когда некоторое однообразное действие надо повторить определенное количество раз. Особенно, если это количество достаточно велико. Бывают же такие задачи, когда необходимо, например, вычислить сумму

каких-либо величин, каждая из которых вычисляется по формуле. Ведь если непосредственно вычислять сумму 1 + 2 + 3 + ... + 1000, то программа разрастется до невообразимых масштабов.

Оператор цикла с параметром в народе ещё называют "оператор For", и в Pascal он бывает двух типов (второй тип смотрите ниже). Первый записывается так:

for i := N1 to N2 do <ОПЕРАТОР>

Всё, что находится между for и do, называется заголовком цикла, после do – телом цикла.

Переменная i зазывается параметром цикла и имеет порядковый тип (целые числа, логический тип, символы, перечислимый и диапазонный тип). Слова for, to и do – это служебные слова Pascal, которые использовать в своих программах для обозначения переменных нельзя. Индекс i, которым обозначаются номера действий в операторе цикла, изменяется от меньшего N1 к большему N2 (N1 ≤ N2). Первый номер N1 по значению не должен превышать второй N2, иначе цикл не запустится и ОПЕРАТОР ни разу не выполнится.

Важно помнить: ИЗМЕНЯТЬ ПАРАМЕТР ЦИКЛА i В ТЕЛЕ ЦИКЛА НЕЛЬЗЯ! — это вызовет ошибку.

Оператор цикла этого типа действует как:

— сначала индекс i приравнивается N1 – минимальному возможному значению;

— потом проверяется, не превышает ли i второго номера N2 (i ≤ N2). Если это условие выполняется, то идем на следующий пункт, иначе (то есть при i > N1) – выходим из цикла;

— выполняется ОПЕРАТОР в теле цикла;

— далее увеличивается i на 1, и повторяем со второго пункта (т.е. проверяем истинность условия i ≤ N2, выполняем оператор, увеличиваем i на 1, и т.д).

В роли начального значения N1 наиболее часто используют 1 или 0 (это зависит от задачи).

Приведем пример с вычислением упомянутой ранее суммой 1 + 2 + 3 + ... + 1000 первых 1000 натуральных чисел. Поскольку нужно сложить числа от 1 до 1000 включительно, то было бы естественно изменять индекс i от 1 до 1000. Тогда на каждой итерации цикла (при каждом

выполнении) искомую сумму, которую мы обозначим sum, будем увеличивать на i. Вот, что у нас получится.

Посчитать сумму первых 1000 натуральных чисел

Код Pascal

  1. var

  2. i, sum: integer;

  3. begin

  4. sum := 0; //Начальное значение суммы

  5. for i := 1 to 1000 do

  6. sum := sum + i; //К сумме прибавляем i

  7. writeln('Результат: ', sum);

  8. readln

  9. end.

После запуска программы вы должны увидеть результат: 500500. Что делает наша программа?

2 строка. Описываем переменные i (параметр цикла) и sum (конечная сумма) как целые;

4 строка. Начальному значению суммы sum присваиваем 0. Это называется инициализация начальной переменной;

5 строка. Числа будем складывать от 1 до 1000;

6 строка. На каждой последующей итерации цикла к сумме прибавляем i;

7 строка. После выхода из цикла (когда будет i = 1000) выводим конечный результат суммы.

Решим ещё одну простенькую задачку:

Напечатать ряд чисел 20 в виде: 20 20 20 20 20 20 20 20 20 20.

Код Pascal

var

i: byte;

begin

for i := 1 to 10 do write(' ', 20);

readln

end.

Мы видим, что количество выводимых чисел равно 10, поэтому запускаем цикл от 1 до 10, и выводим число 20 оператором вывода write(). Обратите внимание, что величина индекса изменяется лишь в пределах [1, 10], поэтому не имеет смысла использовать целый тип integer – достаточно обойтись типом byte (8 бит, или 1 байт). Особенность этого примера в том, что код программы не содержит переменной i в теле цикла (напоминаю, тело цикла – часть программы после do) – мы просто выводили несколько раз число 20. Бывает, когда параметр цикла используется в теле цикла, но во многих простеньких программах его использование лишнее.

А вот пример простой задачи, когда параметр цикла используется:

Напечатать "столбиком" все целые числа от 12 до 25. Если промежуточное выводимое число обозначить n, то изменяя его с 12 по 25 включительно, выведем все числа. Только здесь нужно задействовать оператор вывода writeln – с переводом курсора на следующую строку.

Код Pascal

var

n: byte;

begin

for n := 12 to 25 do writeln(n);

readln

end.

И ещё один пример:

Напечатать таблицу умножения на 7.

Код Pascal

var

i: byte;

begin

for i := 1 to 10 do

writeln('7 × ', i, ' = ', 7 * i);

readln

end.

Вместо "крестика" (знак умножения) можете использовать что-либо другое например, клавиатурные "звездочку" или букву "x". После запуска программы у вас должно получится так:

  • 7 × 1 = 7

  • 7 × 2 = 14

  • 7 × 3 = 21

  • 7 × 4 = 28

  • 7 × 5 = 35

  • 7 × 6 = 42

  • 7 × 7 = 49

  • 7 × 8 = 56

  • 7 × 9 = 63

  • 7 × 10 = 70

Если вместо ОПЕРАТОРА в теле цикла необходимо выполнить несколько операторов, то их нужно заключить в операторные скобки BEGIN ... END, и разделить между собой точкой с запятой (в конце последнего оператора, перед закрывающим end, точку с запятой ставить не обязательно). Образованная таким образом конструкция из нескольких операторов называется составным оператором:

for i := N1 to N2 do

begin

<ОПЕРАТОР 1>;

<ОПЕРАТОР 2>;

<ОПЕРАТОР 3>;

............

<ОПЕРАТОР k>

end.

Операторы в составном операторе в цикла выполняются один за другим, после чего по возможности производится переход на следующую итерацию. Наведем примеры.

Рассчитать значения y для значений х, равных 4, 5, ..., 28: y = 2t 2 + 5.5t - 2, если t = x + 2.

Код Pascal

var

x, t: integer;, y: real; { Описываем x, t как целые, а y – вещественную;}

begin

for x := 4 to 28 do {Изменяем x в указанных в условии пределах [4, 28];}

begin

t := x + 2; {Предварительно вычисляем t, используя значение x;}

y := 2 * t * t + 5.5 * t - 2; {Вычисляем y, подставляя найденное ранее t;}

writeln(' x = ', x:2, ', y = ', y) {Выводим значения x и y.}

end;

readln

end.

Синтаксис другого типа оператора цикла с параметром задается следующим образом:

for i := N1 downto N2 do <ОПЕРАТОР>

Отличие этого цикла от первого только в том, что значение индекса i не увеличивается, а уменьшается (на это указывает английское слово down, означающе "вниз"). Таким образом, начальное значение N1 параметра цикла i должно быть НЕ МЕНЬШЕ конечного N2 (N1 ≥ N2), ибо в противном случае цикл ни разу не выполнится.

Для примера решим такую задачу:

Вычислить сумму первых 1000000 членов гармонического ряда. Гармоническим рядом в математике называют ряд, составленный из чисел, обратных к натуральным: 1 + 1/2 + 1/3 + ... + 1/n + ... . По условию нужно сложить первые 1000000 (один миллион) членов, только мы это сделаем в обратном по отношению к указанному выше порядке: 1/1000000 + 1/999999 + ... + 1/3 + 1/2 + 1.

Код Pascal

var

i: integer;

sum: real;

begin

sum := 0; //Начальное значение суммы

for i := 1000000 downto 1 do

sum := sum + 1/i; //К сумме прибавляем 1/i

writeln('Результат: ', sum);

readln

end.

А вот как эта задача решается с циклом первого типа.

Только нужно иметь ввиду, что, хотя гармонический ряд и является расходным – его частичные суммы стремятся к бесконечности при неограниченном возрастании членов) – но растет гармонический ряд очень медленно.

Вообще, в каждом отдельном случае нужно решать, какой цикл с параметром использовать лучше – с возрастающим или убывающим параметром.

Циклы с параметром