Нашёл две возможные проблемы:
1. Не сбрасывается значение для a после работы цикла.
2. Не корректное условие для последнего цикла (оно должно быть обратным условию в while).
PHP код:
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
ExtCtrls, Math;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Image1: TImage;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Edit1Change(Sender: TObject);
procedure Edit2Change(Sender: TObject);
procedure Edit3Change(Sender: TObject);
procedure Memo1Change(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
y,a1,a2,da,x,a:real;
code,i,n:integer;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Edit1Change(Sender: TObject);
begin
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
da:=strtofloat(Edit1.Text);
a1:=strtofloat(Edit2.Text);
a2:=strtofloat(Edit3.Text);
memo1.Clear;
begin
n:=trunc((a2-a1)/(da)+1);
a:=a1;
for i:=1 to n do begin
x:=sin(sqr(exp(a)*0.47));
y:=(ln(x+((1+x)/(1+2*x)))/(ln(exp(x*a)*3)))+a;
a:=a+da;
end;
memo1.Lines.Add('Вывод при помощи FOR:');
memo1.Lines.Add('x='+floattostrf(x, ffGeneral, 6, 2)+' y='+floattostrf(y, ffGeneral, 4, 2));
memo1.Lines.Add('________________________');
end;
begin
a:=a1;
while a<(a2+da) do begin
x:=sin(sqr(exp(a)*0.47));
y:=(ln(x+((1+x)/(1+2*x)))/(ln(exp(x*a)*3)))+a;
a:=a+da;
end;
memo1.Lines.Add('Вывод при помощи WHILE:');
memo1.Lines.Add('x='+floattostrf(x, ffGeneral, 6, 2)+' y='+floattostrf(y, ffGeneral, 4, 2));
memo1.Lines.Add('________________________');
end;
begin
a:=a1;
repeat
x:=sin(sqr(exp(a)*0.47));
y:=(ln(x+((1+x)/(1+2*x)))/(ln(exp(x*a)*3)))+a;
a:=a+da;
until a>=a2+da;
memo1.Lines.Add('Вывод при помощи REPEAT:');
memo1.Lines.Add('x='+floattostrf(x, ffGeneral, 6, 2)+' y='+floattostrf(y, ffGeneral, 4, 2));
memo1.Lines.Add('________________________');
end;
end;
P.S. Операции расчётов и вывода лучше вынести в отдельные функции, во избежание дублирования кода.