Инструкциюfor можно реализовать двумя способами.
Цикл представляет собой последовательность операторов, которая выполняется неоднократно.
Операторы организации циклов. Простой и составной операторы
В программах, связанных с обработкой данных или другими сложными вычислениями, часто выполняются циклически повторяющиеся действия.
В языке программирования Pascal имеется стандартный набор из трех разновидностей цикла —
1. цикл с постусловием (инструкция repeat),
2. цикл с предусловием (инструкция while)
3. цикл со счетчиком (инструкция for).
Следует знать:
· подавляющее большинство задач с циклами можно решить разными способами, используя при этом любой из трех операторов цикла;
· часто решения, использующие разные операторы цикла, оказываются равноценными, однако в некоторых случаях все же предпочтительнее использовать какой-то один из операторов;
· самым универсальным из всех операторов цикла считается while, поэтому в случае затруднений с выбором можно отдать предпочтение ему;
|
|
· цикл repeat имеет очень простой и понятный синтаксис, поэтому с него удобно начинать изучение циклов;
· цикл for обеспечивает удобную запись циклов с заранее известным числом повторений;
· при неумелом использовании циклов любого типа возможна ситуация, когда компьютер не сможет нормально закончить цикл (в таком случае говорят, что программа "зациклилась'). При работе в среде Turbo Pascal для выхода из подобной ситуации используется комбинация клавиш <Ctrl>+<Break>; если это не помогает, есть и крайнее средство — <Ctrl>+<Alt>+<Del>. Одновременное нажатие этих трех клавиш или кнопки Reset, расположенной на системном блоке, позволяет перезагрузить компьютер, при этом данные, относящиеся к работающей программе, будут утеряны.
Цикл с параметром (со счетчиком, с заданным числом повторений)
В нем важную роль играет переменная-параметр, которая на каждом шаге цикла автоматически изменяет свое значение ровно на единицу — поэтому ее и называют счетчиком.
Вариант 1 (с увеличением счетчика):
for Счетчик:=НачальноеЗначение to КонечноеЗначение do
begin
{ Инструкции }
end;
Строка, содержащая for...do, называется заголовком цикла, оператор, стоящий после do, образует его тело. Очень часто тело цикла — составной оператор. Если тело цикла представлено одиночным оператором, то begin и end не пишутся.
Язык Турбо Паскаль не накладывает никаких ограничений на характер операторов, входящих в составной оператор. Среди них могут быть и другие составные операторы - Турбо Паскаль допускает произвольную глубину их вложенности:
Фактически, весь раздел операторов, обрамленный словами begin...end,представляет собой один составной оператор. Поскольку зарезервированное слово end является закрывающей операторной скобкой, оно одновременно указывает и конец предыдущего поэтому ставить перед ним символ “;” необязательно. Наличие точки с запятой перед end означает, что между последним оператором и операторной скобкой end располагается пустой оператор.
|
|
Пустой оператор не содержит никаких действий, просто в программу добавляется лишняя точка с запятой. В основном пустой оператор используется для передачи управления в конец составного оператора.
Инструкции между begin и end выполняются такое число раз, какое определяет выражение [(КонечноеЗначение - НачальноеЗначение) + 1].
Это соответствует всем значениям счетчика от начального до конечного включительно.
Если НачальноеЗначение больше, чем КонечноеЗначение, то инструкции
между begin и end не выполняются ни разу.
Например, выполнение цикла
for i:=10 to 14 do write(i: 3);
выведет на экран последовательность чисел в виде:
10 11 12 13 14
Вариант 2 (с уменьшением счетчика):
for Счетчик:=НачальноеЗначение downto КонечноеЗначение do
begin
{ Инструкции }
end;
Инструкции между begin и end выполняются такое число раз, какое определяет выражение [(НачальноеЗначение - КонечноеЗначение) + 1].
Если НачальноеЗначение меньше, чем КонечноеЗначёние, то инструкции между begin и end не выполняются ни разу. Например, выполнение цикла
for i:=14 downto 10 do write(i: 3);
выведет на экран последовательность цифр в виде: 14 13 12 и 10. Если переменная-счетчик имеет символьный тип char, то оператор
for ch: = 'a' to 'е' do write (ch: 2);
выведет на экран последовательность букв в виде: abсde
а оператор
for ch:= 'е' downto 'a' do write (ch: 2);
выведет на экран последовательность букв в виде: е d с b а
Следует знать:
□ оператор (инструкция) for используется для организации циклов с фиксированным, заранее известным или определяемым во время выполнения программы числом повторений;
□ переменная-счетчик должна быть порядкового типа: чаще — целочисленная, реже — символьного, логического или перечисляемого типов. Использование вещественного типа недопустимо;
□ начальное и конечное значения параметра цикла могут быть константами, переменными, выражениями и должны принадлежать к одному и тому же типу данных. Начальное и конечное значения параметра цикла нельзя изменять во время выполнения цикла;
□ после нормального завершения оператора for значение параметра цикла равно конечному значению (в некоторых компиляторах (Delphi) — на единицу больше). Если оператор for не выполнялся, значение параметра цикла не определено;
□ параметр цикла for может изменяться (увеличиваться или уменьшаться) каждый раз при выполнении тела цикла только на единицу. Если нужен другой шаг изменения параметра, предпочтительнее циклы repeat и while.
Например, рассмотрим фрагмент программы, в котором предпринята попытка "обмануть" оператор for и получить изменение параметра i на 2 на каждом шаге цикла (единица прибавляется автоматически и еще одна единица прибавляется в теле цикла).
for i:= 1 to 10 do
begin
write(i:4);
i:= i + 1;
end;
В данном случае на экране будут выведены числа
1 3 5 7 9
Однако настоятельно не рекомендуем пользоваться таким приемом. Стоит только немного видоизменить заголовок цикла предыдущего примера и взять в качестве конечного значения 9, а не 10: for i:= i to 9 do, как ваша программа не сможет нормально выйти из цикла — "зациклится", т. к. в момент проверки условия выхода из цикла i никогда не будет равно 9 (сначала 8, а потом сразу 10). Компилятор Delphi вообще не допускает подобных действий.
Для досрочного выхода из цикла можно использовать оператор goto или стандартную процедуру break. Стандартная процедура continue позволяет прервать выполнение тела любого цикла и передает управление на его заголовок, заставляя цикл немедленно перейти к выполнению следующего шага.
|
|
Вложенные циклы
В теле любого оператора цикла могут находиться другие операторы цикла. При этом цикл, содержащий в себе другой, называют внешним, а цикл, находящийся в теле первого, — внутренним (вложенным). Правила организации внешнего и внутреннего циклов такие же, как и для простого цикла.
Обратите внимание — при программировании вложенных циклов необходимо соблюдать следующее дополнительное условие: все операторы внутреннего цикла должны полностью располагаться в теле внешнего цикла.
Рассмотрим задачу вывода на экран таблицы умножения, решение которой предполагает использование вложенных циклов. С использованием цикла for соответствующий фрагмент программы имеет вид:
Var
i, j: byte;
begin
for i:=l to 9 do
begin
for j:=1 to 9 do write(i, '*', j, ' = ', i*j:2);
writeln; {перевод строки — во внешнем цикле}
end;
end.
При вложении циклов внутренний цикл выполняется полностью от начального до конечного значения параметра при неизменном значении параметра внешнего цикла. Затем значение параметра внешнего цикла изменяется на единицу, и опять от начала и до конца выполняется вложенный цикл. И так до тех пор, пока значение параметра внешнего цикла не станет больше конечного значения, определенного в операторе for внешнего цикла.