Инструкция repeat..Until
Циклы
Алгоритмы решения многих задач являются циклическими, то есть для достижения результата определенная последовательность действий должна быть выполнена несколько раз. Алгоритм, в котором есть последовательность операций (группа инструкций), которая должна быть выполнена несколько раз, называется циклическим, а сама последовательность операций – циклом. В программе цикл может быть реализован при помощи инструкций for, while и repeat.
Инструкция for
Инструкция for используется в том случае, если некоторую последовательность действий (инструкция программы) надо выполнить несколько раз, причем число повторений заранее известно.
В общем виде инструкция for записывается следующим образом:
For счетчик := начальное значение to конечное значение do
Begin
Инструкции, которые надо выполнить несколько раз (тело цикла)
End;
Счетчик – переменная - счетчик числа повторений инструкций цикла.
Начальное значение – выражение, определяющее начальное значение счетчика циклов.
Конечное значение – выражение, определяющее конечное значение счетчика циклов
Шаг цикла for всегда постоянен и равен интервалу между двумя ближайшими значениями типа счетчика, поэтому переменная «Счетчик», выражения «Начальное значение» и «Конечное значение» обычно должны быть целого типа и никогда не могут быть вещественного типа.
После каждого выполнения инструкций тела цикла счетчик циклов увеличивается автоматически.
Пример 1. Вычислить факториал числа N ( )/
Входные данные N – целое число, факториал которого необходимо вычислить.
Выходные данные factorial – значение факториала числа N, произведение чисел от 1 до N, целое число.
Промежуточные переменные i – счетчик цикла, целочисленная переменная, последовательно принимающая значения 2, 3, 4 и далее до N.
Введем число N. Для чего разместим на форме объекты Label1 и Edit1. Переменной factorial, в которой будет сохраняться значение произведения последовательности чисел, присваивается начальное значение, равное единице. Затем организуется цикл, счетчиком которого выступает переменная i. Если значение параметра цикла меньше или равно N, выполняется инструкция цикла, в котором из участка памяти с именем factorial считывается предыдущее значение произведения, умножается на текущее значение параметра i, а результат снова помещается в участок памяти с именем factorial. Когда счетчик i становится N, цикл заканчивается, и на форму в объект Label2 выводится значение переменной factorial, которая будет вычислена в теле цикла.
procedure TForm1.Button1Click(Sender: TObject);
Var
N,i:integer; // описание целых переменных
begin// начало процедуры
N:=StrToInt(Edit1.Text); // заданное число вводится из Edit1
Factorial:=1; // введение ячейки для расчета
for i:=2 to N do //вводится цикл i
factorial:=factorial*i; // вычисление
Label2.Caption:=’N!=’+IntToStr(factorial); // вывод результата
end; // окончание процедуры
Пример2 . Напишем программу, которая вычисляет значения функции на заданном промежутке. Границы отрезка (xmin, xmax), а также количество точек (N) задаются в форме.
Расстояние между точками определяется по формуле dx:=(xmax-xmin)/(N-1). Результат выведем в форме таблицы, которую будем обозначать строковой переменной st. До введения цикла введем ячейку памяти в форме st:='x y'. Эта строка будет в последствии являться названиями столбцов таблицы. Обозначение #13 характеризует клавишу «Enter», то есть переход на другую строку таблицы. Далее результат накапливается , добавляя к предыдущему значению переменной st новые значения x и y.
Например, при значениях xmin=-1 xmax=3 N=9 st имеет вид
До цикла . При i=1 добавляется новая строка , при i=2 еще одна и так 9 раз.
procedure TForm1.Button1Click(Sender: TObject);
Var
xmin,xmax,x,y,dx:real; // описание вещественных переменных
N,i:integer; // описание целых переменных
st:string; // описание строковых переменных
begin// начало прцедуры
st:='x y'+#13; // заглавие таблицы
xmin:=StrToFloat(Edit1.Text); // начало отрезка вводится из Edit1
xmax:=StrToFloat(Edit2.Text); // конец отрезка вводится из Edit2
N:=StrToInt(Edit3.Text); // количество точек вводится из Edit3
x:=xmin; // координата первой точки
dx:=(xmax-xmin)/(N-1); // расстояние между точками
for i:=1 to N do //вводится цикл i- номер точки
begin //начало инструкции цикла
y:=5*x*x-7; // вычислении функции
st:=st+FloatToStr(x)+' '+FloatToStr(y)+#13; // занесение результатов в таблицу
x:=x+dx; // вычисление координаты следующей точки
end;//конец инструкции цикла
Label4.Caption:=st; // вывод результата
end; // окончание процедуры
Результат выполнения программы приведен на рисунке
Инструкция while..do
Оператор while – цикл с предусловием или цикл «пока».
Работает цикл с предусловием следующим образом. Вычисляется значение «выражения пока».Это и есть условие. Если оно истинно, выполняется инструкция цикла. В противном случае цикл заканчивается, и управление передается оператору, следующему за циклом. «Выражение пока» вычисляется перед каждой итерацией цикла.
Цикл с предусловием реализуется конструкцией
While условие do
Оператор;
Если тело цикла состоит более чем из одного оператора
While условие do
Begin
Оператор1;
Оператор2;
……….
Операторk;
end;
Пример 3. Рассмотрим программу, которая вычисляет значение числа с точностью, задаваемой пользователем во время работы программы. В основе алгоритма вычисления лежит тот факт, что сумма ряда приближается к значению при достаточно большом количестве членов ряда. Каждый член ряда с номером n вычисляется по формуле и умножается на (-1), если n четное. Определить, является ли n четным можно проверкой остатка от деления на 2. Вычисление заканчивается тогда, когда значение очередного члена ряда становится меньше, чем заданная точность вычисления.
При суммировании, как и при умножении нескольких чисел, необходимо накапливать результат в некоторой ячейке памяти, каждый раз считывая из этой ячейки предыдущее значение суммы и увеличивая его на очередное слагаемое
procedure TForm1.Button1Click(Sender: TObject);
Var
pi:real;// вычисляемое значение пи
t:real; // точность вычисления
n:integer; // номер слагаемого
slag:real; // слагаемое
begin // начало процедуры
pi:=0; // открытие ячейки памяти для вычисления пи
n:=1; // открытие ячейки для вычисления номера слагаемого
slag:=4; // первое слагаемое, чтобы начать цикл
t:=StrToFloat(Edit1.Text); // ввод точности
while slag >=t do // ввод цикла
begin // начало тела цикла
slag:=4/(2*n-1); // вычисление n –го слагаемого
if n mod 2 =0 // определение четности
then pi:=pi-slag // прибавка в четном случае
else pi:=pi+slag; // прибавка в нечетном случае
n:=n+1; // увеличение номера слагаемого
end; // конец тела цикла
Label2.Caption:='Пи равно'+#13
+FloatToStr(pi)+#13
+'Просуммировано'+IntToStr(n)+#13
+'членов ряда'; // вывод результата
end; // конец процедуры
Инструкция repeat..until
Цикл repeat – цикл с постусловием (то есть цикл до). В этом цикле проверяется, делать или нет очередную операцию лишь после завершения предыдущей.
Цикл с постусловием реализуется конструкцией
Repeat
Оператор;
Untilвыражение (условие);
Если тело цикла состоит более чем из одного оператора
Repeat
Оператор1;
Оператор2;
……….
Операторk;
Untilвыражение (условие);
Инструкция repeat выполняется следующим образом
- Сначала выполняются находящиеся между repeat и until инструкции тела цикла
- Затем вычисляется значение выражения условия. Если условие ложно, то инструкция выполняется еще раз
- Если условие истинно, то выполнение цикла прекращается
Таким образом, инструкции цикла, находящиеся между repeat и until выполняются до тех пор, пока условие ложно (пока не начнет выполняться условие). Для того, чтобы цикл завершился, необходимо, чтобы инструкции цикла, располагающиеся между repeat и until, изменяли значения переменных, входящих в выражение условия.
Пример 4. В качестве примера использования инструкции repeat рассмотрим программу, которая проверяет, является ли введенное пользователем числе простым или составным. Как известно, число называется простым, если оно делится только на единицу и на само себя.
Проверить, является ли число n простым, можно делением числа n на два, на три и так далее до n и проверкой остатка после каждого деления. Если посте очередного деления остаток равен нулю, то это означает, что найдено число, на которое n делится без остатка. Сравнив n и число, на которое n разделилось без остатка, можно определить, является ли n простым числом.
procedure TForm1.Button1Click(Sender: TObject);
Var
n:integer; // Проверяемое число
d:integer; // делитель
r:integer; // остаток от деления
begin // начало процедуры
n:=StrToint(Edit1.Text); // введение проверяемого число
d:=2; // сначала будем делить на два
repeat// начало цикла
r:=n mod d; // вычисление остатка то деления
if r<>0 // не разделилось нацело на d
then d:=d+1; // изменим делитель
until r=0; // найден делитель
if d=n // если делитель и число совпадают
then Label2.Caption:='Простое число' //
else Label2.Caption:='Составное число'; //
end; // конец процедуры