Новичок
Джуниор
Регистрация: 03.06.2009
Сообщений: 4
|
Табулирование функции. Ошибка 'List index out of bounds(0)'
Здравствуйте все! Помогите, пожалуйста, с ошибкой. Текст ошибки: "Project Project2.exe raised exception class EListError with message 'List index out of bounds(0)'. Process stopped. Use Step or Run to continue. "
Вот это текст всей программы:
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, TeeProcs, TeEngine, Chart, Series, Grids;
const Nmax=20;
type
Tmy=array[1..Nmax] of extended;
Tmx=array[1..Nmax] of integer;
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
Edit7: TEdit;
Edit8: TEdit;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
Label15: TLabel;
Label16: TLabel;
StringGrid1: TStringGrid;
StringGrid2: TStringGrid;
Chart1: TChart;
Button1: TButton;
Button2: TButton;
Label17: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
public
end;
var
Form1: TForm1;
C,D,Eps,B:real;
n,i,Km,Str,M,Ak:integer;
An,Da,a,Zt:real;
MX,MY,MA:Tmy;
Er:Tmx;
implementation
function F1(x:real):real;
begin
F1:=sin(x*x)+cos(x*x)-x;
end;
function F2(a,b,x:real):real;
var g:real;
begin
g:=a*x;
F2:=exp(2.71828*ln(abs(g)))-ln(b);
end;
Function F3(a,b,x:real):real;
begin
F3:=(b*b+sin(x/2))/(a*a*a);
end;
procedure Equat(C,D,Eps:real;Km:integer; var Str:integer; var B:real);
var i:integer;
w,FB,FC:real;
begin
FC:=F1(C);
for i:=1 to Km do
begin
B:=(C+D)/2;
FB:=F1(B);
w:=Abs(FB);
if w>Eps then
if FB*FC>0 then C:=B
else D:=B
else
begin
Str:=1;
exit
end;
Str:=0;
end;
end;
procedure Tab(MX:Tmy;M:integer;An,Da:real;N:integer;B:real;var MA,MY:Tmy;var Er:tmx);
var na,i,j,k:integer;
begin
na:=1;
a:=An;
while na<=N do
begin
MA[na]:=a;
a:=a+Da;
na:=na+1;
end;
for i:=1 to N do
begin
for j:=1 to M do
begin
if ((MX[j]>0) and (b<=0)) or ((MX[j]<=0) and (MA[i]=0)) then Er[k]:=1 else
begin
IF (MX[j]>0) then MY[k]:=F2(MA[i],B,MX[j]) else MY[k]:=F3(MA[i],B,MX[j]);
Er[k]:=0;
end;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
An:=StrToFloat(Edit1.Text);
Da:=StrToFloat(Edit2.Text);
N:=StrToInt(Edit3.Text);
M:=StrToInt(Edit4.Text);
C:=StrToFloat(Edit5.Text);
D:=StrToFloat(Edit6.Text);
Eps:=StrToFloat(Edit7.Text);
Km:=StrToInt(Edit8.Text);
StringGrid1.RowCount:=M;
For i:=1 to M do
begin
StringGrid1.Cells[0,i-1]:='X'+IntToStr(i);
end;
end;
procedure VvodX(m:integer; var MX:Tmy);
var i:integer;
begin
for i:=1 to M do
begin
MX[i]:=StrToFloat(Form1.StringGrid1.Cells[1,i-1]);
end;
end;
procedure Out(M,N:integer;MX,MA,MY:tmy;Er:tmx);
var i,j,k:integer;
begin
Form1.StringGrid2.Cells[0,0]:='A';
Form1.StringGrid2.Cells[1,0]:='X';
Form1.StringGrid2.Cells[2,0]:='F';
Form1.StringGrid2.RowCount:=2;
k:=1;
for i:=1 to N do
begin
for j:=1 to M do
begin
Form1.StringGrid2.Cells[0,k]:=FloatToStr(MA[i]);
Form1.StringGrid2.Cells[1,k]:=FloatToStr(MX[j]);
if Er[k]=0 then Form1.StringGrid2.Cells[2,k]:=FloatToStr(MY[k]) else Form1.StringGrid2.Cells[2,k]:='Ошибка';
Form1.StringGrid2.RowCount:=Form1.StringGrid2.RowCount+1;
k:=k+1;
end;
end;
end;
procedure Graph(M:integer;MX,MY:tmy);
begin
Form1.Chart1.Series[0].Clear;
for i:=1 to M do
begin
Form1.Chart1.Series[0].AddXY(MX[i],MY[i]);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
VvodX(M,MX);
Equat(C,D,Eps,Km,Str,B);
if Str=1 then Label17.Caption:='Ошибка при вычислении корня B';
if Str=0 then Label17.Caption:='Корень уравнения:'+FloatToStr(B);
Tab(MX,M,An,Da,N,B,MA,MY,Er);
Out(M,N,MX,MA,MY,Er);
Graph(M,MX,MY);
end;
procedure TForm1.FormCreate(Sender:TObject);
begin
Chart1.Series[0].Clear;
end;
end.
Сегодня уже надо сдавать! Помогите!
Последний раз редактировалось Stilet; 03.06.2009 в 08:33.
|