Помогите исправить код в Паскале. Пытаюсь построить график движения тела, брошенного под углом к горизонту
В моей программе получается, что тело начинает движение с какой-то высоты. Не понимаю, почему так. Посмотрите и помогите исправить пожалуйста.
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;
{Здесь первую часть цикла можно повторить}