{
A
Darázs-modell szimulációja.
Programspecifikáció:
Input:
paraméterek - N
darázs-szám
K az 1.
dobozban levő darazsak száma (a többi a 2.-ban)
tájékoztató file sorokra
tördelve
beavatkozás -
billentyžkkel (nagy és kisbetžk nem különböznek)
'c' =
csendes üzemmód; 'n' = normál üzemmód;
'l' =
lépésenkénti üzemmód; 'v' = vége
Output:
karakteres képernyőn =
tájékoztató lapozott szövege
grafikus képernyőn = eseménytér (a két doboz a bennük levő
darazsakkal)
grafikonablakok:
1.
Eloszlás (az 1. dobozban relatíve
hányszor volt 0, 1, ... db
darázs)
2.
Idődiagram (az 1. dobozban levő darazsak
száma a 0., az 1., ... időegységben; ill.
az utolsó valahány időegységben)
}
Program Szimulacio;
{
-------------------------------------------------------------------------
Szimulációs program. (A
fizikai... szimulációhoz.)
Keretprogram.
-------------------------------------------------------------------------
}
Uses
Newdelay,Crt,Graph;
Const
MaxDB = 140;
MaxDb2 = 12;
{~sqrt(MaxDb)}
Type
TKepModok =(Grafikus,Szoveges);
TUzemModok
=(Normal,Lepesenkenti,Csendes,Vege);
THisztAblak= Record
bfx,
bfy, jax, jay : Word;
cim : String[32];
adatok : Array [0..MaxDB] of Word;
adatdb : Word;
leptek : Real;
End;
Const
Fejlec = ' Szimuláció
'; FejHossz = Length(Fejlec);
HelpSor= ' V/v: vége
, L/l: lépésenként , N/n: normál , C/c: csendes ';
Path = 'c:\langs\tp7\bgi\';
Var
KepMod : TKepModok;
UzemMod : TUzemModok;
Graf1,
Graf2 : THisztAblak;
{Szimulációs adatok: paraméterek,
reprezentáció...}
T : Integer;
N, K : Integer;
Darazs : Array [1..MaxDB] of Record
doboz :1..2;
holX,holY: Word
End;
darazsMaxX,
darazsMaxY,
darazsMeret: Word;
dobozTerkep: Array [1..2,1..MaxDb2,1..MaxDb2] of (Szabad,Foglalt);
darazsKep : Array [1..4000] of Byte;
buf : Array [1..30000] of byte; {Képernyőmentéshez.
Csak globálisan lehet ekkora adatot
tárolni a STACK OVERFLOW hiba nélkül}
{Ablakok, grafikonok kezelése:
-----------------------------------------}
Procedure ABlakLetrehozas(Var Graf : THisztAblak;
Const bx,by,jx,jy : Word; c : String;
aDb:Word; l : Real);
Var
i :
Integer;
Begin
With Graf
do {VGA-kártyát
feltételezve!}
Begin
cim:=c;
bfx:=bx; bfy:=by;
jax:=jx; jay:=jy;
adatdb:=aDb;
leptek:=l;
For i:=0
to Maxdb do adatok[i]:=0;
End;
End; {ABlakLetrehozas}
Procedure AblakRajzolas(Const Graf : THisztAblak);
Var
cx,cy
: Integer;
Begin
SetViewPort(0,0,GetMaxX,GetMaxY,ClipOn);
With Graf
do
Begin
Rectangle(bfx,bfy,jax,jay);
cx:=(jax-bfx) div 2+bfx; cy:=TextHeight(' ')+bfy;
OutTextXY(cx,cy,cim);{feltéve:
SetTextJustify(CenterText,TopText)}
End;
End; {AblakRajzolas}
Procedure TeljesGrafikon(Const Graf : THisztAblak);
{A Graf ablakba a hisztogram
újrarajzolása}
Var i : Integer;
osz: Word;
Begin
With Graf
do
Begin
osz:=((jax-bfx) div adatdb);
SetFillStyle(EmptyFill,Black{bármi});
Bar(bfx+2,bfy+TextHeight('
')+10,jax-2,jay-2);
SetFillStyle(SolidFill,GetMaxColor);
For i:=0
to adatdb-1 do
bar(bfx+osz*(i)+2,trunc(jay-adatok[i]*leptek),
bfx+osz*(i+1)+1,jay);
End;
End; {TeljesGrafikon}
Procedure EloszlasFv(Szam:
Word; Var Graf:THisztAblak);
{A Szam-adik hisztogram-oszlop eggyel
növekszik}
Var
osz
: Word;
Begin
With Graf
do
Begin
Inc(Adatok[Szam]);
If Adatok[Szam]*leptek<(jay-bfy-TextHeight('
')-10) then
Begin
If UzemMod<>Csendes
then
{nem csendes üzemmódban:}
Begin
osz:=((jax-bfx)
div (N+1));
bar(bfx+osz*(Szam)+2,Trunc(jay-adatok[Szam]*leptek),
bfx+osz*(Szam+1)+1,jay);
End
End
Else
Begin
leptek:=leptek/2; TeljesGrafikon(Graf);
End;
End;
End; {EloszlasFv}
Procedure IdoDiagram(Szam:
Word; Var Graf:THisztAblak);
{Az IdoDiagram jobbra egy Szam magasságú
oszloppal bővül,
vagy shift-elődnek oszlopai
eggyel balra, majd bővül}
Var osz : Word;
i : Integer;
Begin
With Graf
do
Begin
(*ide kell a kód*)
End;
End; {IdoDiagram}
Procedure DarazsTorles(Const doboz,holX,holY: Word);
Var
kX:
Word;
Begin
If UzemMod<>Csendes
then
Begin {nem csendes üzemmódban:}
If doboz=1
then kX:=20
Else kX:=(GetMaxX div 2)+20;
Bar(kX+darazsMeret*(holX-1),20+darazsMeret*(holY-1),
kX+darazsMeret*holX-1,20+darazsMeret*holY-1);
End;
End; {DarazsTorles}
Procedure DarazsRajzolas(Const doboz,holX,holY: Word);
Var
kX:
Word;
Begin
If UzemMod<>Csendes
then
Begin {nem csendes üzemmódban:}
If doboz=1
then kX:=20
Else kX:=(GetMaxX div 2)+20;
PutImage(kX+darazsMeret*(holX-1),20+darazsMeret*(holY-1),
darazsKep,NormalPut);
End;
End; {DarazsRajzolas}
Procedure OsszesDarazs;
Var
i,j:
Word; RegiUzemMod: TUzemModok;
Begin
RegiUzemMod:=UzemMod;
UzemMod:=Normal; {ideiglenes beállítva,
a rajzolás érdekében}
{a darazsak újrarajzolása:}
(*ide kell a kód*)
UzemMod:=RegiUzemMod;
{visszaállítva}
End; {OsszesDarazs}
{-----------------------------------------
Ablakok, grafikonok kezelése}
{Karakteres képernyö- és
billentyü-kezelés: ----------------------------}
Procedure BillentyureVar(Var c:
Char);
{* Billentyüfigyelés
* Várakozáskijelzés
* Üzemmódbeállítás}
Begin
If KepMod=Szoveges
then
Begin
c:='-';
Repeat
Case c of
'|':
c:='/';
'/':
c:='-';
'-':
c:='\';
'\':
c:='|';
End;
Window(1,1,80,25);
GotoXY(35,25); Write('Lapozhatunk?',c);
Delay(100);
Until KeyPressed;
c:=ReadKey;
End
Else
Begin
If UzemMod=Lepesenkenti
Then
Begin
c:=ReadKey;
Case c of
'n','N':
UzemMod:=Normal;
'l','L':
UzemMod:=Lepesenkenti;
'c','C':
UzemMod:=Csendes;
'v','V':
UzemMod:=Vege;
End
End
Else
If KeyPressed
then
Begin
c:=ReadKey;
Case c of
'n','N':
UzemMod:=Normal;
'l','L':
UzemMod:=Lepesenkenti;
'c','C':
UzemMod:=Csendes;
'v','V':
UzemMod:=Vege;
End
End
End
End; {BillentyureVar}
Procedure SzovegesLap;
{Standard méretü, keretes, címes,
karakteres-képernyö}
Var
i :
Integer;
Begin
If KepMod=Grafikus
then RestoreCrtMode;
KepMod:=Szoveges;
Window(1,1,80,25);
ClrScr;
For i:=2
to 79 do
Begin
GotoXY(i,1);
Write('-'); GotoXY(i,24); Write('-');
End;
For i:=1
to 24 do
Begin
GotoXY(1,i);
Write('-'); GotoXY(80,i); Write('-');
End;
HighVideo;
GotoXY(40-(FejHossz div 2),1); Write(Fejlec);
NormVideo;
Window(3,3,78,23);
End; {SzovegesLap}
{---------------------------- Karakteres képernyö- és billentyü-kezelés}
{A lényeghez tartozó eljárások és
függvények: --------------------------}
Procedure Tajekoztato;
{Tájékoztató lapozott kiírása a
képernyöre file-ból}
Const
TajekoztatoFile
= 'darazs.hlp';
Var
c : Char;
s : Byte;
sor:
String[80];
tf :
Text;
Begin
{A tájékoztató szövege:}
(*ide kell a kód*)
End; {Tajekoztato}
Procedure Inicializalas;
{Paraméterbeolvasás
Grafikon-parametrizálás
Eseménytér inicializálása}
Var
i,j,
holX,
holY,
n2 : Integer;
gd,gm: Integer;
dDb : Byte;
d : Array [1..8] of Record x,y:Byte End;
Begin
{Paraméterbeolvasás innen hiányzik: N, K
értéke}
SzovegesLap;
(*ide kell a kód*)
{Grafikon-parametrizálás:}
gd:=Detect; InitGraph(gd,gm,Path); ClearViewPort;
AblakLetrehozas(Graf1,10,250,310,460,'Eloszlás',N+1,5);
AblakLetrehozas(Graf2,330,250,630,460,'Változás',0,(460-250-20)/N);
{Eseménytér inicializálása:}
{darázskép-generálás:}
{N-hez közeli, annál nem kisebb
négyzetszám keresése:}
n2:=Trunc(Sqrt(N));
While n2*n2<N
do Inc(n2);
darazsMaxX:=n2;
darazsMaxY:=n2; darazsMeret:=(GetMaxY-30) div (2*n2);
i:=ImageSize(0,0,darazsMeret-1,darazsMeret-1);
If
i>4000 then Halt(1); {Túl nagy méretü
darázskép kellene!!!!}
{Darázskép-generálás:}
(*
egy egyszerü:
*)
For i:=3
to darazsMeret-3 do
For j:=3
to darazsMeret-3 do
Begin
PutPixel(i,j,Random(16));
End;
(*
a fenti lehet egy fokkal szebb
is...
*)
{Darázskép mentése:}
GetImage(0,0,darazsMeret-1,darazsMeret-1,darazsKep);
ClearViewPort;
{Darazsak elhelyezése a
Darazs[1..N]-ban, DobozTerkep[,,]-ben:}
(*ide kell a kód*)
End; {Inicializalas}
Procedure KezdoKepernyo;
{Grafikus kép inicializálása:
* CimAblak: cim kiírása
* IdöAblak: T kiírása
* HalpAblak: Help-sor
kiírása
* GrafikonAblakok: üresen
* EseményTérAblak: kezdő
állapotban}
Var
ct : String;
lct,
cx,cy:
Integer;
gd,gm,
gFejHossz:
Integer;
Begin
{A grafikus kép inicializálása:}
KepMod:=Grafikus;
gd:=Detect; InitGraph(gd,gm,Path); ClearViewPort;
gFejHossz:=FejHossz*TextWidth('
');
SetTextJustify(CenterText,TopText);
SetLineStyle(SolidLn,0,{NormWidth}ThickWidth);
SetViewPort(0,0,
GetMaxX,GetMaxY, ClipOn);
Rectangle(6,6,
GetMaxX-5,GetMaxY-5);
{CimAblak: cím kiírása:}
cx:=GetMaxX div 2; cy:=TextHeight(' ') div 2;
SetViewPort(cx-(gFejHossz div 2)-8,0,
cx+(gFejHossz
div 2)+7,2*cy+7, ClipOn);
ClearViewPort;
Rectangle(4,2,
gFejHossz+9,2*cy+5);
OutTextXY((gFejHossz+15){6} div 2,4,Fejlec);
{IdőAblak: T kiírása:}
(*ide kell a kód*)
{HelpAblak: Help-sor:}
ct:=HelpSor;
lct:=Length(ct)*TextWidth(' ');
SetViewPort(cx-(lct div 2)-8,GetMaxY-TextHeight(' ')-6,
cx+(lct
div 2)+7,GetMaxY, ClipOn);
ClearViewPort;
Rectangle(2,2,
lct+9,2*cy+5);
OutTextXY((lct+15) div 2,4,ct);
{GrafikonAblakok:}
AblakRajzolas(Graf1);
AblakRajzolas(Graf2);
SetViewPort(0,0,GetMaxX,GetMaxY,ClipOn);
{EseményTérAblak:}
OsszesDarazs;
{további ablakok:}
End; {KezdoKepernyo}
Procedure SzimulaciosLepes;
{A lényeg}
Var i,
honnan,hova,
holX,holY : Integer;
Begin
{A lényeg innen hiányzik:}
(*ide kell a kód*)
End; {SzimulaciosLepes}
Procedure EredmenyMegjelenites;
Var
ct : String;
lct
: Integer;
Begin
{Idokiiras:}
(*ide kell a kód*)
{Grafikonok:}
EloszlasFv(K,Graf1);
IdoDiagram(K,Graf2);
End; {EredmenyMegjelenites}
Function VegeE:
Boolean;
Var
c :
Char; RegiUzemMod: TUzemModok;
Begin
RegiUzemMod:=UzemMod;
BillentyureVar(c); {esetleges üzemmódváltás}
If (RegiUzemMod=Csendes)
And (c in ['n', 'N', 'l', 'L']) then
Begin {Grafikonfrissítés:}
TeljesGrafikon(Graf1);
TeljesGrafikon(Graf2);
OsszesDarazs;
End;
VegeE:=(UzemMod=Vege)
{And
(automatikus végállapot érzékelés)}
End; {VegeE}
Procedure OsszefoglaloMegjelenites;
Var
c :
Char;
Begin
{valami konklúzió innen hiányzik:}
KepMod:=Szoveges;
BillentyureVar(c); CloseGraph;
SzovegesLap;
GotoXY(25,10);
Writeln('Itt a vége fuss el véle!!!!');
End; {OsszefoglaloMegjelenites}
{-------------------------- A lényeghez
tartozó eljárások és függvények}
Begin
UzemMod:=Lepesenkenti;
Tajekoztato;
Inicializalas; T:=0;
KezdoKepernyo;
EredmenyMegjelenites;
While not VegeE do
Begin
SzimulaciosLepes;
Inc(T);
EredmenyMegjelenites;
End;
OsszefoglaloMegjelenites;
End.