Ивт-20 / САОД и др / ОЗО_2010-САОД_2 / Методический материал / Цикл
.docЦиклы
Алгоритмы решения многих задач являются циклическими, т. е. для достижения результата определенная последовательность действий должна
Алгоритм, в котором есть последовательность операций (группа инструкций), которая должна быть выполнена несколько раз, называется циклическим, а сама последовательность операций именуется циклом.
В Delphi можно использовать 3 типа циклов: for, while и repeat.
Инструкция for
Инструкция for используется в том случае, если некоторую последовательность действий (инструкций программы) надо выполнить несколько раз, причем число повторений заранее известно.
Алгоритм, соответствующий инструкции for, представлен на рис. 1.Если начальное значение счетчика больше конечного значения, то последовательность операторов между begin и end не будет выполнена ни разу. После каждого выполнения инструкций тела цикла счетчик циклов увеличивается автоматически.
Рис1
В общем виде инструкция for записывается следующим образом:
for счетчик := нач_знач to кон_знач do
begin
// здесь инструкции, которые надо выполнить несколько раз
end
где:
-
счетчик — переменная-счетчик числа повторений инструкций цикла;
-
нач_знач-- выражение, определяющее начальное значение счетчика циклов;
-
кон_знач — выражение, определяющее конечное значение счетчика циклов.
Переменная счетчик, выражения нач_знач и кон_знач должны быть целого типа. Количество повторений инструкций цикла можно вычислить по формуле (кон_знач — нач_знач + l). Если повторяется один оператор. то слова begin и end можно не писать.
Пример
for i:=l to 10 do
begin
Label1.Caption:=Label1.Caption + '*'; // выводится 10 символов ‘*’
end;
…..
//суммируются числа от 1 до N
S:=0;
for i: =1 to N do S := S+i
…..
// ввод строкового массива S из 100 элементов из StringGrid
for i:=1 to 100 do
S[i] := (StringGrid.Cells[ i-1,0];
….
// вывод целочисленного массива N из 10 элементов в ListBox
for i:=1 to 10 do
ListBox1.Items.Append(IntToStr(N[i]));
Цикл for допускает модификацию, когда счетчик меняется от большего значения к меньшему с шагом -1
for счетчик := нач_знач downto кон_знач do
Пример
S1:=’’;
for i:=Length(s) downto 1 do
S1:=S1+Copy(S, i, 1); // S1 состоит из символов S в обратном порядке.
В теле цикла допускается использования другого цикла ( вложенный цикл). Такой алгоритм называется цикл в цикле.
Пример
// ввод двумерного массива Mass2, который представлен таблицей 6 x 3
for i:=0 to 3 do
for j:=0 to 5 do
Mass2[i,j] := StrToInt (StringGrid.Cells[ i,j];
Пример
// вывод строкового двумерного массива N2 (5X10) в StringGrid
for i:=1 to 5 do
for j:=1 to 10 do
StringGrid.Cells[ j-1, i-1] :=IntToStr(N2[ i, j]);
Для принудительного выхода из цикла, прерывания используют процедуру
Break.
Пример
for i:=1 to 5 do
begin
ListBox1.Items.Append(IntToStr(N[i]));
if N[i]=5 then Break; // выход из цикла - прерывание
end;
Инструкция while
While (цикл с предусловием) используется в том случае, если некоторую последовательность действий (инструкций программы) надо выполнить несколько раз. При этом число повторений во время разработки программы может быть неизвестно и определяется только во время работы программы.
Типичными примерами использования цикла while являются вычисления с заданной точностью, поиск в массиве или в файле.
В общем виде инструкция while записывается следующим образом:
while условие do
begin
// здесь инструкции, которые надо выполнить несколько раз
end
где, условие — выражение логического типа, определяющее условие выполнения инструкций цикла.
Алгоритм, соответствующий инструкции while, представлен на рис. 2.
Рис 2
Для того чтобы инструкции цикла while, которые находятся между begin и end, были выполнены хотя бы один раз, необходимо, чтобы перед выполнением инструкции while значение выражения условие было истинно. Для того чтобы цикл завершился, нужно, чтобы последовательность инструкций между begin и end влияла на значение выражения условие (изменяла значения переменных, входящих в выражение условие).
Цикл wile можно построить на заданное число повторений.
Пример
// аналог цикла for
i:=1;
while I < =10 do
begin
ListBox1.Items.Append(IntToStr(N[i]));
i:=i+1
end;
Рассмотрим программу, которая вычисляет значение числа ПИ с точностью, задаваемой пользователем во время работы программы. В основе алгоритма вычисления лежит тот факт, что сумма ряда 1 - 1/3 + 1/5 -1/7 + 1/9 + ... приближается к значению л/4 при достаточно большом количестве членов ряда. Вычисление заканчивается тогда, когда значение очередного члена ряда становится меньше, чем заданная точность вычисления.
Пример
// Вычисление числа ПИ
var
pi:real; // вычисляемое значение ПИ
t:real; // точность вычисления
n:integer; // номер члена ряда
elem:real; // значение члена ряда
begin
pi := 0; n := 1;
t := StrToFloat(editl.text) ;
elem := 1; // чтобы начать цикл
while elem >= t do
begin
elem := 1 / (2*n - 1) ;
if n MOD 2=0
then pi := pi — elem else pi := pi + elem;
n := n + 1;
end;
pi: = pi * 4; Labell.Caption:= 'ПИ равно '+ FloatToStr(pi);
end;
end.
Инструкция repeat
Инструкция repeat (цикл с постусловием), используется в программе в том случае, если необходимо выполнить повторные вычисления (организовать цикл), но число повторений во время разработки программы неизвестно и может быть определено только во время работы программы, т. е. определяется ходом вычислений.
В общем виде инструкция repeat записывается следующим образом:
repeat
// инструкции
unti1 условие
где условие — выражение логического типа, определяющее условие завершения цикла.
Таким образом, инструкции цикла, находящиеся между repeat и unti1, выполняются до тех пор, пока условие ложно (значение выражения условие равно False).
Алгоритм, соответствующий инструкции while, представлен на рис. 3.
Рис 3
Инструкции цикла, находящиеся между repeat и until, выполняются как минимум один раз. Для того чтобы цикл завершился, необходимо, чтобы инструкции цикла, располагающиеся между repeat и until, изменяли значения переменных, входящих в выражение условие.
В качестве примера использования инструкции repeat рассмотрим программу, которая проверяет, является ли введенное пользователем число простым (как известно, число называется простым, если оно делится только на единицу и само на себя).
Проверить, является ли число N простым, можно делением числа N на два, на три и т. д. до N и проверкой остатка после каждого деления. Если после очередного деления остаток равен нулю, то это означает, что найдено число, на которое N делится без остатка. Сравнив N и число, на которое N разделилось без остатка, можно определить, является ли N простым
Пример
// Простое число
var
N: Integer; // проверяемое число
d: Integer; // делитель
r: Integer; // остаток от деления N на d
begin
N:=StrToInt(Editl.text);
d := 2; // сначала будем делить на два
repeat
r := n mod d;
if r <> 0 //N не разделилось нацело на d
then d := d + 1;
until r = 0; // найдено число, на которое п разделилось без остатка
if d = n
then Label1.Caption:=’простое число.'
else Label1.Caption:= 'составное число.';
end;