Новичок
Профиль
Группа: Участник
Сообщений: 1
Регистрация: 14.5.2007
Репутация: нет Всего: нет
|
Помогите пожалуйста написать комменарии к программе, которая моделирует движение математического маятника | Код | {$N+}
Uses Graph,Crt;
Type type_mayat=record
DlinaNiti:real;
MassaNiti:real;
MassaSharika:real;
RadiusSharika:real;
a_begin,a_new,a_old:real;
J,w0:real;
end;
Var
p_menu:pointer;
Var T, curr_t: Integer;
main_mayat:type_mayat;
dT,fT,g,b:real;
tmp_1:integer;
tmp_2,tmp_3,tmp_4,tmp_5:real;
Key:char;
graphtmp2,graphtmp3:integer;
Procedure GraphOn;
Var
Gd,Gm,ErrorCode:integer;
Begin
Gd:=detect;
initgraph(Gd,Gm,'d:\pascal\bgi');
ErrorCode:=GraphResult;
if ErrorCode <> grOk then
begin
WriteLn('oshibka:');
WriteLn(GraphErrorMsg(ErrorCode));
Halt(1);
end;
End;
Procedure GraphOff;
Begin
CloseGraph;
End;
Procedure mayatnik(DlinaNiti_:integer;
MassaNiti_,MassaSharika_,RadiusSharika_,a_begin_:real);
Begin
with main_mayat do
begin
DlinaNiti:=DlinaNiti_;
MassaNiti:=MassaNiti_;
MassaSharika:=MassaSharika_;
RadiusSharika:=RadiusSharika_;
a_begin:=a_begin_;
a_new:=a_begin_;
J:=(1/3)*MassaNiti*sqr(DlinaNiti)+MassaSharika*(2/5*sqr(RadiusSharika)+
sqr(DlinaNiti));
w0:=sqrt(g*(MassaSharika*DlinaNiti+MassaNiti*DlinaNiti/2)/J);
end;
End;
Procedure dvizh_mayat;
Var
costmp:double;
Begin
with main_mayat do
begin
a_old:=a_new;
a_new:=a_begin*cos(w0*fT);
if a_begin>0 then
begin
costmp:=cos(a_begin)+(b*DlinaNiti*sqr(a_new-a_old))/(dT*MassaSharika*g);
if (costmp<>0) then
a_begin:=arctan(sqrt(1-sqr(costmp))/costmp);
end
else a_begin:=0;
fT:=fT+dT;
end;
End;
Procedure ris_mayat;
Var
xNow,yNow:real;
Begin
with main_mayat do
begin
xNow:=graphtmp2+DlinaNiti*cos(a_new-pi/2);
yNow:=21-DlinaNiti*sin(a_new-pi/2);
setfillstyle(0,0);
bar(graphtmp2-round(DlinaNiti+RadiusSharika),21,
graphtmp2+round(DlinaNiti+RadiusSharika),21+round(DlinaNiti+RadiusSharika));
setcolor(7);
setlinestyle(0,0,3);
line(graphtmp2,21,round(xNow),round(yNow));
setlinestyle(0,0,1);
setcolor(1);
setfillstyle(1,1);
fillellipse(round(xNow),round(yNow),
round(RadiusSharika),round(RadiusSharika));
end;
End;
var i: integer; s: string; Begin
GraphOFF;
writeln('vvedite dlinu niti (recom. 250)');
readln(tmp_1);
writeln('vvedite massu niti (recom. 20)');
readln(tmp_2);
writeln('vvedite massu sharika (recom. 30)');
readln(tmp_3);
writeln('vvedite radis sharika (recom. 15)');
readln(tmp_4);
writeln('vvedite ugol otklonenia (recom. 0.5)');
readln(tmp_5);
writeln('vvedite shag po vremeni (recom. 0.1)');
readln(dT); (* tmp_1 := 250; tmp_2 := 20; tmp_3 := 30; tmp_4 := 15; tmp_5 := 0.5; dT := 0.1; *)
GraphOn;
b:=0.1;
fT:=0;
Key:=#0;
g:=9.8;
GraphOn;
graphtmp2:=round(getmaxx/2);
graphtmp3:=round(getmaxx/3);
cleardevice;
mayatnik(tmp_1,tmp_2,tmp_3,tmp_4,tmp_5);
setcolor(15);
setfillstyle(3,15);
bar(graphtmp3,0,2*graphtmp3,20);
line(graphtmp3,20,2*graphtmp3,20);
settextstyle(smallfont, horizdir, 1); settextjustify(centertext, centertext); for i := 5 to 10 do begin setcolor(red); line(0, getmaxy - i*12, getmaxx - textwidth('000000'), getmaxy - i*12); str(((i - 5)*45):3, s); setcolor(white); outtextxy(getmaxx - textwidth(s) div 2, getmaxy - i*12, s); end;
for i := 1 to 19 do begin setcolor(red); line(i*(getmaxx div 21), getmaxy - 48, i*(getmaxx div 21), getmaxy - 120); str(i*(getmaxx div 21), s); setcolor(white); outtextxy(i*(getmaxx div 21), getmaxy - 36, s); end;
repeat
if(main_mayat.a_begin<>0)then
begin
dvizh_mayat;
ris_mayat;
delay(500); { delay(25); }
inc(T); if T = 5 then begin
T := 0; inc(curr_t);
putpixel(curr_t,
(getmaxy - 240) + trunc(180 * cos(main_mayat.a_new)),
white );
end;
end;
if keypressed then key:=readkey;
until (key=#27);
GraphOff;
End.
|
|