Вопрос задан 17.01.2025 в 14:02. Предмет Информатика. Спрашивает Aizatullina Lina.

Проблема заключается в том что на месте, которое выделено "//...//" PascalABC.Net говорит, что там ошибка, пожалуйста помогите, укажите ошибку и если есть возможность её исправить, это срочно program Zmeya;
Uses graphabc, events,timers;

const
r=5 ;
d=7;

type
TDirection = (None, Left, Right, Up, Down);

var x,t,y,i,z,xr,yr,prin1,prin2,prin3,prin4,prin5,k,s4et,prin6: integer;
Direction :TDirection;
xs,ys,bufx,bufy:array[1..200]of integer;


procedure shar3;
begin
SetBrushColor(clYellow);
circle(xs[k],ys[k],r);
end;

procedure Circl;
begin
SetBrushColor(clBlack);
circle(x,y,r);
end;

procedure rshar ;
begin
xr:=Random(WindowWidth) ;
yr:=Random( WindowHeight);
end;

procedure rshar2;
begin
SetBrushColor(clYellow);
circle(xr,yr,r);
end;

procedure XP(Key:integer);
begin
case Key of
VK_Left: Direction := Left ;
VK_Right: Direction := Right ;
VK_UP: Direction := UP ;
VK_Down: Direction :=Down ;
end;
circle(x,y,r);
end;


procedure pause;
begin
// for i:=1 to 1 do //
begin
Circl;
rshar2;
ClearWindow;
rshar2 ;
prin1:=(xr-x+r)*(xr-x+r)+(yr-y)*(yr-y) ;
prin2:=(xr-x-r)*(xr-x-r)+(yr-y)*(yr-y) ;
prin3:=(xr-x)*(xr-x)+(yr-y+r)*(yr-y+r) ;
prin4:=(xr-x)*(xr-x)+(yr-y-r)*(yr-y-r) ;
prin5:=R*R;
if (prin1)<=(prin5) then begin
rshar ;
s4et:=s4et+1;
end;


if (prin2)<=(prin5) then begin
rshar ;
s4et:=s4et+1;
end;
if (prin3)<=(prin5) then begin
rshar ;
s4et:=s4et+1;
end;
if (prin4)<=(prin5) then begin
rshar ;
s4et:=s4et+1;
end;

case Direction of
Left: begin x:=x-d; if x<=0 then x:=WindowWidth end;
Up: begin y:=y-d; if y<=0 then y:=WindowHeight end;
Right: begin x:=x+d; if x>=WindowWidth then x:=0 end;
Down: begin y:=y+d; if y>=WindowHeight then y:=0 end;
end;
xs[1]:=x;
ys[1]:=y;
for k:=1 to s4et do
begin
bufx[k]:=xs[k];
bufy[k]:=ys[k];

end;
for k:=1 to s4et do
begin
xs[k+1]:=bufx[k];
ys[k+1]:=bufy[k] ;
end;
for k:=2 to s4et do
shar3;
Circl;
end;
end;
begin
rshar;
s4et:=2;

Direction := None;

x:=WindowWidth div 2;
y:=WindowHeight div 2;
OnKeyDown:=XP;
CreateTimer(150,pause);

end.

Перейти к ответам

Ответы на вопрос

Отвечает Филатова Алина.

В данном коде ошибка связана с областью, которая выделена комментарием //...// в процедуре pause. Рассмотрим эту процедуру более детально и выявим проблему.

Анализ ошибки

В коде можно заметить следующие потенциальные проблемы:

  1. Лишние операторы присваивания и неверное использование условий: При использовании сравнений в PascalABC.Net нужно обратить внимание на операторы <=, >=, <, >, которые должны использоваться с обычными условиями, а не с заменой на HTML-символы, такие как <, >, и т.д. PascalABC не распознает их как операторы, а это приводит к ошибке компиляции.

  2. Необходимость очистки экрана и отрисовки объектов в правильной последовательности: Учитывая, что ClearWindow вызывается несколько раз в процессе отрисовки, это может создавать ошибки, особенно если отрисовка объектов идет до очистки экрана.

Исправление кода

Для корректной работы следует внести следующие изменения:

  • Замените < и > на < и >.
  • Проверьте порядок вызовов функций ClearWindow и rshar2, чтобы они не очищали экран до отрисовки нужных объектов.

Исправленный код

pascal
procedure pause; begin ClearWindow; Circl; rshar2;

prin1 := (xr - x + r) * (xr - x + r) + (yr - y) * (yr - y); prin2 := (xr - x - r) * (xr - x - r) + (yr - y) * (yr - y); prin3 := (xr - x) * (xr - x) + (yr - y + r) * (yr - y + r); prin4 := (xr - x) * (xr - x) + (yr - y - r) * (yr - y - r); prin5 := R * R;

if (prin1 <= prin5) or (prin2 <= prin5) or (prin3 <= prin5) or (prin4 <= prin5) then begin rshar; s4et := s4et + 1; end;

case Direction of Left: begin x := x - d; if x <= 0 then x := WindowWidth; end; Up: begin y := y - d; if y <= 0 then y := WindowHeight; end; Right: begin x := x + d; if x >= WindowWidth then x := 0; end; Down: begin y := y + d; if y >= WindowHeight then y := 0; end; end;

xs[1] := x; ys[1] := y;

for k := 1 to s4et do begin bufx[k] := xs[k]; bufy[k] := ys[k]; end;

for k := 1 to s4et do begin xs[k + 1] := bufx[k]; ys[k + 1] := bufy[k]; end;

for k := 2 to s4et do shar3;

Circl; end;

Объяснение изменений

  • Замена операторов: Исправлены < и > на стандартные операторы сравнения (< и >).
  • Упрощение условия попадания в круг: Использовано объединение условий с помощью or, что позволяет уменьшить код и избежать повторений.
  • Порядок вызовов функций: Убедились, что ClearWindow вызывается перед началом отрисовки, а не после, чтобы объекты отображались корректно.

Эти изменения должны устранить ошибку и обеспечить правильную работу программы.

Похожие вопросы

Топ вопросов за вчера в категории Информатика

Последние заданные вопросы в категории Информатика

Задать вопрос