Другие языки программирования и технологии

помогите, пожалуйста, c делфи!

Мне надо запустить ракету: я вот сделал так, но почему-то у меня после запуска делфи зависает и ошибки выдает (invalid floating point operation) помогите, что у меня не так? если возможно по коду... Данные для проверки(Mr=900 Mt=2100 m=30 U=1000 g=9,81 k=1,5 V0=10 X0=0 dt=0) var Mr,Mt,M0,m,U,V,V0,k,g,X,X0,i,t,dt:real; procedure TForm1.Button1Click(Sender: TObject); begin Mr:=StrTofloat(Edit1.Text); Mt:=StrToFloat(Edit2.Text); m:=StrTofloat(Edit3.Text); u:=StrTofloat(Edit4.Text); g:=StrTofloat(Edit5.Text); k:=StrTofloat(Edit6.Text); V0:=StrTofloat(Edit7.Text); X0:=StrTofloat(Edit8.Text); dt:=StrTofloat(Edit9.Text); i:=0; V:=V0; X:=X0; t:=0; Repeat begin i:=i+1; t:=i*dt; M0:=Mr+Mt-m*t; X0:=X0+t*V0; V:=V+t/M0*(-M0*g+m*U-k*V*V*(V/abs(V))); chart1.SeriesList[0].AddXY(X0,V0,'',clGreen); end; until (X=0) and (V<0) end;
1. var Mr,Mt,M0,m,U,V,V0,k,g,X,X0,i,t,dt:real; - вот это надо перенести внутрь процедуры

2. У тебя dt = 0 и поэтому цикл получается бесконечный, ни V, ни X0 не меняется. Да и условия завершения цикла странное какое-то, ты написал слова когда хочешь остановиться, тогда бы мог тебе подсказать

3. chart1.SeriesList[0].AddXY(X0,V0,'',clGreen); - ты меняешь V а выводишь на график V0, тоже что-то не то

3. У тебя есть деление на M0 в выражении V:=V+t/M0*(-M0*g+m*U-k*V*V*(V/abs(V))); , потенциально здесь может быть деление на ноль. Я так понял Mr - это масса ракеты, а Mt - запас топлива, так что тебе надо проверять, не израсходовано ли все топливо, и не давать уменьшить M0 меньше Mr

4. Насколько я понял тут:
M0:=Mr+Mt-m*t;
X0:=X0+t*V0;
V:=V+t/M0*(-M0*g+m*U-k*V*V*(V/abs(V)));

вычисляются изменения массы, координаты и скорости за время dt. Если так, то тебе надо вместо t везде использовать dt. И ты бы расшифровал Mr=900 Mt=2100 m=30 U=1000 g=9,81 k=1,5 V0=10 X0=0 dt=0, что значит каждая переменная. Тогда бы я мог проконсультировать точнее. Как-то формула изменения скорости сейчас странно выглядит.
Владимир Воронин
Владимир Воронин
8 415
Лучший ответ
не обязательно деление ноль. Сделай вывод всех переменных после каждой строчки в цикле, увидишь, при каких значениях оно отваливается.

В цикле условие х=0 глупое, т. к. х присваивается один раз, значит и выходить по х=0 надо ДО цикла.
Значит где то есть деление на ноль.
При трассировки кода получены значения.
X0=0;
V0=10;
V=10;
t=0;
M0=3000;
Они не изменяются.
t:=i*dt; Тута... t всегда =0, т. к. dt=0; dt как я думаю это шаг временной шкалы?
Дальше идет зацикливание... у меня делфи 7 не выдал ошибки с плавающей точкой.... но график строить отказался.
M0:=Mr+Mt-m*t; Значение тоже не меняеться поскольку переменная t=0;
X0:=X0+t*V0; опять t=0;
V:=V+t/M0*(-M0*g+m*U-k*V*V*(V/abs(V))); ..здесь есть t/M0..при t=0; ноль делить сложно.
При задании dt=1; Крайние полученные значения. X0=8610; V0=10;