

Ошибка в паскале : Ошибка времени выполнения: Индекс находился вне границ массива.
не понимаю что не так, ошибка написана в вопросе, код ниже, помогите пожалуйста
uses graphABC;
function F(x:real):real;
begin
F:=-2+3*x-(x*x*x);
end;
var
xn,xk,x,h,ymx,m:real;
x1,y1:array[1..30] of real;
n,i,x0,y0:integer;
st:string;
begin
xn:=-3;
xk:=3.00;
h:=0.05; //ошибка вылезает когда пишу 0.05 если писать 0.5 то все нормально, ну нужен шаг 0.05
x:=xn;
ymx:=F(x);
n:=0;
while x<=xk do
begin
n:=n+1;
x1[n]:=x;
y1[n]:=F(x);
if y1[n]>ymx then ymx:=y1[n];
x:=x+h;
end;
setwindowsize(960,640);
x0:=2*windowwidth div 3-50;
y0:=windowheight-170;
if abs(ymx)>xk then m:=(windowwidth-x0-10)/abs(ymx)
else m:=(windowwidth-x0-10)/xk;
line(x0-round(xk*m),y0,x0+round(xk*m),y0);
textout(x0+round(xk*m)-5,y0-20,'X');
line(x0,y0,x0,y0-round(ymx*m));
textout(x0+10,y0-round(ymx*m)-5,'Y');
textout(x0,y0+10,'0');
for i:=1 to 2*trunc(xk) do
begin
line(x0+round(m*i/2),y0+3,x0+round(m*i/2),y0-3);
line(x0-round(m*i/2),y0+3,x0-round(m*i/2),y0-3);
textout(x0+round(m*i/2),y0+10,floattostr(i/2));
textout(x0-round(m*i/2),y0+10,floattostr(-i/2));
line(x0+3,y0-round(m*i),x0-3,y0-round(m*i));
textout(x0-30,y0-round(m*i),inttostr(i));
end;
moveto(x0+round(x1[1]*m),y0-round(y1[1]*m));
setpencolor(clGreen);
circle(x0+round(x1[1]*m),y0-round(y1[1]*m),2);
for i:=1 to n do
begin
setpencolor(clRed);
lineto(x0+round(x1[i]*m),y0-round(y1[i]*m));
setpencolor(clGreen);
circle(x0+round(x1[i]*m),y0-round(y1[i]*m),2);
x:=x+h;
end;
setpencolor(clRed);
textout(x0-60,0,'График функции y=(1/(x+2))+2');
textout(x0-50,20,'интервал [-3;3] h=0.05');
setpencolor(clBlack);
textout(10,0,'Значения аргумента');
textout(30,20,'и функции');
line(10,50,10,50+(n+1)*18);
line(60,50,60,50+(n+1)*18);
line(110,50,110,50+(n+1)*18);
for i:=0 to n+1 do
line(10,50+i*18,110,50+i*18);
textout(35,55,'X');
textout(85,55,'Y');
for i:=1 to n do
begin
str(x1[i]:0:2,st);
textout(15,55+18*i,st);
str(y1[i]:0:2,st);
textout(65,55+18*i,st);
end;
end.
Ты считать умеешь?
(3 - (-3)) / 0.05 + 1 = 121
Точек (x, y) у тебя 121, а размеры массивов x1 и y1, в которых ты хранишь точки - всего 30. Разумеется, вылезает за границы массива.
x1,y1:array[1..3000] of real;
Ошибка "Ошибка времени выполнения: Индекс находился вне границ массива." означает, что программа пытается обратиться к элементу массива, которого не существует. В вашем случае это может происходить в строке 69 при обращении к элементу массива x1[i] и y1[i], так как переменная i принимает значения от 1 до n, а размер массива равен 30.
Возможно, значение переменной n превышает размер массивов x1 и y1. Попробуйте добавить проверку перед строкой 69, чтобы убедиться, что i находится в допустимых пределах:
for i:=1 to n do
begin
if (i < 1) or (i > 30) then
begin
writeln('Ошибка: i находится вне допустимых пределов.');
break;
end;
setpencolor(clRed);
lineto(x0+round(x1[i]*m),y0-round(y1[i]*m));
setpencolor(clGreen);
circle(x0+round(x1[i]*m),y0-round(y1[i]*m),2);
x:=x+h;
end;
Также стоит убедиться, что значение переменной n не превышает 30, чтобы избежать переполнения массивов:
n:=0;
while x<=xk do
begin
n:=n+1;
if (n < 1) or (n > 30) then
begin
writeln('Ошибка: n находится вне допустимых пределов.');
break;
end;
x1[n]:=x;
y1[n]:=F(x);
if y1[n]>ymx then ymx:=y1[n];
x:=x+h;
end;
Если эти изменения не помогут, пожалуйста, уточните, в какой строке происходит ошибка и какое сообщение об ошибке выводится.