Инструкции циклов

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

Алгоритм, в котором есть последовательность операций, которая должна быть выполнена несколько раз, называется циклическим, а последовательность операций именуется циклом. В языке FPC для реализации циклов предусмотрены инструкции:

  • for для циклов с заранее известным числом повторений,
  • while…do и repeat…until для циклов с заранее неизвестным числом повторений.

Инструкция цикла for…to…do

Инструкция предназначена для организации циклов с заранее известным числом повторений. В нем каждый проход цикла нумеруется индексной переменной i. В этой инструкции используется инкрементный вариант изменения индекса цикла, когда индексная переменная i при новом проходе цикла увеличивается c шагом 1. Формат инструкции

for i:=<Начало> to <Конец> do <Инструкция>;

Требования и особенности:

  • Переменная цикла i должна быть порядкового типа.
  • Значение <Конец> должно быть не меньше значения <Начало>.
  • Переменная цикла i должна быть объявлена в том же блоке, где находится инструкция цикла.
  • Если в теле цикла требуется выполнить несколько инструкций, то их следует превратить в составную инструкцию, используя блок begin…end.
  • Нельзя в теле цикла менять значение переменной цикла. Компилятор расценивает такое действие, как ошибку. Будьте внимательны.
  • При естественном завершении цикла переменная цикла i объявляется не определенной.
  • При принудительном завершении цикла с помощью инструкции перехода goto переменная цикла i сохраняет значение, имевшееся на момент перехода.

pascal104

Пример. Расчет числа e=2.87… по формуле разложения в бесконечный ряд с использованием инкрементного цикла. При расчете используем N членов ряда exp(x)=1 + x +  x2/2! + … + xn/n!  + ….

program InkrementTsikl;

{$mode objfpc}{$H+}
uses SysUtils, RusTrans;              // Ссылка на модули
var
x,Prod,Sum:real;                    // Аргумент, числитель, результат
N,Fact,i:integer;                     // Число членов ряда, факториал, индекс
begin
writeln(Rus(‘Введите x и N’));    // Приглашение
readln(x,N);                           // Ввод данных
Sum:=1;                                 // Инициализация
Prod:=1;
Fact:=1;
for i:=1 to N-1 do                  // Повторять в цикле
begin
Fact:=Fact*i;              // Очередной факториал
Prod:=Prod*x;
Sum:=Sum+Prod/Fact;
end;
writeln(‘Sum=’,Sum);             // Вывод результата
readln;                             // Пауза, чтобы увидеть результат
end.

Инструкция цикла for…downto…do

Инструкция предназначена для организации циклов с заранее известным числом повторений. В ней каждый проход цикла нумеруется индексной переменной. В этой инструкции используется декрементный вариант изменения индекса цикла, когда индексная переменная при новом проходе цикла уменьшается c шагом 1. Формат инструкции

for i:=<Началj > downto <Конец > do <Инструкция>;

pascal105

Требования к инструкции такие же, как для инкрементного цикла. Только значение <Конец> должно быть не больше значения <Начало>. Пример. Программа моделирует обратный отсчет времени перед пуском ракеты.

program DekrementTsikl;

{$mode objfpc}{$H+}
uses SysUtils, RusTrans;                         // Ссылка на модули
var Seconds:Integer;
begin
writeln(Rus(’Обратный отсчет времени’));       // Вывод заголовка
for Seconds:=10 downto 1 do
writeln(Rus(’Осталось ’), Seconds:3,Rus(’ секунд’));
writeln(Rus(’Пуск’));
readln;                                         // Пауза, чтобы увидеть результат
end.

Инструкция цикла while…do

Инструкция цикла while…do используется в том случае, когда некоторую последовательность действий надо выполнить несколько раз, причем необходимое число повторений во время разработки программы неизвестно и может быть определено только во время работы программы. Типичными примерами использования цикла while..do являются вычисления с заданной точностью, поиск в массиве или в файле. Это инструкция с предусловием, проверка надобности исполнения тела цикла осуществляется перед ним. Возможен случай, когда тело цикла не будет исполнено ни разу. Формат инструкции:

while <Условие> do <Инструкция>;

После do разрешена только одна инструкция. Поэтому, если в теле цикла определено несколько действий, то надо объединить их в один составной блок с помощью скобок begin…end. Алгоритм инструкции

  • Сначала проверяется истинность <Условия>.
  • Пока <Условие> = true (истинно), цикл выполняется.
  • При <Условие> = false (ложно) цикл завершается и выполняется следующая инструкция.

Чтобы тело цикла while…do было выполнено хотя бы один раз, необходимо, чтобы перед выполнением инструкции while…do <Условие> = true.

