Программирование. Оператор цикла for - Обработка информации - ИНФОРМАЦИОННЫЕ ПРОЦЕССЫ

Информатика - Новый полный справочник для подготовки к ОГЭ

Программирование. Оператор цикла for - Обработка информации - ИНФОРМАЦИОННЫЕ ПРОЦЕССЫ

Конспект

При написании программы достаточно часто возникает потребность выполнить несколько раз какой-то фрагмент программы. Просто скопировать фрагмент несколько раз — не очень удобная технология, так как её можно использовать только тогда, когда количество повторений известно уже при написании программы и в процессе работы программы не меняется. Но даже в этом случае такой подход неудобен при изменении программы: когда повторяемый фрагмент нужно модернизировать, приходится это делать столько раз, сколько копий его находится в программе, либо удалять старое и копировать заново.

Гораздо более удобная технология, позволяющая повторить некоторое количество команд программы, — использовать цикл.

Цикл представляет собой некую повторяющуюся последовательность действий. Сами повторяющиеся при этом действия принято называть телом цикла.

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

На Паскале для выполнения такого вида цикла используется цикл for. Его ещё иногда называют циклом со счётчиком.

Особенность этого вида цикла состоит в том, что для своего выполнения в цикле for используется специальная переменная, называемая счётчиком цикла. Эта переменная должна быть счётного типа данных, обычно — целочисленная (integer).

Для работы цикла for указываются начальное и конечное значение счётчика.

В начале работы цикла for для счётчика цикла задаётся начальное значение, которое проверяется перед выполнением каждого очередного тела цикла, не изменилось ли это значение дальше конечного. Если значение счётчика не изменилось дальше конечного значения, то тело цикла выполняется один раз, затем изменяется на 1 значение счётчика и снова происходит его сравнение с конечным значением.

На Паскале это записывается следующим образом:

Например:

Рассмотрим, как выполняется данный цикл.

Значение переменной i устанавливается равным 4.

Проверяется, не превысило ли значение переменной i конечного значения 6.

Не превысило, поэтому выполняется тело цикла — на экран выводится текущее значение переменной i (4).

Тело цикла (состоящее из одной команды writeln (i)) выполнилось, значит, переменная-счётчик цикла i увеличивается на 1 и становится равна 5.

Проверяется, не превысило ли значение переменной i конечного значения 6.

Не превысило, поэтому выполняется тело цикла — на экран выводится текущее значение переменной i (5).

Тело цикла (состоящее из одной команды writeln (i)) выполнилось, значит, переменная-счётчик цикла i увеличивается на 1 и становится равна 6.

Проверяется, не превысило ли значение переменной i конечного значения 6.

Не превысило, поэтому выполняется тело цикла — на экран выводится текущее значение переменной i (6).

Тело цикла (состоящее из одной команды writeln (i)) выполнилось, значит, переменная-счётчик цикла i увеличивается на 1 и становится равна 7.

Проверяется, не превысило ли значение переменной i конечного значения 6.

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

Заметим, что при программировании на Паскале лучше не использовать значение переменной-счётчика цикла после окончания цикла. Потому что, с одной стороны, в середине 90-х был принят новый стандарт языка Паскаль, который регламентирует данное значение. С другой стороны, до этого момента считалось, что переменная-счётчик цикла for после его окончания не определена. На всякий случай, лучше подстраховываться и считать, что она не определена.

Существует другая форма оператора for. В ней вместо служебного слова to используется служебное слово downto. В этом случае счётчик цикла на каждом шаге изменяется не на +1, а на —1. И при сравнении с конечным значением, соответственно, проверяется обратный знак (≥).

Например, цикл:

выведет на экран последовательность цифр 9, 8, 7, ..., 1 вертикально.

В качестве тела цикла for, как и после then и после else, должен быть написан только один оператор. Чтобы в качестве тела цикла написать несколько операторов, их необходимо объединить в операторную скобку (begin-end).

Пример.

Фрагмент программы выводит на экран последовательность степеней числа 10 от 0-й до 8-й:

На экран будет выведено:

