Помощь - Поиск - Пользователи - Календарь
Полная версия: Равномерное движение шарика по поверхности стола
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Milla
Здравствуйте люди добрые, не могли бы помочь переделать немного код программы.

Uses
Crt,Graph; {Stroka, soobschayuschaya, chto nuzhno vklyuchit' moduli Crt i Graph v programmu}
Const
a1:string='L A B O R A T O R N A Y A R A B O T A';
a2:string='O P R E D E L E N I E S K O R O S T I T E L A';
a3:string='Dlya prodolzheniya nazhmite lyubuyu klavishu';
a4:string='Vvedite vremya (.1<DT<.5 s) mezhdu vspyshkami.';
a5:string='Dlya otvoda otvedeno ne bolee 4 znakomest, DT= ';

Var {Opisanie peremennyh}
fg:string[3];
af,bf:integer;
i,gd,gm:integer;
dt:real;
x,y:integer;
cx,cy:integer;
cxx,cyy:integer;
ch:char;
hs,h,g,m:integer;


Procedure start;
begin
OutTextXY(200,200,a1);
OuttextXY(150,250,a2);
OutTextXY(200,400,a3);
repeat until keypressed; {Ozhidanie nazhatiya klavishi}
SetFillStyle(1,0); {Stil' i tsvet fona}
Bar(0,0,640,480); {Razmer fona}
end;


Function table:real;
Var
oo:string[4];
vu,vx,v:integer;
vy:real;
begin
randomize; {Vysota stola zadaetsya sluchainym obrazom}
hs:=random(200)+150;
h:=470-hs;
m:=1;
g:=random(5)+982;
g:=g div 2;
SetFillStyle(1,6); {Stil' i tsvet stola}
Bar(10,h+7,206,479);
Line(0,479,640,479);
SetFillStyle(1,0);
Bar(30,h+40,186,479);
end;


Function move:real;
Var
oo:string[4];
vu,vx,v:integer;
vy:real;
begin
SetColor(15); {Tsvet kruzhkov}
v:=random(300)+200;
for i:=1 to 340 do {Operator tsikla s parametrom}
begin
vx:=i;
if (vx <= 206) then
vy:=h
else
vy:=h+982/2*(vx-206)*(vx-206)/(v*v);
vu:=round(vy);
if (i mod 12=0)then circle(vx,vu,6);
OutTextXY(510,190,'v =');
str(v,oo);
OutTextXY(540,190,oo);
end; {end otnositsya k operatoru tsikla s parametrom}
end;


Procedure menu;
Var
st,sc:string[3];
begin
OutTextXY(af,bf,a4); {Vyvod teksta v zadannyh koordinatah}
OutTextXY(af,bf+10,a5);
OutTextXY(445,130,'probel -prodolzhenie');
OutTextXY(500,140,chr(24));
OutTextXY(510,140,'-vverx');
OutTextXY(500,150,chr(25));
OutTextXY(510,150,'-vniz');
OutTextXY(500,160,chr(26));
OutTextXY(510,160,'-vpravo');
OutTextXY(500,170,chr(27));
OutTextXY(510,170,'-vlevo');
OutTextXY(493,180,' - kursor');
OutTextXY(500,200,'VIHOD-ESC');

SetColor(15);
OutTextXY(500,30,'x=');
OutTextXY(500,40,'y=');

SetColor(15);
str(cx,st);

Rectangle(550,30,570,40);
SetFillStyle(6,0); {Protsedura ispol'zuetsya dlya togo, chtoby tsifry...}
FloodFill(550,30,0); {...pri dvizhenii kursora ne nakladyvalis' drug na druga}

OutTextXY(550,30,st);
str(cy,st);
OutTextXY(550,40,st);
SetColor(4); {Tsvet ramki, v kotoruyu zaklyucheny znacheniya x i y}
rectangle(af+450,bf-6,600,bf+70);
end;


Procedure kursor;
begin
cx:=483; {Koordinaty mestopolozheniya kursora}
cy:=183;

begin
menu {Perehod k protsedure}
end;

begin
table {Perehod k funktsii}
end;


SetColor(15); {Risovanie kursora}
Line(cx-5,cy,cx+5,cy);
Line(cx,cy-5,cx,cy+5);
Circle(cx,cy,5);

SetColor(4); {Tsvet ramki}
rectangle(af-6,bf-6,400,bf+70);
read(dt);

begin
move {Perehod k funktsii}
end;

if ((dt > 0.5) or (dt <= 0)) then
dt:=0;
end;


Procedure movekursor;
Var
st:string[3];
begin
ch:=readkey; {Schityvanie nazhatoi klavishi}

SetColor(0); {Zakrashivaem sled ot dvizheniya kursora}
Line(cx-5,cy,cx+5,cy);
Line(cx,cy-5,cx,cy+5);
Circle(cx,cy,5);

if (ord(ch)=72) then cy:=cy-1;{Schityvaem ScanCode s klaviatury i proveryaem sootvetstvuet li on nazhatiyu klavishi}
{vverh}
if (ord(ch)=80) then cy:=cy+1;{Schityvaem ScanCode s klaviatury i proveryaem sootvetstvuet li on nazhatiyu klavishi}
{vniz}
if (ord(ch)=75) then cx:=cx-1;{Schityvaem ScanCode s klaviatury i proveryaem sootvetstvuet li on nazhatiyu klavishi}
{vlevo}
if (ord(ch)=77) then cx:=cx+1;{Schityvaem ScanCode s klaviatury i proveryaem sootvetstvuet li on nazhatiyu klavishi}
{vpravo}
if (cx<6) then cx:=6; {Ogranichenie polozheniya kursora pri dvizhenii vlevo}
if (cx>622) then cx:=622; {Ogranichenie polozheniya kursora pri dvizhenii vpravo}
if (cy<6) then cy:=6; {Ogranichenie polozheniya kursora pri dvizhenii vverh}
if (cy>464) then cy:=464; {Ogranichenie polozheniya kursora pri dvizhenii vniz}

SetColor(15);
Line(cx-5,cy,cx+5,cy);
Line(cx,cy-5,cx,cy+5);
Circle(cx,cy,5);

cxx:=cx;
cyy:=cy;

begin
menu; {Perehod k protsedure}
end;

SetColor(15);
Circle(cx,cy,5);
Line(cx-5,cy,cx+5,cy);
Line(cx,cy-5,cx,cy+5);

if ord(ch)=32 then {Schityvaem ScanCode s klaviatury, esli nazhata dannaya klavisha, to...}
begin
SetFillStyle(1,0);
Bar(0,0,640,480); {Zakrashivaem ekran}
kursor; {Perehod k protsedure}
end;
end;

begin
gd:=detect; {Avtomaticheskoe raspoznavanie videoadaptera}
af:=6;
bf:=6;

InitGraph(gd,gm,'d:\tp\bgi'); {Pereklyuchenie v graficheskii rezhim}
start; {Perehod k protsedure}
kursor; {Perehod k protsedure}

repeat
movekursor; {Perehod k protsedure}
until
ord(ch)=27; {Schityvaem ScanCode s klaviatury, esli nazhata dannaya klavisha, to...}
end. {Okonchanie razdela operatorov}



Собственно вот сам код, программа почти нормально работает, только вот нужно передеалть немного формулу в процедуре move, и возможно в функции table...
Сама программа переделывалась с QBasic'a.

Задание(но с кодом для бэйсика) расположено в Image0046-48.jpg..


Если что-то не так то сильно не ругайте wacko.gif
Буду очень благодарна, заранее спасибо..


Нажмите для просмотра прикрепленного файлаНажмите для просмотра прикрепленного файлаНажмите для просмотра прикрепленного файлаНажмите для просмотра прикрепленного файла
Milla
rolleyes.gif
Lapp
Цитата(Milla @ 2.12.2007 14:43) *

вот нужно передеалть немного формулу в процедуре move, и возможно в функции table...
Что значит переделать? Как переделать? С какой целью?.. blink.gif
Я запустил прогу - действительно, работает.. И шарик летает. Что еще?
Milla
Дело в том, что он иногда летит вверх, чего быть не должно...Значит что то с формулой sad.gif
Milla
10.gif
Milla
эх =( Никто не знает?
Lapp
Цитата(Milla @ 3.12.2007 17:38) *

иногда летит вверх,

У меня он вверх никогда не летел (попробовал раз пять).
Ты можешь выражаться чуть конкретнее? В твоей программе разбираться нелегко, особенно не зная, что зачем. Зачем там курсор? Что он делает? Я могу запустить шарик, а потом двигать курсор. Вопрос: зачем?

Формула, конечно, странная. Достаточно сказать, что ты сначала делишь, а потом сразу же умножаешь на одну и ту жк скобку (это, конечно, не ошибка в алгоритме).

И последнее.. Извини, но разбиратсья в программе, переделанной с бейсика - это хуже не бывает.. Зачем нужно было вообще переделывать? Не проще ли написать новую? Мне кажется, для обучения это полезнее..
Milla
Ну если больше раз попробуешь запустить то полетит %) Задание у меня такое...сделать на паскале ...уже разобралась..там перебор просто шел, longint все это вылечил =) Спасиб, можно закрывать...
generic zithromax over the count
Propecia Generico Marca
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.