Пример. Программа определяет число К натуральных чисел, сумма которых не превышает S.

program PredUslovie;

{$mode objfpc}{$H+}
uses SysUtils, RusTrans;              // Ссылка на модули
var
S, K, Sum : Integer;
begin
writeln(Rus‘Введите S’));           // Приглашение
readln(S);                         // Ввод S
K:=0;                               // Начальное значение К.
Sum:=0;                                 // Начальное значение суммы.
while (Sum<=S) do                // Начать цикл
begin
K:=K+1;                    // Получить очередное число
Sum:=Sum+K;           // Сумма чисел
end;                                 // Конец цикла
if S>=0                                  // Проверка суммы и вывод
then writeln(Rus(’Сумма ’),K-1,Rus(’ чисел не превышает ’),S)
else writeln(Rus(’Сумма не может быть отрицательной’));
readln;                             // Пауза, чтобы увидеть результат
end.

pascal106

Инструкция цикла repeat…until

Инструкция repeat…until, как и инструкция while…do, используется в программе в том случае, если необходимо выполнить повторные вычисления (организовать цикл), но число повторений во время разработки программы неизвестно и может быть определено только во время работы программы, т. е. определяется ходом вычислений. Это инструкция с постусловием, в ней один раз тело цикла исполняется без проверок, а затем осуществляется проверка надобности повторного исполнения тела цикла. Формат инструкции

repeat
<Группа инструкций >
until <Условие>;

Repeat и until образуют блочные скобки. Поэтому тело цикла может содержать несколько инструкций. Алгоритм инструкции

  • Сначала выполняются находящиеся между repeat и until инструкции тела цикла.
  • Затем вычисляется <Условие>. Если <Условие> = False (ложно ), то инструкции тела цикла выполняются еще раз.
  • Если <Условие> = True (истинно), то выполнение цикла прекращается и выполняется следующая инструкция.

pascal107

Результат <Условия> должен быть логического типа. Есть опасность зацикливания, если результат выражения не зависит от инструкций тела цикла. Чтобы гарантировать выход из цикла целесообразно проверять число проходов.

Пример. Программа определяет число К натуральных чисел, сумма которых не превышает S.

program PostUslovie;

{$mode objfpc}{$H+}

uses SysUtils, RusTrans;              // Ссылка на модули
var
S, K, Sum : Integer;
begin
writeln(Rus(‘Введите S’));          // Приглашение
readln(S);                         // Ввод S
K:=0;                               // Начальное значение К.
repeat                              // Начать цикл
K:=K+1;                          // Получить очередное число
Sum:=K*(K+1)/2;                 // Сумма чисел
until Sum>S;                          // Конец цикла
if S>=0                                  // Проверка суммы и вывод
then writeln(Rus(’Сумма ’),K-1,Rus(’ чисел не превышает ’),S)
else writeln(Rus(’Сумма не может быть отрицательной’));
readln;                             // Пауза, чтобы увидеть результат
end.

Процедуры Break и Continue

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

program Procedure_v_Tsikl;

{$mode objfpc}{$H+}

uses SysUtils, RusTrans;                    // Ссылка на модули

const

N=10;

var

Mas:array[1..N] of integer;                // Массив чисел

i:byte;                                    // Параметр цикла

Yes:boolean;                               // Признак обнаружения

begin

writeln(Rus(‘Введите массив’));      // Приглашение

for i:=1 to N do                           // Ввод массива чисел

begin

write(‘Mas[',i,']= ‘);

readln(Mas[i]);

end;

Yes:=false;      // Число еще не найдено

for i:=1 to N do

begin

if Mas[i]>=0 then Continue;   // Не отрицательное, дальше

writeln(Rus(’1-е отрицательное число =’),

Mas[i],Rus(‘ Его номер =’),i);

Yes:=true;                  // Признак обнаружения

Break;                        // Завершить цикл

end;

if not Yes                               // Проверка признака

then writeln(Rus(’Отрицательных чисел нет’));                   readln;                                     // Пауза, чтобы увидеть результат

end.

Twitter SEO Community Ваау! News2.ru Chipp Korica SMI2 Google Bookmarks Digg I.ua Закладки Yandex Linkstore Myscoop Communizm Ru-marks Webmarks Ruspace Linkomatic Kli.kz Web-zakladka Zakladok.net Reddit delicious Ma.gnolia Technorati Slashdot Yahoo My Web БобрДобр.ru Memori.ru rucity.com МоёМесто.ru Mister Wong

Copyright © 2009-2010 Программирование на паскале.