1 10 100 1000 10000 100000 1000000 10000000

В приведённом фрагменте программы используется очень важная и популярная технология порождения последовательности чисел. Во вспомогательную переменную а записывается начальное значение, равное нужному начальному значению элемента последовательности. В цикле это значение сначала выводится на экран, потом изменяется таким образом, чтобы на следующем шаге цикла оказаться равным следующему элементу последовательности. В данном случае, каждый последующий элемент последовательности можно было получить из текущего, умножив его на 10. Поэтому в программе на каждом шаге значение переменной а умножается на 10.

В теле цикла очень важен порядок команд. Если поменять местами строки (вывод на экран и изменение переменной а), то выводимая последовательность будет неверной. Начальное значение последовательности (число 1) пропадёт, зато в конце будет выведено одно лишнее значение (108).

Разбор типовых задач

Задача 1. Запишите значение переменной s, полученное в результате работы следующей программы. Текст программы приведён на трёх языках программирования.

Алгоритмический язык

Бейсик

Паскаль

Решение

Среди приведённых языков программирования нужно, конечно, выбрать тот, который вы лучше всего знаете. В нашем случае это Паскаль.

Выполним подробную и полную трассировку программы.

Составим таблицу трассировки, в которую будем записывать оператор программы, выполняемый в настоящий момент, и условие, если оно проверяется в этом операторе. Заведём столбцы для всех переменных, использующихся в программе. Столбец пояснений приведём только для обучения. При выполнении трассировки его записывать не надо.

Оператор

Условие

Переменные

Пояснения

s

k

s:=0;


0


Переменная s получает начальное значение, равное нулю.

for k:=9 to 12 do

9≤ 12? Да


9

Переменная k (счётчик цикла) получает начальное значение цикла (9). И сразу проверяется, можно ли выполнять тело цикла (значение счётчика цикла к все ещё не больше конечного значения?).

Да, не больше. Значит, выполняем тело цикла.

s:=s+8;


8


Тело цикла состоит из одной команды. К текущему значению переменной s(0) прибавляется число 8 и результат (8) записывается обратно в переменную s.

for k:=9 to 12 do

10 ≤ 12? Да


10

Тело цикла закончилось. Программа снова возвращается в строку for.... Счётчик цикла к увеличивается на 1 (становится равным 10) и снова проверяется, можно ли выполнять тело цикла (k ≤ 12?). Да. Снова выполняем тело цикла.

s:=s+8;


16


К текущему значению переменной s (8) прибавляется число 8 и результат (16) записывается обратно в переменную s.

for k:=9 to 12 do

11 ≤ 12? Да


11

Тело цикла закончилось. Программа снова возвращается в строку for.... Счётчик цикла к увеличивается на 1 (становится равным 11) и снова проверяется, можно ли выполнять тело цикла (k ≤ 12?). Да. Снова выполняем тело цикла.

s:=s+8;


24


К текущему значению переменной s (16) прибавляется число 8. Результат (24) записывается обратно в переменную s.

for k:=9 to 12 do

12 ≤ 12? Да


12

Тело цикла закончилось. Программа снова возвращается в строку for.... Счётчик цикла к увеличивается на 1 (становится равным 12) и снова проверяется, можно ли выполнять тело цикла (k ≤ 12?). Да. Снова выполняем тело цикла.

s:=s+8;


32


К текущему значению переменной s (24) прибавляется число 8. Результат (32) записывается обратно в переменную S.

for k:=9 to 12 do

13 ≤ 12? Да


13

Тело цикла закончилось. Программа снова возвращается в строку for.... Счётчик цикла к увеличивается на 1 (становится равным 13) и снова проверяется, можно ли выполнять тело цикла (k ≤ 12?).

Нет. Значит, тело цикла больше не выполняется. Цикл закончился. Программа переходит на строчку, записанную после тела цикла.

writeln (s) ;




На экран выводится текущее значение переменной s — число 32.

Ответ: 32.

