Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2007, 15:46   #1
Lili
 
Регистрация: 11.04.2007
Сообщений: 3
Вопрос Имитация кипящего чайника. паскаль.

интересная задачка))
Экран - сосуд с кипящей жидкостью.На дне в случайной точке образуется пузырек; при движении вверх он растет, а дойдя до поверхности лопается. Если два пузырька соприкасаются , они сливаются в один.Реализовать этот процесс.

как сиё сотворить?
я не догоняю...
Lili вне форума Ответить с цитированием
Старый 12.04.2007, 18:19   #2
Сильванович Михаил
Студент
Форумчанин
 
Регистрация: 10.11.2006
Сообщений: 196
По умолчанию

Че сложного? Нарисовал сосуд.
Сделал массив пузырьков (штуки 3 хватит).
С помощью Random определяешь их стартовое положение,
сколько пузырьков образуется, если их сейчас <3; коснутся они или нет.
Определив объем пузырька можно судить о его ускорении(плотность от температуры - молекулярная физика, МКТ; механика - закон Архимеда). Далее:
Перемещаешь каждый пузырек, постепенно увеличивая радиус.
(Точку касания можно рассчитать). Если происходит в какой-то точке касание, то заменяешь 2 пузырька на 1 с радиусом Sqrt(r2*r2+r1*r1)
(центр шара - центр второго шара y=y-r1, x=x-R/2, если
радиус выражать более точно то (r1^3+r2^3)^0.(3)), как только центр
пузырька достигает поверхности - пузырек лопается.

З.Ы. Задача форума - помочь, а не сделать за тебя работу.
Visita Interiorem Terrae Rectificando Operae Lapidem...
Сильванович Михаил вне форума Ответить с цитированием
Старый 12.04.2007, 19:13   #3
Lili
 
Регистрация: 11.04.2007
Сообщений: 3
По умолчанию

Вот НАБРОСКИ..

Код:
uses crt,graph;

Const NMax:integer = 100;
     Velocity:real = 0.5;

type Bubble := Record
     x,y,Radius:real;
     end;

var EndOfArray:integer;
    Volume:array[1..NMax] of Bubble;
    gd,gm,x,y,d,r,e:integer;
  

Procedure SetElement(index:integer,x,y,radius:real);
begin
   Volume[index].x := x;
   Volume[index].y := y;
   Volume[index].Radius := Radius;
end;

Procedure AddBubbleToArray(x,y,Raduis:real);
begin

   EndOfArray := EndOfArray + 1;
   SetElement(EndOfArray,x,y,Radius);

end;

Procedure DestroyBubble(Index:integer);
var curIndex:integer;
begin
  while (curIndex < EndOfArray) do
   begin
     SetElement(curIndex,Volume[curIndex+1].x,Volume[curIndex+1].y,Volume[curIndex+1].Radius);
     curIndex:= curIndex + 1;
   end;
   EndOfArray := EndOfArray - 1;
end;


procedure RiseBubbles(MaxBubbleCount:byte);

var count :byte;
x,y,radius:real;

begin
   count := 0;
   while (count <  MaxBubbleCount) do
   begin
     x:=random(getmaxX*10);
     y:=round(random(getmaxy*10)/400+440);
     Radius:= random(getmaxY div 20);
     AddBubbleToArray(x,y,Raduis);
        Inc(count);
   end;
end;

Procedure MoveBubleUp();
var index:integer;
begin
   index := 0;
   while(Index<EndOfArray) do begin
      Inc(Index);
      SetElement(Index,Volume[Index].x,Volume[Index].y + Volume[Index].Radius * Velocity,Volume[Index].Radius); 
   end;
end;

Procedure JoinNeightbourBubble(x,y,radius,count);
var index:integer;
begin 
  index:= count;
  while(index < EndOfArray) do
  begin
    Inc(index);
    If Distance(x,y,Volume[index].x,volume[index].y) < (Volume[index].raduis + Radius) then
     begin
        Vloume[count].radius := Power(Power(Radius,3) + Power(Volume[index].raduis,3),1/3);
        Destroy(index); 
     end;
  end;
