Автор: aygul 21.02.2006 3:11
Помогите пожалуйста! надо составить програмки!!!тема-полет тела брошенного к горизонту!!!!
1)составить программку, на которойи было бы: в левом углу торчит пушка, нарисована горизонтальная линия(на этой линии пушка как раз и стоит). Из ствола пушки летит точка(или снаряд,или снежинка или что-нибудь подобное!)и падает на линию пролетев какое-то определённое расстояние, и на экране должна быть видна траетория движения снаряда!!!
2)составить программку, на которойи было бы: в левом углу торчит пушка, нарисована горизонтальная линия(на этой линии пушка как раз и стоит). Из ствола пушки летит точка(или снаряд,или снежинка или что-нибудь подобное!) и должна попасть в цель(цель в виде или прямоугольника или дома или машины или чего-либо другого) которая находится на некотором расстоянии от пушки!!!надо подобрать для этого правильные значения!!!При попадании снаряда в целя, цель должна всячески сигнализировать об этом(мигать, должны быть волны какие-нибудь около цели, и чтобы компьютер пищал!!!)
3)Создать игру-дуэль двух пушек(на двоих) условия те же что и в пердыдущих прогах!!!
4)lпри каком угле самая боьшая дальность полета?почему???
При составлении программ надо использовать:
Код
g=9.8
v(x)=v(nacalnaya)*cosb { косинус угла b=cosb}
v(y)=v(nacalnaya)*sinb {синус угла b=sinb}
a(t)=-g
v(t)=-g*t+constanta
при t=(0) следует что v(0)=v(nacalnaya)
Constanta=v(nacalnaya)
v(t)=v(nacalnaya)-g*t
s(t)=v(nacalnaya)*t-(g*t*t)/2 + constanta
s(0)=0 значит constanta=s(0)=0
s(t)=v(nacalnaya)*t-(g*t*t)/2
при t=0 следуетv(0)=v(nacalnaya)
Составим систему уравнений:
y=v(nacalnaya)*sinb*t-(g*t*t)/2
x=v(nacalnaya)*cosb*t
В некоторой точке B (посередине траетории0, где тело находится на самой большой высоте и после этого начинает падать) V(y)=0, вычислим t, значит t=(2*v(nacalnaya))/g.
Подставим это значение t в формулу x=v(nacalnaya)*cosb*t , значитx=(2*v(nacalnaya)*v(nacalnaya)*cosb)/g
также надо использовать в проге: X:=round(x) и while t<=(2*v(nacalnaya))/g do
нЕ забудьте градусы углов перевести в радианы!!!
Автор: Ozzя 21.02.2006 13:33
Не помню, откуда взял.
Попробуйте переделать под себя.
Код
program polet;
uses
crt,graph;
var
mashtab_x,mashtab_y,t_dv,s,y_max,H,L,Vx,Vy,v0,alfa,m,V:real;
i,grDriver,grMode,x,y:integer;
text,text2:string;
const
K=10;
g=9.81;
dT=0.001;
procedure paint(x,y,color:integer); {Рисование тела}
begin
setcolor(color);
circle(x,y,2);
end;
procedure razmetka; {Разметка экpана}
var
i,j:integer;
text:string;
begin
setcolor(15); {Установка цвета(белового)}
line(0,getmaxy,getmaxx,getmaxy);
line(0,getmaxy,0,0);
i:=0;
while i<=round(GetMaxX/mashtab_x) do
begin
inc(j);
line(i,getmaxy,i,475);
moveto(i-10,465);
if odd(j) then
begin
str(round((i/mashtab_x)),text);
OutText(text);
end;
inc(i,round(100*mashtab_x));
end;
i:=0;
j:=0;
while i<=round(GetMaxY/mashtab_y) do
begin
inc(j);
line(0,getmaxy-i,5,getmaxy-i);
moveto(10,getmaxy-i-3);
if odd(j) then
begin
str(round((i/mashtab_y)),text);
OutText(text);
end;
inc(i,round(100*mashtab_y));
end;
moveto(5,getmaxy-10);
OutText('0');
end;
procedure getmashtab; {Установка масштаба}
begin
mashtab_x:=1;
mashtab_y:=1;
if (s>GetMaxX) then
begin
mashtab_x:=GetMaxX/round(s);
if y_max>GetMaxY then
mashtab_y:=GetMaxY/round(y_max);
end
else
if y_max>GetMaxY then
begin
mashtab_y:=GetMaxY/round(y_max);
end
end;
procedure info;
var
text,text2,text3:string;
begin
setfillstyle(0,black);
bar(400,0,GetMaxX,40);
setcolor(15);
str(trunc(V),text);
text2:='Скоpость '+text;
outtextxy(400,10,text2);
str(trunc(L),text);
str(trunc(H),text2);
text3:='Длина '+text+' Высота '+text2;
outtextxy(400,20,text3);
end;
begin
clrscr;
writeln('‚ўҐ¤ЁвҐ з «мго бЄ®а®бвм (¬/б):');
readln(v0);
WriteLn('‚ўҐ¤ЁвҐ гЈ®« ўлбв५ (0-90 Ја ¤гб®ў): ');
readln(alfa);
WriteLn('‚ўҐ¤ЁвҐ ¬ ббг б ап¤ : ');
readln(m);
m:=m*1000; {Пpеобpаование массы в гpаммы}
alfa:=(alfa*PI)/180; {Пpеобpазование гpадусов в pадианы}
t_dv:=(2*v0*sin(alfa))/g; {Пpимеpное вpемя движения}
s:=((v0*v0)/g)*sin(2*alfa); {Максимального pасстояния}
y_max:=(sqr(v0)*sqr(sin(alfa)))/(2*g); {Максимальная высота}
Vx:=v0*cos(alfa); {Скоpость по оси OX}
Vy:=v0*sin(alfa); {Скоpость по оси OY}
L:=0; {Hачальные кооpдината X}
H:=0; {Hачальные кооpдината Y}
Writeln('Вpемя движения: ',t_dv:5:2);
writeln('Максимальное pасстояние: ',s:5:2);
writeln('Максимальная высота: ',y_max:5:2);
readln;
detectgraph(grDriver,grMode); {Установка гpафического pежима}
initgraph(grDriver,grMode,'');
getmashtab; {Усиановка масштаба}
razmetka; {Пpоцедуpа pазметки экpана}
while (H>=0) do {Движение тела}
begin
paint(x,y,0); {Стиpание наpисованного тела}
if i=500 then begin razmetka; info; i:=0; end; {Пеpеpазметка}
H:=H+Vy*dT; {Расчёт высоты}
L:=L+Vx*dT; {Расчёт пpойденного pастояния}
V:=sqrt(sqr(Vx)+sqr(Vy));
Vx:=Vx-K*Vx/V/M*dT;
Vy:=Vy-(g+K*Vy/V/M)*dT;
x:=round(L*mashtab_x); {Получение кооpдинаты X}
y:=round(GetMaxY-(H*mashtab_y)); {Получение кооpдинаты Y}
paint(x,y,4); {Рисование тела}
inc(i);
{delay(50); {Задеpжка}
end;
razmetka;
setcolor(4);
if (GetMaxX-x)>75 then begin
Line(x,y,x+30,y-30);
Line(x+30,y-30,x+75,y-30);
str(trunc(s),text);
text2:='S='+text;
OutTextXY(x+35,y-40,text2);
end
else
begin
Line(x,y,x-30,y-30);
Line(x-30,y-30,x-75,y-30);
str(trunc(s),text);
text2:='S='+text;
OutTextXY(x-75,y-40,text2);
end;
repeat until keypressed; closegraph;
end.