ВВЕРХ
ВНИЗ

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

Здравствуйте. Оператор цикла с параметром используется в тех случаях, когда некоторое однообразное действие надо повторить определенное количество раз. Особенно, если это количество достаточно велико. Бывают же такие задачи, когда необходимо, например, вычислить сумму каких-либо величин, каждая из которых вычисляется по формуле. Ведь если непосредственно вычислять сумму 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  
2  
3  
4  
5  
6  
7  
8  
9  
10  
var
  i, sum: integer;

begin
  sum := 0; //Начальное значение суммы
  for i := 1 to 1000 do
    sum := sum + i; //К сумме прибавляем i
  writeln('Результат: ', sum);
  readln
end.

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

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

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

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

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

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


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

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

Код Pascal
1  
2  
3  
4  
5  
6  
7  
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
1  
2  
3  
4  
5  
6  
7  
var
  n: byte;

begin
  for n := 12 to 25 do writeln(n);
  readln
end.


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

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

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
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 = 2t2 + 5.5t - 2, если t = x + 2.

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
var
  x, t: integer;
  y: real;

begin
  for x := 4 to 28 do
  begin
    t := x + 2;
    y := 2 * t * t + 5.5 * t - 2;
    writeln(' x = ', x:2, ',    y = ', y)
  end;
  readln
end.

2, 3 строки. Описываем x, t как целые, а y – вещественную;

6 строка. Изменяем x в указаных в условии пределах [4, 28];

8 строка. Предварительно вычисляем t, используя значение x;

9 строка. Вычисляем y, подставляя найденное ранее t;

10 строка. Выводим значения x и y.


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

 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
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
var
  i: integer;
  sum: real;

begin
  sum := 0; //Начальное значение суммы
  for i := 1000000 downto 1 do
    sum := sum + 1/i; //К сумме прибавляем 1/i
  writeln('Результат: ', sum);
  readln
end.

А вот как эта задача решается с циклом первого типа, посмотрите на странице for 10-14. Только нужно иметь ввиду, что, хотя гармонический ряд и является расходимым – его частичные суммы стремятся к бесконечности при неограниченном возрастании членов) – но растет гармонический ряд очень медленно.

Вообще, в каждом отдельном случае нужно решать, какой цикл с параметром использовать лучше – с возрастающим или убывающим параметром. В разделе Задачника в группе "for" есть много примеров на тему цикла с параметром, например, Функции с использованием факториала. А пока на этом все, если есть вопросы или пожелания, пишите в комментариях.


Яндекс.Метрика