В результате работы такой воображаемой структуры мы могли бы получить 10 звездочек на экране, потому что всё, что заключено между началом и концом цикла выполняется несколько раз. Все, что вне этих рамок - только один раз.
Например:
write ('<');
ЦИКЛ 5 раз
write ('Да-');
write ('>');
В результате выполнения этих операторов на экран напечатается следующее:
<Да-Да-Да-Да-Да->
Обратите внимание, что слово "Да" было напечатано 5 раз, а каждая из угловых скобок – только один раз. Почему именно так? Потому что оператор
write('Да-')
выполняется 5 раз, так как он находится внутри цикла, а операторы
write ('<');
и
write('>')
только один, так как он находится вне цикла.
Итак, всё, что находится внутри цикла (для наглядности эта область заключена в рамочку), выполняется несколько раз подряд. Всё что вне цикла – выполняется только один раз.
Однако в Паскале нет оператора цикла "N раз", зато есть три других:
For, While и Repeat (Для, Пока и Повторять).
Из них на наш цикл "N раз" больше всего похож цикл For, c которым мы сейчас и познакомимся.
2.1.Цикл For
Формат записи оператора цикла For:
For<переменная цикла>:=<начальное значение> to <конечное значение> do
<Операторы>;
Примечание.
Операторные скобки begin и end обозначают, соответственно, начало и конец оператора цикла. Все операторы, заключенные между этими словами будут повторены несколько раз. Однако, если между begin и end находится только один оператор, то операторные скобки можно опускать. Но поначалу мы будем все равно их использовать, а для наглядности операторы цикла ещё и обводить рамочкой (но только на бумаге, на компьютере никаких рамочек конечно же рисовать не надо).
Познакомимся с принципом работы этого оператора на уже знакомом примере, который заставит компьютер напечатать 10 звёздочек:
program Zvezdy ;
var i : integer ;
For i := 1 to 10 do
write ('*');
end.
Этот цикл выполнится 10 раз и на экран будет выведено 10 звёздочек. Первая строка со словом For называется заголовком цикла. В нём содержится вся необходимая информация для организации цикла. Подробней и по-русски этот заголовок можно было бы записать так:
Для целой переменной i, которая вначале принимает значение 1, организуем цикл.
После каждого выполнения цикла переменная i будет увеличиваться на единицу, пока не примет конечного значения 10.
После этого цикл выполнится последний раз и больше выполняться не будет.
Начало операторов цикла
напечатать символ ('*')
Конец операторов цикла
Как видите, оператор цикла For не существует сам по себе, а организуется специально для какой-либо целой переменной, которая называется "переменной цикла" или "параметром цикла". Она автоматически увеличивает своё значение после каждого выполнения операторов цикла, пока не примет своего конечного значения. Когда это произойдёт, операторы цикла выполнятся последний раз и выполнение цикла закончится. Переменную цикла можно использовать внутри цикла как обычную переменную. Однако, ей нельзя ничего присваивать, ведь не зря же для неё организовали целый цикл! Организаторы сами следят за значением этой переменной…
В зависимости от начального и конечного значения параметра цикла, которые задаются в заголовке, цикл может выполнится то или иное количество раз. Например, если начальное и конечное значения совпадают, то цикл выполнится только один раз. Если же начальное значение превышает конечное, то цикл не выполнится ни разу! Вот так цикл!..
А сколько раз выполнится циклы со следующими заголовками:
for i := 5 to 9 do
for i := 0 to 8 do
for i := -1 to 10 do
for i := 100 to 200 do
for i := 0 to 0 do
Итак, ещё раз, запомните! Оператор цикла является замкнутой структурой, поэтому все, что не входит в этот оператор цикла, выполняется один раз! Например:
program For_Demo;
var i : integer;
write ('<');
for i := 1 to 5 do
write ('Да-')
end;
write ('>')
end.
Знакомый пример, не правда ли? Объясните, как будет выполняться эта небольшая программа и что будет выведено на экран.
Как вы уже заметили, <переменная цикла> – это любая переменная целого типа (например: integer, byte, word и др. целые типы). Её значение в цикле всё время изменяется. Сначала оно равно начальному значению, которое указывается в заголовке цикла, потом каждый раз увеличивается на единицу, пока не примет конечного значения, которое тоже указывается в заголовке. В самом цикле эта переменная может быть использована для каких-либо целей. Давайте составим программу, которая будет выводить значение этой переменной при каждом выполнении цикла, тогда мы сами сможем увидеть подтверждение теоретических умозаключений на практике.
program For_and_i;
var i : integer;
for i := 1 to 5 do
writeln (i)
end.
На экран напечатается 5 чисел (потому что этот цикл выполняется 5 раз).
Каждое число – есть значение переменной цикла при очередном выполнении тела цикла.
Можно придать этой программе некоторый практический смысл, если выводить на экран не только целые числа, но и их квадраты – получим таблицу квадратов первых пяти чисел. Смотрите, как изменится программа:
program Numbers_and_them_squares;
var i, s : integer;
for i := 1 to 5 do
write (i, '*', i);
s := i*i;
writeln (' = ', s)
end.
Вот что мы получим в результате работы программы:
1*1 = 1
2*2 = 4
3*3 = 9
4*4 = 16
5*5 = 25
Значение переменной цикла может использоваться и для более полезных действий, но ни в коем случае не может быть изменено её значение. В этом смысле параметр цикла можно сравнить с музейной диковинкой на которой висит табличка:
Руками не трогать!
Все могут смотреть, но никто, кроме служебных работников, трогать не может!
Существует ещё одна разновидность цикла For, в котором вместо служебного слова to используется downto. В этом случае переменная цикла будет каждый раз уменьшать своё значение, а не увеличивать. Например, цикл
For i := 5 downto 1 do
write (i, ’ ’);
напечатает:
5 4 3 2 1
Вначале переменная цикла была равна начальному значению, которое больше конечного, а после каждого выполнения цикла её значение уменьшалось.
Примечание.
По поводу синтаксиса языка Паскаль часто возникает такой
Вопрос: А надо ли ставить точку с запятой после слова do?
Ответ: Нет, ни в коем случае.
Вопрос: Почему?
Ответ: Потому что в этом месте ещё не закончен оператор цикла. После служебного слова do нужно указать оператор, который и будет телом цикла. Если вы поставите здесь точку с запятой, то компьютер посчитает, что телом цикла является пустой оператор и спокойно будет выполнять его (то есть ничего не выполнять) необходимое число раз. А то, что вы хотели записать в теле цикла, будет выполнено как обычный оператор – только один раз. Например:
For i := 1 to 10 do ; {Тело цикла – пустой оператор}
Writeln (i);
Вместо ожидаемых 10 чисел на экран выведется только одно число – число 10 – это то значение, которое принимает переменная i по завершению работы цикла.
Параметр цикла может быть не только числом, но и символом. В этом случае начальные и конечные значения тоже должны быть символами, а переменная цикла будет перебирать все значения между ними в том порядке, в каком они указаны в таблице ASCII.
program Abc;
var c : char;
For c := ’a’ to ’z’ do
write (c); { выводим буквы в строчку }
end.
На экране будет напечатан весь английский алфавит в одну строчку:
abcdefghijklmnopqrstuvwxyz
Попробуйте так изменить эту программу, чтобы алфавит выводился большими буквами.
2.2.Нахождение суммы
Циклы часто используют для нахождения суммы каких-либо последовательностей. Например, сумму натуральных чисел от 1 до 10. Можно, конечно, решить эту задачу таким способом:
s := 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 ;
Но у этого способа есть два недостатка:
1. Решение громоздко и банально.
2. Решение не поддается корректировке. Например, если мы захотим изменить эту программу так, чтобы она находило сумму первых 100 натуральных чисел, то размер программы увеличится почти в 10 раз.
Поэтому такую задачу лучше решать с использованием цикла. Решать будем по такой общей схеме: