Рубрикатор

чувстваjavaлюбовюморantivirusAGPнотыКнигипомощьфразаэкзаменшуткипрограмыглупостьgdпочемучкапечальВьетнамтрекер

Помогите с кодом.

информатика, код, дельфи, 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 перед вычислением.
Вернуться на главную Вернуться в раздел
© 2010 Алина Зубкова Карта сайта
Hosted by uCoz