Текст программы и результаты выполнения
Ниже представлен текст модуля unit1.pas Delphi-приложения:
unit Unit1;
interface
uses
Classes, SysUtils, Forms, Controls, Graphics,
Dialogs, Grids, StdCtrls,
TeEngine, Series, ExtCtrls, TeeProcs, Chart,
jpeg;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Chart1: TChart;
Chart1LineSeries1: TLineSeries;
Edit1: TEdit;
Edit10: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
Edit7: TEdit;
Edit8: TEdit;
Edit9: TEdit;
Label1: TLabel;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
Label15: TLabel;
Label16: TLabel;
Label17: TLabel;
Label18: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label9: TLabel;
strngrd1: TStringGrid;
lbl1: TLabel;
edt1: TEdit;
LineSeries1Series1: TLineSeries;
LineSeries1Series2: TLineSeries;
LineSeries1Series3: TLineSeries;
img1: TImage;
img2: TImage;
txt1: TStaticText;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
procedure TForm1.Button2Click(Sender: TObject);
begin
Edit1.Clear;
Edit2.Clear;
Edit3.Clear;
Edit4.Clear;
Chart1LineSeries1.Clear;
end;
procedure TForm1.Button1Click(Sender: TObject);
Var
x, Ak, a, Da, Dx, Eps, d, c, Int: Extended;
n, i, j, Km, Err, e: Integer;
Procedure Tab(B, xn, dx, an, ak, da: Real; N: integer; var Err, e: integer); //Процедура табулирования функции
Var I, J: integer;
X, A: Real;
Function F(x, a, b:Real): Real; //Функция
Begin
if x > 0 then F:=x*(2*a+b)-exp(a)
else F:=(b*sqr(sin(a*x))*sin(a*x))/(sqrt(2*3.14)-b);
End;
Begin
a:=An;
j:=1;
strngrd1.ColCount:=n;
While a<=Ak do
Begin
x:=Xn;
strngrd1.Cells[0,j]:=FloatToStr(a);
strngrd1.RowCount:=j+1;
For i:=1 to n do
Begin
if j=1 then strngrd1.Cells[i,0]:=FloatToStrf(x, Ffexponent, 4, 2);
If (x > 0) or (b <> sqrt(2*3.14)) then
strngrd1.Cells[i,j]:=FloatToStrF(F(StrToFloat(strngrd1.Cells[i,0]), A, B), Ffexponent, 4, 2)
else
begin
strngrd1.Cells[i,j]:='Err';
end;
x:=x+dx;
End;
a:=a+da;
j:=j+1;
End;
End;
Procedure ProcErrorHappend(Er: Integer); //Процедура обработки ошибок
begin
case Er of
1: ShowMessage('Интеграл не найден за Km итераций');
2: ShowMessage('Погрешность Eps должна быть < 1');
4: ShowMessage('Знаменатель равен нулю')
end;
end;
procedure PrintChart(M: Integer); //Ïðîöåäóðà âûâîäà ãðàôèêà íà ýêðàí
var i, j, rc, e:integer;
begin
j:=4;
if (strngrd1.RowCount < j) then rc:=strngrd1.RowCount
else rc:=j;
j:=0;
while j < rc do
begin
Chart1.Series[j].Clear;
for i:=1 to M do
begin
if strngrd1.Cells[i,1] <> 'Err' Then
begin
if e=i then begin Chart1.Series[j].AddNull(); e:=0; end;
Chart1.Series[j].AddXY(StrToFloat(strngrd1.Cells[i,0]), StrToFloat(strngrd1.Cells[i,j+1]))
end
else
Chart1.Series[j].AddNull();
end;
j:=j+1;
end;
end;
Procedure Integral(var A, B, Eps, int: Extended; var Km, Er: Integer); //Процедура нахождения интеграла
var x, w, h, i1, i2: Real;
i, j, k: Integer;
function F4(x: Real): Real; //Интеграл
begin
F4:=exp(ln(abs(sin(exp(ln(abs(3*x))*(-1/3)))))*(-1));
end;
begin
j:=1;
Er:=1;
i1:=0;
k:=4;
while j<=Km do
begin
x:=A;
h:=((B-A)/k);
i2:=F4(A);
i:=1;
repeat
x:=x+h;
i2:=i2+F4(x); i:=i+1;
until i >= (k-1);
i2:=i2*h;
w:=abs(i1-i2);
if w >= Eps then
begin
i1:=i2; k:=2*k;
end;
if w < Eps then
begin
j:=Km;
Er:=0;
Int:=i2;
Edit5.text:=FloatToStrF(i2, fFExponent, 2, 2);
end;
j:=j+1;
end;
end;
begin
Eps:=StrToFloat(Edit8.text);
c:=StrToFloat(Edit6.text);
d:=StrToFloat(Edit7.text);
Km:=StrToInt(edt1.text);
Eps:=StrToFloat(Edit8.Text);
if Eps >= 1 then
begin
Err:=2;
ProcErrorHappend(Err);
Exit;
end;
BFind(c, d, Eps, Int, Km, Err); //Нахождение интеграла
if Err>0 then
begin
ProcErrorHappend(Err);
exit;
end;
//Ïподготовка к табулированию
Ak:=StrToFloat(Edit2.Text);
a:=StrToFloat(Edit1.text);
Da:=StrToFloat(Edit3.text);
Dx:=StrToFloat(Edit9.text);
x:=StrToFloat(Edit4.text);
n:=StrToInt(Edit10.text);
Tab(Int, x, dx, a, ak, da, n, err, e); //Табулирование функции
if Err <> 0 then
begin
ProcErrorHappend(Err);
exit;
end;
PrintChart(N);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
strngrd1.ColCount:=StrToInt(Edit10.Text)+1;
end;
begin
end.
Пример выполнения программы:
6. Набор тестов
Для тестирования правильности работы программы воспользуемся системой Wolfram-Alpha.
Пусть входные данные имеют следующие значения:
C=0,2; D= 0,56; Km=100; Eps=0,001;
An=-3; Ak=3; Da=2;
Xn=-39; Dx=0,05; N=1000;