Возможно, использование такой подробной трассировки покажется трудоёмким и долгим способом, но он позволяет минимизировать ошибки и понять, что же делает программа. Мы рекомендуем сначала хорошо освоить полную трассировку. И только после устойчивого хорошего результата переходить к использованию сокращённых и быстрых методов решения подобных задач.

Другой способ решения

Анализируем программу и обнаруживаем, что к начальному значению переменной s на каждом шаге цикла прибавляется одно и то же число (8). Из курса начальной школы нам известно, что если одно и то же число складывается определённое число раз — это операция умножения. Значит, остаётся понять, сколько раз прибавляется число 8. Это столько же раз, сколько выполняется тело цикла. Тело цикла выполняется при значениях переменной k от 9 до 12.

Задача посчитать, СКОЛЬКО раз выполняется цикл от 9 до 12, к сожалению, часто вызывает ошибку у начинающих, которые выдают ответ 3 (12 минус 9). Нетрудно посчитать, что это неверно. Чтобы не ошибиться, мы рекомендуем просто загибать пальцы при каждом значении переменной k: 9, 10, 11, 12. Всего получилось 4. Правильная формула — конечное значение минус начальное значение плюс один!

Итак, мы получили, что цикл выполняется 4 раза, и каждый раз к переменной s прибавляется число 8. То есть, переменная s увеличивается на 4 ∙ 8 = 32.

Её начальное значение равно 0.

0 + 32 = 32.

Ответ: 32.

Если в теле цикла значение переменной меняется более сложным образом (например, s := s + k;), мы рекомендуем также воспользоваться трассировкой. Научившись без ошибочно справляться с подробной трассировкой и хорошо понимать, как что делается, можете использовать сокращённую версию, без записи текущей команды и проверяемого условия.

Задача 2. Запишите значение переменной s, полученное в результате работы следующей программы. Текст программы приведён на трёх языках программирования.

Алгоритмический язык

Бейсик

Паскаль

Решение

Покажем, как составляется сокращенная таблица сортировки:

Переменные

Пояснения

s

k

0


Переменная s получает начальное значение, равное нулю.


7

Переменная k (счётчик цикла) получает начальное значение цикла (7). И сразу проверяется, можно ли выполнять тело цикла (значение счётчика цикла k все ещё не больше конечного значения?).

Да, не больше. Значит, выполняем тело цикла.

7


Тело цикла состоит из одной команды. К текущему значению переменной s (0) прибавляется значение переменной k (7) и результат (7) записывается обратно в переменную s.


8

Тело цикла закончилось. Программа снова возвращается в строку for.... Счётчик цикла к увеличивается на 1 (становится равным 8) и снова проверяется, можно ли выполнять тело цикла (k ≤ 10?).

Да. Снова выполняем тело цикла.

15


К текущему значению переменной s (7) прибавляется значение переменной k (8) и результат (15) записывается обратно в переменную s.


9

Тело цикла закончилось. Программа снова возвращается в строку for.... Счётчик цикла к увеличивается на 1 (становится равным 9) и снова проверяется, можно ли выполнять тело цикла (k ≤ 10?).

Да. Снова выполняем тело цикла.

24


К текущему значению переменной s (15) прибавляется значение переменной k (9) и результат (24) записывается обратно в переменную s.


10

Тело цикла закончилось. Программа снова возвращается в строку for.... Счётчик цикла к увеличивается на 1 (становится равным 10) и снова проверяется, можно ли выполнять тело цикла (k ≤ 10?).

Да. Снова выполняем тело цикла.

34


К текущему значению переменной s (24) прибавляется значение переменной k (10) и результат (34) записывается обратно в переменную s.

11


Тело цикла закончилось. Программа снова возвращается в строку for.... Счётчик цикла к увеличивается на 1 (становится равным 11) и снова проверяется, можно ли выполнять тело цикла (k ≤ 10?).

Нет. Значит, тело цикла больше не выполняется. Цикл закончился. Программа переходит на строчку, записанную после тела цикла.



На экран выводится текущее значение переменной s — число 34.

Ещё раз обратите внимание! Сначала следует научиться выполнять полную трассировку, и только потом переходить к использованию сокращённой!