Инструкция for
Рассмотрим следующую задачу. Пусть нужно написать программу, которая вычисляет значение функции у = 5х2 - 7 в точках —1, -0.5, 0, 0.5 и 1
(таблица должна быть выведена в поле метки формы приложения). Процедура, обеспечивающая решение поставленной задачи, может выглядеть так:
procedure TForm1.ButtonlClick(Sender: TObject); var
у: real; // значение функции
x: real; // аргумент функции
dx: real; // приращение аргумента
st: string; // изображение таблицы
begin
st:='';
x := -1; dx := 0.5;
у := 5*х*х -7;
st := st+ FloatToStr(x)+' '+ FloatToStr(y)+chr(13);
x :=x + dx;
у := 5*х*х -7;
st := st+ FloatToStr(x)+* '+ FloatToStr(y)+chr(13);
x :=x + dx;
у := 5*х*х -7;
st := st+ FloatToStr(x)+* '+ FloatToStr(y)+chr(13);
x :=x + dx;
у := 5*х*х -7;
st := st+ FloatToStr(x)+' ' + FloatToStr(y)+chr(13);
x :=x + dx;
у := 5*х*х -7;
st := st+ FloatToStr(x)+' '+ FloatToStr(y)+chr(13);
x :=x + dx;
Label1.Caption := st;
end;
Из текста процедуры видно, что группа инструкций
у := 5*х*х -7;
st := st+ FloatToStr(x)+' '+ FloatToStr(y)+chr(13);
x :=x + dx;
обеспечивающая вычисление значения функции, формирование строки таблицы и увеличение аргумента, выполняется 5 раз.
Воспользовавшись инструкцией for, приведенную процедуру можно переписать следующим образом:
procedure TForm1.ButtonlClick(Sender: TObject);
var
у: real; // значение функции
x: real; // аргумент функции
dx: real; // приращение аргумента
st: string; // изображение таблицы
i : integer; // счетчик циклов
begin
st:=''; x := -1; dx := 0.5;
for i:=l to 5 do begin
у := 5*x*x -7;
st := st+ FloatToStr(x)+' '+ FloatToStr(y)+chr(13); x :=x + dx; end;
Label1.Caption := st;
end;
Второй вариант процедуры, во-первых, требует меньше усилий при наборе, во-вторых, процедура более гибкая: для того чтобы увеличить количество строк в выводимой таблице, например до десяти, достаточно в строке for i:=1 to 5 do число 5 заменить на 10.
Инструкция for используется в том случае, если некоторую последовательность действий (инструкций программы) надо выполнить несколько раз, причем число повторений заранее известно.
В общем виде инструкция for записывается следующим образом: for счетчик := нач_знач to кон_знач do begin
// здесь инструкции, которые надо выполнить несколько раз end
где:
- счетчик — переменная-счетчик числа повторений инструкций цикла;
- нач_знач-- выражение, определяющее начальное значение счетчика циклов;
- кон_знач — выражение, определяющее конечное значение счетчика циклов.
Переменная счетчик, выражения нач_знач и кон_знач должны быть целого типа.
Количество повторений инструкций цикла можно вычислить по формуле
(кон_знач — нач_знач + l).
Примеры:
for i:=l to 10 do begin
label1.caption:=label1.caption + '*'; end;
for i: =1 to n do s := s+i;
Примечание
Если между begin и end находится только одна инструкция, то слова begin и end можно не писать.
![](image/instrukcija-for_2.gif)
Рис. 2.13. Алгоритм инструкции for
Алгоритм, соответствующий инструкции for, представлен на рис. 2.13. Обратите внимание, что если начальное значение счетчика больше конечного значения, то последовательность операторов между begin и end не будет выполнена ни разу.
Кроме того, после каждого выполнения инструкций тела цикла счетчик циклов увеличивается автоматически.
Переменную-счетчик можно использовать внутри цикла (но ни в коем случае не изменять). Например, в результате выполнения следующих инструкций:
tab1: = '' ;
for i:=l to 5 do
begin
tab1:=tabl+IntToStr(i)+' '+IntToStr(i*i)+chr(13);
end;
переменная tabl будет содержать изображения таблицы квадратов чисел.
Рассмотрим программу, которая вычисляет сумму первых 10 элементов ряда: 1 + + 1/3 + ... (значение i-го элемента ряда связано с его номером формулой 1//). Диалоговое окно программы должно содержать, по крайней мере, два компонента: поле метки (Label1) и командную кнопку (Buttonl).
Вычисление суммы ряда и вывод результата выполняет процедура обработки события Onclick, текст которой приведен ниже. После вычисления очередного элемента ряда процедура выводит в поле Labell номер элемента и его значение в поле метки формы, предназначенное для вывода результата.
procedure TForm1.ButtonlClick(Sender: TObject);
var
i:integer; { номер элемента ряда }
elem:real;
{ значение элемента ряда }
summ:real;
{ сумма элементов ряда )
begin
summ:=0;
label Leapt ion: = ' ' ;
for i:=l to 10 do begin
elem:=l/i;
label1.caption:=labell.caption+
IntToStr(i)+' '+FloatToStr(elem)+#13; sunrn: =summ+elem;
end;
label1.caption:=label1.caption+
'Сумма ряда:'+FloatToStr(summ);
end;
Если в инструкции for вместо слова to записать downto, то после очередного выполнения инструкций тела цикла значение счетчика будет не увеличиваться, а уменьшаться.