3.2. Операторы организации циклов repeat, whyle, for языка Pascal
Под циклом понимается многократное выполнение одних и тех же операторов при различных значениях промежуточных данных. Число повторений может быть задано в явной или неявной форме. Для организации повторений в языке Pascal предусмотрены три различных оператора цикла.
Оператор
3.2. Операторы организации циклов repeat, whyle, for языка Pascal
Под циклом понимается многократное выполнение одних и тех же операторов при различных значениях промежуточных данных. Число повторений может быть задано в явной или неявной форме. Для организации повторений в языке Pascal предусмотрены три различных оператора цикла.
Оператор
repeat
<операторы>
until<условие>;
организует повторение операторов, помещенных между ключевыми словами repeat и until, до тех пор, пока не выполнится <условие>=true, после чего управление передается следующему за циклом оператору.
Оператор
While<условие>do begin
<операторы>
end;
организует повторение операторов, помещенных между begin и end, до тех пор, пока не выполнится <условие>=false. Заметим, что если <условие>=false при первом входе, то <операторы> не выполнятся ни разу, в отличие от repeat, в котором хотя бы один раз они выполнятся.
Оператор
for i:=i1 to i2 do begin
<операторы>
end;
организует повторение операторов при нарастающем изменении переменной цикла i от начального значения i1 до конечного i2 с шагом “единица”. Заметим, что если i2>i1, то <операторы> не выполнятся ни разу. Модификация оператора for i:=i2i1 do begin <операторы> end организует повторения при убывающем изменении i на единицу. downto
Для прекращения выполнение цикла используется процедура Break, которая прерывает выполнение тела любого цикла и передает управление следующему за циклом оператору. Для прерывания текущей итерации цикла и передачи управления следующей, используется процедура Continue.
3.3. Пример написания программы
Задание: написать и отладить программу, которая выводит таблицу значений функции
и ее разложения в ряд
для х изменяющихся в интервале от xN до xK c шагом h. Функцию s(x) вычислять с точностью до 0,001. Вывести число итераций, необходимое для достижения заданной точности.
При составлении алгоритма вычисления удобно использовать рекуррентную последовательность (такую последовательность, каждое новое слагаемое которой зависит от одного или нескольких предыдущих). Для получения расчетной формулы рассмотрим значение слагаемого при различных значениях k: при ![]()
при
при
и т.д. Видно, что на каждом шаге слагаемое дополнительно умножается на
. Исходя их этого, формула рекуррентной последовательности будет иметь вид:
. Полученная формула позволяет избавиться от многократного вычисления факториала и возведения в степень. Если в выражении имеется нерекуррентая часть, то ее следует рассчитывать отдельно. при
Панель диалога представлена на рис. 3.1.

Рис. 3.1.
Текст программы приведен на Листинге 3.1.
Листинг 3.1.
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
Edit2: TEdit;
Label3: TLabel;
Edit3: TEdit;
Label4: TLabel;
Memo1: TMemo;
Button1: TButton;
Label5: TLabel;
Edit4: TEdit;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.text:='0';
Edit2.text:='2';
Edit3.text:='0,25';
Edit4.text:='0,001';
end;
procedure TForm1.Button1Click(Sender: TObject);
var xn,xk,x,h,e,a,s,y :extended;
n,k:integer;
begin
Memo1.Clear;
Memo1.Lines.Add('Результаты ст. гр. 552002 Петрова И.В.');
xn:=StrToFloat(Edit1.Text);
Memo1.Lines.Add(' xn='+FloatToStrF(xn,ffFixed,6,2));
xk:=StrToFloat(Edit2.Text);
Memo1.Lines.Add(' xk='+FloatToStrF(xk,ffFixed,6,2));
h:=StrToFloat(Edit3.Text);
Memo1.Lines.Add(' h='+FloatToStrF(h,ffFixed,8,3));
e:=StrToFloat(Edit4.Text);
Memo1.Lines.Add(' e='+FloatToStrF(e,ffFixed,8,5));
x:=xn;
repeat
a:=1; S:=1; n:=0;
while (abs(a) > e) do begin
n:=n+1;
a:=-a*x/n;
s:=s+a;
end;
y:=exp(-x);
Memo1.Lines.Add('при x='+FloatToStrF(x,ffFixed,6,2)+' сумма ='
+ FloatToStrF(s,ffFixed,8,4)+’ y ='
+ FloatToStrF(y,ffFixed,8,4)+' N ='+IntToStr(n));
x:=x+h;
until x>(xk+h/2) // (xk+h/2) применяется для исключения
end; // потери последнего x
end.
3.4. Выполнение индивидуального задания
По указанию преподавателя выберите вариант задачи. Нарисуйте схему алгоритма. Спроектируйте панель диалога и напишите текст программы.
Вывести на экран таблицу значений функции y(x) и ее разложения в ряд s(x) для x изменяющихся от xn до xk с заданным количеством шагов M (
) и точностью e. Близость значений S(x) и Y(x) во всем диапазоне значений x указывает на правильность вычисления S(x) и Y(x).
После написания программы и исправления ошибок трансляции изучите средства отладки программ, для чего установите курсор на первый оператор и нажмите клавишу F4. После этого, нажимая клавишу F7, выполните пошагово программу и проследите, как меняются все переменные в процессе выполнения.
|
Таблица 3.1. | |||||
|
№ |
|
|
S(x) |
e |
Y(x) |
|
1 |
2 |
3 |
4 |
5 |
6 |
|
1. |
0.1 |
1 |
|
0.001 |
|
|
Окончание табл. 3.1 | |||||
|
1 |
2 |
3 |
4 |
5 |
6 |
|
2. |
0.1 |
1 |
|
0.0001 |
|
|
3. |
0.1 |
1 |
|
0.001 |
|
|
4. |
0.1 |
1 |
|
0.01 |
|
|
5. |
0.1 |
0.7 |
|
0.001 |
|
|
6. |
0.1 |
1 |
|
0.0001 |
|
|
7. |
0.2 |
1 |
|
0.001 |
|
|
8. |
0.1 |
0.7 |
|
0.0001 |
|
|
9. |
0.3 |
1 |
|
0.001 |
|
|
10. |
0.1 |
0.5 |
|
0.0001 |
|
|
11. |
0.2 |
1 |
|
0.001 |
|
|
12. |
0.1 |
1 |
|
0.0001 |
|
|
13. |
-2 |
-0.1 |
|
0.01 |
|
|
14. |
0.2 |
0.8 |
|
0.0001 |
|
|
15. |
0.1 |
0.8 |
|
0.001 |
|




