end;

Procedure JoinBubble()
var count:integer;
begin
   count:=0;
   while(count < EndOfArray) do
   begin
     Inc(count);
     JoinNeightbourBubble(voulume[count].x,voulume[count].y,voulume[count].radius,count);
   end;
end;

Procedure Ticked();
begin
  MoveBubbleUp();
  JoinBubble();
end;

Procedure Show()
var index:ineger;

begin 
 index:=0;
 while (index < EndOfArray) do
  begin

     Inc(index); 
     DrawBubble(Volume[index].x,Volume[index].y,Volume[index].radius);

  end;

end;

begin
gd:=detect;
initgraph(gd, gm, 'd:\BP\bgi');
   repeat
   RiseBubbles(5);
   delay(1000);
   Ticked();
   delay(1000);
   Show();
   delay(1000);
   until keypressed;
readkey;
end.

Последний раз редактировалось Lili; 12.04.2007 в 20:01.
Lili вне форума Ответить с цитированием
Старый 12.04.2007, 19:50   #4
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

Вы сами то пытались этот код откомпиллить? Куча ошибок. Исправляйте сами, там по русски... эхм.. По английски написано что и где!
1) куча опечаток
2) несоответствие типов
3) после названия процедуры скобки не надо указывать Show();
4) некоторых процедур просто нет DrawBubble, Distance.
...
zetrix вне форума Ответить с цитированием
Старый 12.04.2007, 20:08   #5
Lili
 
Регистрация: 11.04.2007
Сообщений: 3
По умолчанию

zetrix..извините..
эти наброски я делала в блокноте за неимением на тот момент паскаля..
Времени катострофически не хватает..
это последнее задание в моём РГЗ
которое я не успеваю сделать!!!
Lili вне форума Ответить с цитированием
Старый 13.04.2007, 12:26   #6
Malice
Пользователь
 
Регистрация: 28.01.2007
Сообщений: 27
По умолчанию

Вон что вышло:
Код:
uses crt,graph;
const mx=100;
type ball=record
x,y:real;
s,r:real;
act:boolean;
end;
var x:array [1..mx] of ball;
count:integer;
tm,i,j,k:integer;
begin
i:=0; initgraph (i,i,''); tm:=0; count:=0;
repeat
cleardevice;
inc (tm);
if tm=4 then begin
j:=count+1; tm:=0;
for i:=1 to count do if x[i].act=false then j:=i;
if j>count then count:=j;
x[j].x:=random (400)+100; x[j].y:=480; x[j].r:=1;
x[j].act:=true;
x[j].s:=random (10)/10+1;
end;
for i:=1 to count do
 if x[i].act then begin
 x[i].y:=x[i].y-x[i].s;
 x[i].r:=x[i].r+x[i].s/10;
if x[i].y<20 then x[i].act:=false;

circle (round(x[i].x),round(x[i].y),round(x[i].r));
end;
for i:=1 to count-1 do
for j:=i+1 to count do
if x[i].act and x[j].act then
if sqrt(sqr(x[i].x-x[j].x)+sqr(x[i].y-x[j].y))<(x[i].r+x[j].r) then begin
x[i].x:=(x[i].x+x[j].x)/2;
x[i].y:=(x[i].y+x[j].y)/2;
x[j].act:=false;
end;
delay (10);
until keypressed;
closegraph;
writeln (count);
end.
Malice вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Имитация нажатия клавиш Air Свободное общение 28 04.02.2010 12:38
Вопрос чайника по фромам rh- Microsoft Office Access 1 10.11.2008 04:43
имитация клавиатуры Var17 Win Api 3 17.06.2008 14:28
Научи чайника писать программы!!!!!! Konohov Паскаль, Turbo Pascal, PascalABC.NET 11 12.05.2008 16:33