keep_163
14-11-2015, 14:32
Уважаемые господа, гуро-программисты, помогите перевести данную программу с паскаля на С++
Form2: TForm2;
implementation
uses Unit1,Unit4;
{$R *.dfm}
procedure TForm2.SpeedButton1Click(Sender: TObject);
begin
form4.Show;form2.Hide;
end;
procedure TForm2.SpeedButton2Click(Sender: TObject);
var
i,p :integer; // переменные, использующиеся в циклах
a : integer; // а - параметр а в нашем уравнении
h,t:real; // h - точность, t - шаг
n :integer; // число шагов
// x0,y0 :real; // начальные значения x и y
tn, tk : integer; // границы
x,y,kx1,kx2,kx3,kx4,ky1,ky2,ky3,ky4,dx,dy :array[1..10000] of real;
// x,y - значения x и y на соответствующем шаге
// kx1-4,ky1-4 - переменные принимающие участие в формуле Рунге-Кутта
//dx, dy - отрезки x и y ,из которых складывается решение ур-ия по Р-Кутту
begin
a:=strtoint(edit1.Text);tn:=strtoint(edit2.Text);
tk:=strtoint(edit3.Text);h:=strtofloat(edit4.Text);
x[1]:=strtofloat(edit5.Text);y[1]:=strtofloat(edit6.Text);
n:=trunc((tk-tn)/h);
t:=tn;
chart1.SeriesList[0].Clear;chart2.SeriesList[0].Clear;
stringgrid1.RowCount:=n;
for i:= 1 to (n) do
begin
kx1[i]:=h*(-a*y[i]-6*x[i]);
kx2[i]:=h*(-a*y[i]-6*(x[i]+kx1[i]/2));
kx3[i]:=h*(-a*y[i]-6*(x[i]+kx2[i]/2));
unit Unit1;
interface
end;
var
Form1: TForm1;
t1,t2,dt,t,k1,k2,v1,v2:real;//определяем тип переменных
m,s,c,p,h1,h2,s1,s2,ds:real;
implementation
uses Unit2, Unit3;{$R *.dfm}
Кнопка
procedure TForm1.Button2Click(Sender: TObject);
begin
form1.Hide;form2.show;end;
Кнопка
procedure TForm1.Button1Click(Sender: TObject);
Var i:integer;
x,k11,k12,k21,k22,k31,r,mu,k32,k41,k42,d1,d2:real;
function f(t,v1,v2,s,k1,c,m,p:real):real;
begin
f:=((9.8*m-k1*v1-0.5*c*s*p*v1*v1)/m);//задаем функцию
end;
begin
//очистка
Series1.Clear;Series2.Clear;Series3.Clear;
Series4.Clear;Series5.Clear;
Series6.Clear;Series7.Clear;Series8.Clear;Series9.Clear;Series10.Clear;
Series11.Clear;Series12.Clear;Series13.Clear;Series14.Clear;Series15.Clear;
//ввод значений
t1:=strtofloat(Edit1.Text);//начальное время
t2:=strtofloat(Edit2.Text);//конечное время
k1:=strtofloat(Edit3.Text);//коэффициент
c:=strtofloat(Edit4.Text); //коэф лобового сопротивления
m:=strtofloat(Edit5.Text);//масса тела
dt:=strtofloat(Edit6.Text);//шаг изменения времени
s1:=strtofloat(Edit7.Text);//начальное площадь
p:=strtofloat(Edit8.Text); //плотность тела
s2:=strtofloat(Edit11.Text); //конечное значение площади
ds:=strtofloat(Edit12.Text); //шаг изменения площади
i:=1;s:=s1;
while s<s2 do//цикл изменения плошади
begin
x:=t1;v1:=0;v2:=1;//начальные условия
repeat //цикл по времени
chart1.Series[i].Add(v1,floattostr(x));//построение графика
//вычисляем коэф Рунге-Кутта
k11:=dt*v2;k12:=dt*f(x,v1,v2,s,k1,c,m,p);
k21:=dt*(v2+k12/2);
k22:=dt*f(x+dt/2,v1+k11/2,v2+k12/2,s,k1,c,m,p);
k31:=dt*(v2+k22/2);
k32:=dt*f(x+dt/2,v1+k21/2,v2+k22/2,s,k1,c,m,p);
k41:=dt*(v2+k32);
k42:=dt*f(x+dt,v1+k31,v2+k32,s,k1,c,m,p);
d1:=(k11+2*k21+k31+k41)/6;
d2:=(k12+2*k22+k32+k42)/6;
v1:=v1+d1;v2:=v2+d2;
x:=x+dt;//пошагавое изменение х
until x>t2+dt;//как только время станет равной t2 заканчиваем цикл
s:=s+ds; i:=i+1; end;//заканчиваем цикл по площади
end;
Кнопка
procedure TForm1.Button3Click(Sender: TObject);
Var i:integer;
x,k11,k12,k21,k22,k31,k32,k41,k42,d1,d2,mu,r:real;
function f(h,v1,v2,s,k1,c,m,p:real):real;
begin
f:=((9.8*m+k1*v1+0.5*c*s*p*v1*v1)/m); //задаем функцию
end;
begin
Series16.Clear;Series17.Clear;Series18.Clear;Series19.Clear;
Series20.Clear;Series21.Clear;Series22.Clear;Series23.Clear;
Series24.Clear;Series25.Clear;Series26.Clear;Series27.Clear;
Series28.Clear;Series29.Clear;Series30.Clear;
k1:=strtofloat(Edit3.Text);//коэф
mu:=strtofloat(Edit4.Text); //коэф лобового сопротивления
m:=strtofloat(Edit5.Text);//масса тела
dt:=strtofloat(Edit6.Text);//шаг изменения времени
s1:=strtofloat(Edit7.Text);//начавльное значение площади
r:=strtofloat(Edit8.Text);//плотность тела
h1:=strtofloat(Edit9.Text); //начальное значение
15:16:36
высоты
h2:=strtofloat(Edit10.Text);//конечное значение площади
s2:=strtofloat(Edit11.Text); //конечное значение площади
ds:=strtofloat(Edit12.Text); //шаг изменения площади
for i:=1 to round((s2-s1)/ds) do//цикл изменения площади
begin
x:=h1;v1:=0;v2:=1;//начальные условия
repeat //цикл изменения времени
chart2.Series[i-1].Add(v1,floattostr(x));//построение графика
k11:=dt*v2;k12:=dt*f(x,v1,v2,s,k1,c,m,p);
k21:=dt*(v2+k12/2);
k22:=dt*f(x-dt/2,v1+k11/2,v2+k12/2,s,k1,c,m,p);
k31:=dt*(v2+k22/2);
k32:=dt*f(x-dt/2,v1+k21/2,v2+k22/2,s,k1,c,m,p);
k41:=dt*(v2+k32);
k42:=dt*f(x-dt,v1+k31,v2+k32,s,k1,c,m,p);
d1:=(k11+2*k21+k31+k41)/6;
d2:=(k12+2*k22+k32+k42)/6;
v1:=v1+d1;v2:=v2+d2;
x:=x-dt;s:=s1+ds;
until x<h2-dt;
end;
end;
Кнопка
procedure TForm1.BitBtn1Click(Sender: TObject);
Var ind,k:integer;
k1,m,vo,h1,s,p,v,dt,y1,y2,dy1,dy2,c,dv,ds,s1,s2,t,mu,r:real;
function f(m,k1,c,s,p,v1:real):real;
begin
f:=((9.8*m+6*3.14*mu*r*v1+0.5*k1*v1*v1)/m); //задаем функцию
end;
begin
form3.Show;
for ind:=0 to 9 do begin
form3.Chart1.Serieslist[ind].Clear;
form3.Chart2.Serieslist[ind].Clear;
end;
//Входные параметры
k1:=strtofloat(Edit3.Text);//коэф
mu:=strtofloat(Edit4.Text); //коэф лобового сопротивления
m:=strtofloat(Edit5.Text);//масса тела
s1:=strtofloat(Edit7.Text);//начавльное значение площади
r:=strtofloat(Edit8.Text);//плотность тела
h1:=strtofloat(Edit9.Text); //начальное значение высоты
s2:=strtofloat(Edit11.Text); //конечное значение площади
ds:=strtofloat(Edit12.Text); //шаг изменения площади
vo:=strtofloat(edit13.Text);//начальная скорость
k:=1;//номер графика
s:=s1;
// 1
while s<=s2 do
begin
ind:=1;
t:=0; y1:=vo; y2:=f(m,k1,c,s,p,vo);
while t<=10 do
begin
form3.Chart1.SeriesList[k].Add(y1,floattostr(t));
dy1:=dt*y2; dy2:=dt*f(m,k1,c,s,p,vo);
y1:=y1+dy1; y2:=y2+dy2;
t:=t+0.1;
end;
s:=s1+ds; k:=k+1;
end;
//2
k:=0; t:=30;y1:=vo;y2:=f(m,k1,c,s,p,vo);
while t<=44 do
begin
s:=s1;
while s<=s2 do
begin
form3.Chart2.SeriesList[k].Add(y2,floattostr(s));
dy1:=0.1*y2;
dy2:=0.1*f(m,k1,c,s,p,y1);
y1:=y1+dy1; y2:=y2+dy2;
s:=s1+ds;
end;
t:=t+2; k:=k+1;
end;end;end.
Form2: TForm2;
implementation
uses Unit1,Unit4;
{$R *.dfm}
procedure TForm2.SpeedButton1Click(Sender: TObject);
begin
form4.Show;form2.Hide;
end;
procedure TForm2.SpeedButton2Click(Sender: TObject);
var
i,p :integer; // переменные, использующиеся в циклах
a : integer; // а - параметр а в нашем уравнении
h,t:real; // h - точность, t - шаг
n :integer; // число шагов
// x0,y0 :real; // начальные значения x и y
tn, tk : integer; // границы
x,y,kx1,kx2,kx3,kx4,ky1,ky2,ky3,ky4,dx,dy :array[1..10000] of real;
// x,y - значения x и y на соответствующем шаге
// kx1-4,ky1-4 - переменные принимающие участие в формуле Рунге-Кутта
//dx, dy - отрезки x и y ,из которых складывается решение ур-ия по Р-Кутту
begin
a:=strtoint(edit1.Text);tn:=strtoint(edit2.Text);
tk:=strtoint(edit3.Text);h:=strtofloat(edit4.Text);
x[1]:=strtofloat(edit5.Text);y[1]:=strtofloat(edit6.Text);
n:=trunc((tk-tn)/h);
t:=tn;
chart1.SeriesList[0].Clear;chart2.SeriesList[0].Clear;
stringgrid1.RowCount:=n;
for i:= 1 to (n) do
begin
kx1[i]:=h*(-a*y[i]-6*x[i]);
kx2[i]:=h*(-a*y[i]-6*(x[i]+kx1[i]/2));
kx3[i]:=h*(-a*y[i]-6*(x[i]+kx2[i]/2));
unit Unit1;
interface
end;
var
Form1: TForm1;
t1,t2,dt,t,k1,k2,v1,v2:real;//определяем тип переменных
m,s,c,p,h1,h2,s1,s2,ds:real;
implementation
uses Unit2, Unit3;{$R *.dfm}
Кнопка
procedure TForm1.Button2Click(Sender: TObject);
begin
form1.Hide;form2.show;end;
Кнопка
procedure TForm1.Button1Click(Sender: TObject);
Var i:integer;
x,k11,k12,k21,k22,k31,r,mu,k32,k41,k42,d1,d2:real;
function f(t,v1,v2,s,k1,c,m,p:real):real;
begin
f:=((9.8*m-k1*v1-0.5*c*s*p*v1*v1)/m);//задаем функцию
end;
begin
//очистка
Series1.Clear;Series2.Clear;Series3.Clear;
Series4.Clear;Series5.Clear;
Series6.Clear;Series7.Clear;Series8.Clear;Series9.Clear;Series10.Clear;
Series11.Clear;Series12.Clear;Series13.Clear;Series14.Clear;Series15.Clear;
//ввод значений
t1:=strtofloat(Edit1.Text);//начальное время
t2:=strtofloat(Edit2.Text);//конечное время
k1:=strtofloat(Edit3.Text);//коэффициент
c:=strtofloat(Edit4.Text); //коэф лобового сопротивления
m:=strtofloat(Edit5.Text);//масса тела
dt:=strtofloat(Edit6.Text);//шаг изменения времени
s1:=strtofloat(Edit7.Text);//начальное площадь
p:=strtofloat(Edit8.Text); //плотность тела
s2:=strtofloat(Edit11.Text); //конечное значение площади
ds:=strtofloat(Edit12.Text); //шаг изменения площади
i:=1;s:=s1;
while s<s2 do//цикл изменения плошади
begin
x:=t1;v1:=0;v2:=1;//начальные условия
repeat //цикл по времени
chart1.Series[i].Add(v1,floattostr(x));//построение графика
//вычисляем коэф Рунге-Кутта
k11:=dt*v2;k12:=dt*f(x,v1,v2,s,k1,c,m,p);
k21:=dt*(v2+k12/2);
k22:=dt*f(x+dt/2,v1+k11/2,v2+k12/2,s,k1,c,m,p);
k31:=dt*(v2+k22/2);
k32:=dt*f(x+dt/2,v1+k21/2,v2+k22/2,s,k1,c,m,p);
k41:=dt*(v2+k32);
k42:=dt*f(x+dt,v1+k31,v2+k32,s,k1,c,m,p);
d1:=(k11+2*k21+k31+k41)/6;
d2:=(k12+2*k22+k32+k42)/6;
v1:=v1+d1;v2:=v2+d2;
x:=x+dt;//пошагавое изменение х
until x>t2+dt;//как только время станет равной t2 заканчиваем цикл
s:=s+ds; i:=i+1; end;//заканчиваем цикл по площади
end;
Кнопка
procedure TForm1.Button3Click(Sender: TObject);
Var i:integer;
x,k11,k12,k21,k22,k31,k32,k41,k42,d1,d2,mu,r:real;
function f(h,v1,v2,s,k1,c,m,p:real):real;
begin
f:=((9.8*m+k1*v1+0.5*c*s*p*v1*v1)/m); //задаем функцию
end;
begin
Series16.Clear;Series17.Clear;Series18.Clear;Series19.Clear;
Series20.Clear;Series21.Clear;Series22.Clear;Series23.Clear;
Series24.Clear;Series25.Clear;Series26.Clear;Series27.Clear;
Series28.Clear;Series29.Clear;Series30.Clear;
k1:=strtofloat(Edit3.Text);//коэф
mu:=strtofloat(Edit4.Text); //коэф лобового сопротивления
m:=strtofloat(Edit5.Text);//масса тела
dt:=strtofloat(Edit6.Text);//шаг изменения времени
s1:=strtofloat(Edit7.Text);//начавльное значение площади
r:=strtofloat(Edit8.Text);//плотность тела
h1:=strtofloat(Edit9.Text); //начальное значение
15:16:36
высоты
h2:=strtofloat(Edit10.Text);//конечное значение площади
s2:=strtofloat(Edit11.Text); //конечное значение площади
ds:=strtofloat(Edit12.Text); //шаг изменения площади
for i:=1 to round((s2-s1)/ds) do//цикл изменения площади
begin
x:=h1;v1:=0;v2:=1;//начальные условия
repeat //цикл изменения времени
chart2.Series[i-1].Add(v1,floattostr(x));//построение графика
k11:=dt*v2;k12:=dt*f(x,v1,v2,s,k1,c,m,p);
k21:=dt*(v2+k12/2);
k22:=dt*f(x-dt/2,v1+k11/2,v2+k12/2,s,k1,c,m,p);
k31:=dt*(v2+k22/2);
k32:=dt*f(x-dt/2,v1+k21/2,v2+k22/2,s,k1,c,m,p);
k41:=dt*(v2+k32);
k42:=dt*f(x-dt,v1+k31,v2+k32,s,k1,c,m,p);
d1:=(k11+2*k21+k31+k41)/6;
d2:=(k12+2*k22+k32+k42)/6;
v1:=v1+d1;v2:=v2+d2;
x:=x-dt;s:=s1+ds;
until x<h2-dt;
end;
end;
Кнопка
procedure TForm1.BitBtn1Click(Sender: TObject);
Var ind,k:integer;
k1,m,vo,h1,s,p,v,dt,y1,y2,dy1,dy2,c,dv,ds,s1,s2,t,mu,r:real;
function f(m,k1,c,s,p,v1:real):real;
begin
f:=((9.8*m+6*3.14*mu*r*v1+0.5*k1*v1*v1)/m); //задаем функцию
end;
begin
form3.Show;
for ind:=0 to 9 do begin
form3.Chart1.Serieslist[ind].Clear;
form3.Chart2.Serieslist[ind].Clear;
end;
//Входные параметры
k1:=strtofloat(Edit3.Text);//коэф
mu:=strtofloat(Edit4.Text); //коэф лобового сопротивления
m:=strtofloat(Edit5.Text);//масса тела
s1:=strtofloat(Edit7.Text);//начавльное значение площади
r:=strtofloat(Edit8.Text);//плотность тела
h1:=strtofloat(Edit9.Text); //начальное значение высоты
s2:=strtofloat(Edit11.Text); //конечное значение площади
ds:=strtofloat(Edit12.Text); //шаг изменения площади
vo:=strtofloat(edit13.Text);//начальная скорость
k:=1;//номер графика
s:=s1;
// 1
while s<=s2 do
begin
ind:=1;
t:=0; y1:=vo; y2:=f(m,k1,c,s,p,vo);
while t<=10 do
begin
form3.Chart1.SeriesList[k].Add(y1,floattostr(t));
dy1:=dt*y2; dy2:=dt*f(m,k1,c,s,p,vo);
y1:=y1+dy1; y2:=y2+dy2;
t:=t+0.1;
end;
s:=s1+ds; k:=k+1;
end;
//2
k:=0; t:=30;y1:=vo;y2:=f(m,k1,c,s,p,vo);
while t<=44 do
begin
s:=s1;
while s<=s2 do
begin
form3.Chart2.SeriesList[k].Add(y2,floattostr(s));
dy1:=0.1*y2;
dy2:=0.1*f(m,k1,c,s,p,y1);
y1:=y1+dy1; y2:=y2+dy2;
s:=s1+ds;
end;
t:=t+2; k:=k+1;
end;end;end.