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

В моей программе получается, что тело начинает движение с какой-то высоты. Не понимаю, почему так. Посмотрите и помогите исправить пожалуйста.

         Program one;
{График движения тела под углом к горизонту}
uses graphABC, CRT;
const g=10;
var a,x,y,v,t,vy,vx: real;
y1,x1,t1: string;
x2,y2,c,t2,vy2:integer;
begin
writeln ('Введи угол броска к горизонту в градусах', ' a=');
v:=17; {скорость тела}
readln (a);
a:=a*0.0174533; {Перевод градусов в радианы}
t:= 0;
c:= 0;
repeat 
  t:=t+1;
  x:=v*cos(a)*t;
  y:=v*sin(a)*t-g*t*t/2;
  vy:=v*sin(a)-g*t;
  x2:=round(x);
  y2:=round(y);
  t2:= round(t);
  circle (x2,360-y2,10);
  t1:=inttostr (t2);
  X1:=inttostr (x2);
  y1:=inttostr(y2);
  textout (350,100+c,t1);
  textout (400,100+c,x1);
  textout (450,100+c,y1);
  Line (330,115+c,470,115+c);
  c:=c+30;
until y=0;
end.

Ответы (2 шт):

Автор решения: Zhihar

а что вы хотите?

у вас цикл пока не будет достигнута высота 0 (кстати правильнее было бы ставить нестрогое сравнение <= 0, ну на всякий случай):

repeat t:=t+1;

y:=v*sin(a)*t-g*t*t/2;

until y=0;

и что же происходит в первый момент времени? Он равен не 0, а 1

y = v*sin(a)-g/2

что равно

y = 17 * sin(a) - 5

ну и какой бы угол кроме 0 ни задали, все не 0 высоты начнется

т.е. высота уже не нулевая, по хорошему вам надо

repeat

y:=v*sin(a)*t-g*t*t/2;

t:=t+1;

until y=0;
→ Ссылка
Автор решения: MBo

Выводить позицию нужно до изменения, в начале цикла, а также один раз после окончания цикла.

a:=a*0.0174533; {Перевод градусов в радианы}
t:= 0;
c:= 0;
x := 0;
y := 0;
repeat 
  x2:=round(x);
  y2:=round(y);
  t2:= round(t);
  circle (x2,360-y2,10);
  t1:=inttostr (t2);
  X1:=inttostr (x2);
  y1:=inttostr(y2);
  textout (350,100+c,t1);
  textout (400,100+c,x1);
  textout (450,100+c,y1);
  Line (330,115+c,470,115+c);

  c:=c+30;
  t:=t+1;
  x:=v*cos(a)*t;
  y:=v*sin(a)*t-g*t*t/2;
until y<=0;

{Здесь первую часть цикла можно повторить}
→ Ссылка