Помогите с кодом.
информатика, код, дельфи, Delphi, помощь
procedure TForm1.Button2Click(Sender: TObject);
const nmax=20;
type
tmy=array[1..nmax,1..nmax]of extended;
tmx=array[1..nmax]of extended;
var
a,mx:tmx;
my:tmy;
an,ak,da,xn,dx,b,c,d,eps,zt:extended; l:real;
j,k,n,km,er,errorhappened:integer;
procedure procerrorhappened(errorhappened:integer);
begin
case errorhappened of
1:begin
showmessage('Решение не найдено за KM итераций');
exit;
end;
2:begin
showmessage('Знаменатель должен быть отличен от нуля');
exit;
end;
3:begin
showmessage('Неверно задано значение переменной');
exit;
end;
4:begin
showmessage('Значение переменной Eps должно быть меньше 0.1');
exit;
end;
end;
end;
procedure datain(an,ak,da:extended; var a:tmx; var errorhappened:integer);
var
j:integer;
begin
a[1]:=an;
j:=2;
repeat
a[j]:=a[j-1]+da;
j:=j+1;
until a[j]>ak;
end;
procedure tab(b,xn,dx:extended;n:integer;
var errorhappened:integer; var a,mx:tmx; var my:tmy);
var i,j,p:integer;
x,y:extended;
begin
for j:=1 to n do
begin
i:=1;
p:=0;
x:=xn;
repeat
if x<0.5 then
begin
y:=a[j]*cos((3.14*a[j]*x)/2);
my[j,i]:=y;
end
else
if b*x+(sqr(x)*x)<>0 then
begin
y:=(ln(a[j]*a[j]))/(b*x+(sqr(x)*x));
my[j,i]:=y;
end
else
begin
errorhappened:=2;
exit;
end;
mx[i]:=x;
inc(i);
x:=x+dx;
p:=p+1;
until p>n;
end;
end;
procedure equat(c,d,eps:extended; km:integer;
var errorhappened:integer; var zt:extended; var l:real);
var
w,fc,fl:extended;
i:integer;
function f(x:extended):extended;
begin
f:=exp(x)-2*x-2; {Вот здесь падает, пишет EInvalidOp Неверный код операции вещественной математики}
end;
begin
fc:=f(c);
for i:=1 to km do
begin
l:=(d+c)/2;
fl:=f(l);
w:=abs(fl);
if w>eps then
if fc*fl>0 then c:=l
else d:=l
else
begin
zt:=f(l);
exit;
end;
end;
errorhappened:=1;
end;
procedure rezout(var a,mx:tmx;var my:tmy);
var
i,j:integer;
begin
for i:=1 to k do
begin
stringgrid1.Cells[i,0]:=('a['+inttostr(i)+')='+floattostr(a[i]));
form1.chart1.Series[0].Clear;
for j:=1 to n do
begin
if(stringgrid1.ColCount<i+1) then
stringgrid1.colcount:=stringgrid1.ColCount+1;
stringgrid1.Cells[0,j]:=('x['+inttostr(j)+']='+floattostr(mx[j]));
form1.chart1.Series[0].AddXY(mx[j],my[i,j]);
stringgrid1.Cells[i,j]:=floattostrf(my[i,j],ffgeneral,6,5);
end;
if (stringgrid1.RowCount<j)then
stringgrid1.rowcount:=stringgrid1.RowCount+1;
end;
end;
begin
errorhappened:=0;
val(edit2.Text,eps,er);
if er<>0 then
begin
errorhappened:=4;
procerrorhappened(errorhappened);
exit;
end;
km:=strtoint(edit3.Text);
c:=strtofloat(edit4.Text);
d:=strtofloat(edit5.Text);
xn:=strtofloat(edit6.Text);
dx:=strtofloat(edit7.Text);
n:=strtoint(edit8.Text);
an:=strtofloat(edit9.Text);
da:=strtofloat(edit12.Text);
ak:=strtofloat(edit1.Text);
stringgrid1.Cells[0,0]:='ax';
for j:=1 to n do
freestringgrid1;
datain(an,ak,da,a,errorhappened);
if errorhappened>0 then
begin
procerrorhappened(errorhappened);
exit;
end;
equat(c,d,eps,km,errorhappened,zt,l);
if errorhappened>0 then
begin
procerrorhappened(errorhappened);
exit;
end
else
begin
b:=l;
edit10.Text:=floattostrf(b,ffgeneral,10,6);
edit11.Text:=floattostrf(zt,fffixed,7,5);
end;
tab(b,xn,dx,n,errorhappened,a,mx,my);
if errorhappened>0 then
begin
procerrorhappened(errorhappened);
exit;
end;
k:=trunc((ak-an)/da+1);
rezout(a,mx,my);
end;
end.
кто подскажет в чем же здесь дело??
Подробнее: речь о том, что в данной строчке эта ошибка может возникнуть, как я понимаю, только когда значение x не определено. Вот я и предлагаю это проконтролировать, хотя бы вставить в эту функцию банальный MsgBox, выводящий значение x перед вычислением.