Programozás | Pascal » Forgalomirányítási feladat Turbo Pascalban

Alapadatok

Év, oldalszám:2000, 28 oldal

Nyelv:magyar

Letöltések száma:61

Feltöltve:2011. december 10.

Méret:288 KB

Intézmény:
-

Megjegyzés:
Gábor Dénes Főiskola

Csatolmány:-

Letöltés PDF-ben:Kérlek jelentkezz be!



Értékelések

Nincs még értékelés. Legyél Te az első!

Tartalmi kivonat

Forgalomirányítás Jackson Gábor Dénes Főiskola I./2 Félév Készítette: Váraljai Sándor Feladatspecifikáció 1. Feladatmegfogalmazás: A feladat egy egyenrangú útkereszteződés forgalomirányításának modellezése. A KRESZ szerint egyenrangú útkeresztezésben az áthaladási elsőbbséget a jobbkéz-szabály határozza meg. Eszerint annak a járműnek van áthaladási elsőbbsége, amelynek jobb keze felől nem várakozik áthaladásra másik jármű (egyszerűség kedvéért feltesszük, hogy a kanyarodás a keresztezésben minden irányban meg van tiltva, így a járművek csak egyenesen haladhatnak). Ha minden irányából vár jármű áthaladásra, akkor a helyzetet a közlekedésben résztvevők udvariassága alapján kell feloldani. 2. Követelmények: Az elkészítendő programnak a szöveges képernyőn kell megjelenítenie az útkeresztezés képét, és benne a várakozó járművek szimbólumait (amennyi a képernyőre fér). A forgalmi eseményeket

"mozzanatok" jelentik. Egy mozzanat egy jármű érkezése vagy távozása A programot a négy kurzormozgató billentyű, valamint az Escape segítségével vezéreljük. A kurzormozgató billentyűk egy-egy érkezési mozzanat megtörténtét jelentik, az Escape pedig kiszállást a programból. (A ← karakter megnyomása pl egy jobbról érkező és balra tartó jármű érkezését jelenti.) A távozási mozzanatok az érkezésektől függetlenül, automatikusan következnek be. Érkezés: A keresztezésben álló járműveket egy-egy várakozó sorban tároljuk, a négy forgalmi iránynak megfelelően. Az autóknak színük van, melyet a véletlenszám-generátor rendel a járműhöz. Az érkező járművet beállítjuk az útirány szerinti várakozó sor végére (az autó szimbóluma útiránytól függően a ▲, ►, ▼, ◄ karakterek valamelyike), a képernyőn pedig megjelenítjük a módosult forgalmi helyzetet. A várakozó sorok hossza nincs korlátozva

(ennek kizárólag a rendelkezésre álló heap terület szab határt), de a megjeleníthető járműveké nyilván igen, ezért a képernyőn esetleg csak egy hosszabb sor első járművei láthatók. Távozás: Ha a keresztezés nem üres, akkor meg kell keresni azt a járművet, amelyiknek a jobbkéz-szabály szerint áthaladási elsőbbsége van. Ha ilyen nincs, akkor egy véletlen szám generálásával választjuk ki a következő járművet. A távozó jármű "átkocog" a keresztezésen (elegendő, ha csak a túlsó járdaszél vonaláig látszik), majd eltűnik. Őt töröljük a várakozó sorból, majd a mögötte várakozókat felzárkóztatjuk. Ha a sor hosszabb volt, mint ahány jármű a képernyőn megjeleníthető, akkor az első olyan jármű, amely eddig nem volt látható, most előtűnik. A program megfelelő helyeire beiktatott késleltetések, figyelések tegyék lehetővé, hogy a közlekedési helyzet alakulását szemmel jól lehessen követni!

Megjelenítés: Ez nem egy külön közlekedési mozzanat, hanem vagy az érkezéssel vagy a távozással kapcsolódik össze. A megjelenítés a szöveges képernyőn történik, közvetlen képernyő-memóriába írással. A járműveket irányuknak és színüknek megfelelően kell megjeleníteni. A kurzor a szimuláció közben nem látszik. : ▼ ► ► ► ▲ A program indítása és leállítása: A programot vagy alaphelyzetből (üres kereszteződés), vagy egy korábban elmentett állapotból lehessen indítani. Ebből a célból minden leállításkor a program az aktuális könyvtár XRoad.Dat állományában készítsen egy mentést a várakozó sorok állapotáról. Indításkor vizsgálja meg, hogy létezik-e ilyen nevű állomány az aktuális könyvtárban, és ha van, akkor ezt az állapotot töltse vissza, egyébként induljon alaphelyzetből. 3. Fejlesztői környezet: Az alkalmazást Turbo Pascal –ban kel megvalósítani. Megjegyzés: Általam

készített programba bennhagytam, a tesztelés során beépített segéd funkciókat. Ezek a következők: 1. Animáció sebességét változtató billentyűk: - Page Up gyorsítás (Ha a program alap állapotból indul, maximumon van). - Pabe Down lassítás 2. Pillanat megállító billentyű: ALT+P feloldása bármely billentyűvel Kilépés során, e funkciók is mentésre kerülnek. : Forgalomirányítás Forráskód Gábor Dénes Főiskola I./2 Félév Készítette: Váraljai Sándor Készítette: Váraljai Sándor Forráskód program GDF II; uses Crt, Dos; const Esc=#27; Job=#75; Bal=#77; Nul=#0; Fel=#72; Le =#80; Pau=#25; PUp=#81; PDo=#73; Utak: array[0.3,16] of byte ={ A - Út vége koordinata { A, B, C, D, E, F } { B - Kereszteződés vége koordinata { 0 }(( 5,37,45,77,12,17), { C - Kereszteződés kezdete koordinata { 1 } (24,15,11, 2,39,31), { D - Út kezdete koordinata { 2 } (77,45,37, 5,14,16), { E - Horizont-Y, Vertikal-X koordnata { 3 } (

2,11,15,24,43,30)); { F - A meg jelenítendő karakter Felir: string[25]=ESC ł EXIT type KarHely = record Kar : char; Attr : byte; end; PAuto=^TAuto; TAuto=record Koor, Poz, Szin:byte; Kov: PAuto; end; ALT+P ł PAUSE; { Karakter } { H/E Szín } { Auto: { Horizont-X, Vertikal-Y koordinata { Az aktuális szakasznak kódja { Színe { kővetkező kocsi memória címe TAutoL=record Elso, Tmp, Akt:PAuto; Keresz:boolean; end; } } } } } } } } } } } { Forgalmi irány: { Első kocsi memória címe { Feldolgozás alatt lévő kocsi memória címe { Utolsó kocsi memória címe { Igaz - ha kocsi a kereszteződés előtt áll } } } } } var Scr : array[1.25,180] of KarHely absolute $B800:0; { A képernyő memória területe } AutoL: array[0.3] of TAutoL; { A négy forgalmi irány listája } Status, { 0-3 ig a szabad irány; 4 és minden irány szabad} Wait :byte; { Várakozási idő századmásodpercben } Pause: boolean; { Igaz - pillanat megállítás } Autok: file of TAuto; { A adat

fájl típusa } 2 Készítette: Váraljai Sándor { $M 1024,512,512 } procedure Hang; { Figyelmeztető hangjelzés } begin sound(1000); delay(10); nosound; end; procedure Kurzor(KiBe:boolean); const Cur: word = $0607; var R : registers; begin case KiBe of false : {kikapcsolás} begin R.AH:=3; R.BH:=0; intr($10,r); Cur:=R.CX; R.AH:=1; R.CX:=$2000; intr($10,R); clrscr; end; true : { bekapcsolás } begin R.AH:=1; R.CX:=Cur; intr($10,R); clrscr; end; end; end; 3 Készítette: Váraljai Sándor procedure Rajz; { Képernyő hátér kirajzolása } var Sor, Oszlop : byte; { Sor-Y, Oszlop-X koordinata } begin for Sor := 1 to 25 do for Oszlop := 2 to 80 do begin case Sor of 1 : case Oszlop of 2 : Scr[Sor,Oszlop].Kar := Ú; 80: Scr[Sor,Oszlop].Kar := ż; else Scr[Sor,Oszlop].Kar := Ä; end; 13: case Oszlop of 3.39,4379: if (Oszlop mod 5) = 0 then begin Scr[Sor,Oszlop].Kar := Ä; Scr[Sor,Oszlop+1].Kar := Ä; Scr[Sor,Oszlop+2].Kar := Ä; end; 40.42: Scr[Sor,Oszlop]Kar := {Ĺ}; else

Scr[Sor,Oszlop].Kar := ł; end; 25: case Oszlop of 2 : Scr[Sor,Oszlop].Kar := Ŕ; 80: Scr[Sor,Oszlop].Kar := Ů; else Scr[Sor,Oszlop].Kar := Ä; end; 2.11,1525: case Oszlop of 4.37,4578: Scr[Sor,Oszlop]Kar := Ű; 2,80: Scr[Sor,Oszlop].Kar := ł; 41 : if (Sor mod 2) = 1 then Scr[Sor,Oszlop].Kar := ł; end; 12.14: case Oszlop of 2,80: Scr[Sor,Oszlop].Kar := ł; end; end; Scr[Sor,Oszlop].Attr := DarkGray; end; Oszlop:=1; for Sor := 1 to 25 do begin Scr[Sor,Oszlop].Kar := Felir[Sor]; Scr[Sor,Oszlop].Attr := LightGray; end; end; 4 Készítette: Váraljai Sándor procedure Felirat(Mit: boolean); var Sor, Oszlop: byte; begin Oszlop:=1; for Sor:=21 to 25 do begin Scr[Sor,Oszlop].Kar := Felir[Sor]; case Mit of true : Scr[Sor,Oszlop].Attr := 143; false: Scr[Sor,Oszlop].Attr := LightGray; end; end; end; procedure KepR(Ir: byte); { Feldolgozás alatt lévő kocsik kirajzolása } begin case Ir of 0,2 : { Horizont lis ˇr ny } begin Scr[Utak[Ir,5],AutoL[Ir].Tmp^Koor]Kar := chr(Utak[Ir,6]);

Scr[Utak[Ir,5],AutoL[Ir].Tmp^Koor]Attr := AutoL[Ir]Tmp^Szin; end; 1,3 : { Vertikalis ˇr ny } begin Scr[AutoL[Ir].Tmp^Koor,Utak[Ir,5]]Kar := chr(Utak[Ir,6]); Scr[AutoL[Ir].Tmp^Koor,Utak[Ir,5]]Attr := AutoL[Ir]Tmp^Szin; end; end; end; procedure KepT(Ir: byte); begin case Ir of 0,2 : { Horizont lis ˇr ny } begin Scr[Utak[Ir,5],AutoL[Ir].Tmp^Koor]Kar := ; Scr[Utak[Ir,5],AutoL[Ir].Tmp^Koor]Attr := 0; end; 1,3 : { Vertikalis ˇr ny } begin Scr[AutoL[Ir].Tmp^Koor,Utak[Ir,5]]Kar := ; Scr[AutoL[Ir].Tmp^Koor,Utak[Ir,5]]Attr := 0; end; end; end; 5 Készítette: Váraljai Sándor procedure FajlBe; { Ha létezik Fájl akkor olvasása egyébként kezdeti értékadás } var I: byte; Ato: TAuto; begin assign(Autok,Auto.dat); {$I-} reset(Autok); {$I+} if ioresult = 0 then { Ha fájl létezik akkor, annak beolvasása } begin for I:=0 to 3 do begin New(AutoL[I].Tmp); read(Autok,Ato); AutoL[I].Tmp^Koor:=AtoKoor; AutoL[I].Tmp^Poz:=AtoPoz; AutoL[I].Tmp^Szin:=AtoSzin; while (AutoL[I].Tmp^Szin

<> 0) do begin if AutoL[I].Tmp^Koor <> 0 then KepR(I); if AutoL[I].Elso = Nil then AutoL[I]Elso:=AutoL[I]Tmp else AutoL[I].Akt^Kov:=AutoL[I]Tmp; AutoL[I].Akt:=AutoL[I]Tmp; AutoL[I].Akt^Kov:= Nil; New(AutoL[I].Tmp); read(Autok,Ato); AutoL[I].Tmp^Koor:=AtoKoor; AutoL[I].Tmp^Poz:=AtoPoz; AutoL[I].Tmp^Szin:=AtoSzin; end; if AutoL[I].Tmp^Koor = 1 then AutoL[I]Keresz:=true else AutoL[I].Keresz:=false; case I of 0: Status:=AutoL[I].Tmp^Poz; 1: Wait:=AutoL[I].Tmp^Poz; 2: if AutoL[I].Tmp^Poz = 1 then Pause:=true else Pause:=false; end; end; close(Autok); end else { A fájl nem létezik akkor kezdeti érték adás } begin for I:=0 to 3 do begin AutoL[I].Elso:=Nil; AutoL[I].Tmp:=Nil; AutoL[I].Keresz:=false; end; Status:=4; Wait:=5; Pause:=true; end; end; 6 Készítette: Váraljai Sándor procedure FajlKi; { Adatok mentése } var I: byte; begin assign(Autok,Auto.dat); rewrite(Autok); for I:=0 to 3 do begin AutoL[I].Tmp := AutoL[I]Elso; while AutoL[I].Tmp <> Nil do begin

write(Autok,AutoL[I].Tmp^); AutoL[I].Tmp:=AutoL[I]Tmp^Kov end; if AutoL[I].Keresz then AutoL[I]Tmp^Koor:=1 else AutoL[I].Tmp^Koor:=0; AutoL[I].Tmp^Szin:=0; case I of 0: AutoL[I].Tmp^Poz:=Status; 1: AutoL[I].Tmp^Poz:=Wait; 2: if Pause then AutoL[I].Tmp^Poz:=1 else AutoL[I].Tmp^Poz:=0; end; write(Autok,AutoL[I].Tmp^); end; close(Autok); end; procedure Halad(Ir: byte); begin case Ir of 0: dec(AutoL[Ir].Tmp^Koor,2); 1: inc(AutoL[Ir].Tmp^Koor); 2: inc(AutoL[Ir].Tmp^Koor,2); 3: dec(AutoL[Ir].Tmp^Koor); end; end; procedure UtVeg(Ir: byte); begin KepT(Ir); AutoL[Ir].Tmp:=AutoL[Ir]Tmp^Kov; dispose(AutoL[Ir].Elso); AutoL[Ir].Elso:=AutoL[Ir]Tmp; end; procedure KerUtan(Ir: byte); begin KepT(Ir); Halad(Ir); KepR(Ir); if (AutoL[Ir].Tmp^Koor = Utak[Ir,1]) then inc(AutoL[Ir].Tmp^Poz); AutoL[Ir].Tmp:= AutoL[Ir]Tmp^Kov; end; 7 Készítette: Váraljai Sándor procedure KerBen(Ir: byte; var Kovet: PAuto); begin KepT(Ir); Halad(Ir); KepR(Ir); if (AutoL[Ir].Tmp^Koor = Utak[Ir,2]) then begin

inc(AutoL[Ir].Tmp^Poz); Kovet:= AutoL[Ir].Tmp^Kov; if (Kovet^.Poz = 3) or (Kovet^Poz = 2) then Status:=Ir else Status:=4; end; AutoL[Ir].Tmp:= AutoL[Ir]Tmp^Kov; end; procedure KerElott(Ir: byte; var ElozoK: byte); var A,J: byte; begin A:=0; for J:=0 to 3 do if AutoL[J].Keresz then inc(A); if A=4 then begin A:=random(3); AutoL[A].Keresz:=false; end; if Ir=3 then A:=0 else A:=Ir+1; {(odd(Status) = odd(Ir))} if (Status = Ir) and not (AutoL[A].Keresz) or (Status = 4) and not (AutoL[A].Keresz) then begin KepT(Ir); Halad(Ir); KepR(Ir); inc(AutoL[Ir].Tmp^Poz); AutoL[Ir].Keresz:=false; Status:=Ir; end; ElozoK:=AutoL[Ir].Tmp^Koor; AutoL[Ir].Tmp:= AutoL[Ir]Tmp^Kov; end; 8 Készítette: Váraljai Sándor procedure UtEleje(Ir: byte; var ElozoK: byte); var A: byte; begin case Ir of 0: A:=(AutoL[Ir].Tmp^Koor-2); 1: A:=(AutoL[Ir].Tmp^Koor+1); 2: A:=(AutoL[Ir].Tmp^Koor+2); 3: A:=(AutoL[Ir].Tmp^Koor-1); end; if ElozoK <> A then begin KepT(Ir);

AutoL[Ir].Tmp^Koor:=AutoL[Ir]Tmp^Koor+Halad[Ir]; KepR(Ir); if (AutoL[Ir].Tmp^Koor = Utak[Ir,3]) then inc(AutoL[Ir].Tmp^Poz); end; ElozoK:=AutoL[Ir].Tmp^Koor; AutoL[Ir].Tmp:= AutoL[Ir]Tmp^Kov; end; procedure UtKezd(Ir: byte; var ElozoK: byte; var Kilep: boolean); begin if ElozoK <> Utak[Ir,4] then begin AutoL[Ir].Tmp^Koor:=Utak[Ir,4]; KepR(Ir); inc(AutoL[Ir].Tmp^Poz); end; Kilep:=false; end; procedure Forgalom; var Ir, { Forgalmi irány Ciklus változó } ElozoK: byte; { Előtte haladó jármű koordinátája (H/V) } Kilep: boolean; { Listasor olvasásnak vége } Kovet: PAuto; { kővetkező Kocsi adatai } begin for Ir:=3 downto 0 do begin Kilep:= true; ElozoK:=Utak[Ir,1]; AutoL[Ir].Tmp := AutoL[Ir]Elso; while (AutoL[Ir].Tmp <> Nil) and (kilep) do begin case AutoL[Ir].Tmp^Poz of 5: UtVeg(Ir); 4: KerUtan(Ir); 3: KerBen(Ir,Kovet); 2: KerElott(Ir,ElozoK); 1: UtEleje(Ir,ElozoK); 0: UtKezd(Ir,ElozoK,Kilep); end; end; end; end; 9 Készítette: Váraljai Sándor {Adatlap

kitöltése, listára fűzés} procedure LBovit(Ir : byte); begin if memavail > sizeof(TAuto) then { Van hely a memori ban? } begin { Van } New(AutoL[Ir].Tmp); AutoL[Ir].Tmp^Koor:=0; AutoL[Ir].Tmp^Szin:=(random(15)+1); AutoL[Ir].Tmp^Poz:=0; if AutoL[Ir].Elso = Nil then AutoL[Ir].Elso:=AutoL[Ir]Tmp else AutoL[Ir].Akt^Kov:=AutoL[Ir]Tmp; AutoL[Ir].Akt:=AutoL[Ir]Tmp; AutoL[Ir].Akt^Kov:= Nil; end else Hang; { Nincs } end; { A program folyamatának felfüggesztése } procedure All(var Kilep: boolean); var Bill: char; begin Felirat(true); Bill:=readkey; if Bill=Esc then begin Kilep:=true; Pause:=true; end else Pause:=false; Felirat(false); end; 10 Készítette: Váraljai Sándor procedure VarVBe(var Kilep: boolean); {Igaz - kilép; Hamis - idő lejárt} type TIdo = array[1.4] of word; var Ido: array[1.2] of TIdo; function Lejart: Boolean; { Animáció ideje lejárt? } var Ido3: integer; begin Ido3:=(Ido[2,1]-Ido[1,1])*360000+(Ido[2,2]-Ido[1,2])6000+

(Ido[2,3]-Ido[1,3])*100+(Ido[2,4]-Ido[1,4]); Lejart := abs(Ido3) > Wait end; var Bill: char; begin gettime(Ido[1,1],Ido[1,2],Ido[1,3],Ido[1,4]); repeat gettime(Ido[2][1],Ido[2][2],Ido[2,3],Ido[2,4]); if keypressed then begin Bill:=readkey; case Bill of Nul : begin Bill:=readkey; case Bill of Fel : LBovit(3); Le : LBovit(1); Job : LBovit(0); Bal : LBovit(2); PDo : if Wait > 5 then dec(Wait,5) else Hang; PUp : if Wait < 95 then inc(Wait,5) else Hang; Pau : All(Kilep); else Hang; end; end; Esc : Kilep:=true; else Hang; end; end; until Lejart or Kilep; end; procedure Start; { Forgalom, Várakozás/adatbevitel ciklusa } var Kilep: Boolean; begin Kilep:=false; repeat if not Pause then begin Forgalom; VarVBe(Kilep); end else All(Kilep); until Kilep; end; 11 Készítette: Váraljai Sándor begin Kurzor(false); Rajz; FajlBe; Start; FajlKi; Kurzor(true); end. { { { { { { Kurzort Eltüntet Képernyő kirajzolása Fájl betöltés Forgalom irányítás, kocsik felvétele Fájl

mentés Kurzort Megjelenít } } } } } } 12 Forgalomirányítás Váraljai Sándor A program globális adatjegyzéke Globális konstansok: Esc=#27; Job=#75; Bal=#77; Nul=#0; Fel=#72; Le =#80; Pau=#25; PUp=#81; PDo=#73; Utak: array[0.3,16] of byte ={ A - Út vége koordinata { A, B, C, D, E, F } { B - Kereszteződés vége koordinata { 0 }(( 5,37,45,77,12,17), { C - Kereszteződés kezdete koordinata { 1 } (24,15,11, 2,39,31), { D - Út kezdete koordinata { 2 } (77,45,37, 5,14,16), { E - Horizont-Y, Vertikal-X koordnata { 3 } ( 2,11,15,24,43,30)); { F - A meg jelenítendő karakter Felir: string[25]=ESC ł EXIT } } } } } } ALT+P ł PAUSE; Globális típusok: type KarHely = record Kar : char; Attr : byte; end; PAuto=^TAuto; TAuto=record Koor, Poz, Szin:byte; Kov: PAuto; end; { Karakter } { H/E Szín } { Auto: { Horizont-X, Vertikal-Y koordinata { Az aktuális szakasznak kódja { Színe { kővetkező kocsi memória címe TAutoL=record Elso, Tmp, Akt:PAuto; Keresz:boolean;

end; } } } } } { Forgalmi irány: { Első kocsi memória címe { Feldolgozás alatt lévő kocsi memória címe { Utolsó kocsi memória címe { Igaz - ha kocsi a kereszteződés előtt áll } } } } } Globális változok: Scr : array[1.25,180] of KarHely absolute $B800:0; { A képernyő memória területe } AutoL: array[0.3] of TAutoL; { A négy forgalmi irány listája } Status, { 0-3 ig a szabad irány; 4 és minden irány szabad} Wait :byte; { Várakozási idő századmásodpercben } Pause: boolean; { Igaz - pillanat megállítás } Autok: file of TAuto; { A adat fájl típusa } 1 Forgalomirányítás Váraljai Sándor Program fontosabb eljárásainak jackson ábrái Főprogram: Tevékenységjegyzék: 1. Kurzor(false): Kurzor eltüntetése, képernyő törlés 2. Kurzor(true): Megjeleníti a kurzort és képernyőt törli Rutinjegyzék: • • • • Rajz: Képernyőn megrajzolja a kereszteződés ábráját. Lásd képernyő terv FajlBe: Fájl betöltése. Lásd

további jackson ábra Start: Forgalom irányítás és animációs várakozás vagy adatbevitel ciklusa. Lásd további jackson ábra FajlKi: Fájlba meni az kocsik adatait és állapot változókat. Start: (Forgalom irányítás és animációs várakozás vagy adatbevitel ciklusa.) Lokális adatjegyzéke: Kilep: Boolean Tevékenység jegyzék: 1. Értékadás Kilép:=false Feltételjegyzék: F1. Not Pause Rutinjegyzék: • • • • Forgalom: A négy irány kocsijának irányítása. VarVBe(Kilép):. Lásd további jackson ábra All(Kilep): Lásd további jackson ábra. Puse - felírat villog mindaddig míg bármely billentyűt le nem nyomja a felhasználó. 2 Forgalomirányítás Váraljai Sándor All(Kilep: boolean) Lokális adatjegyzék: Bill: char Tevékenységjegyzék: 1. 2. 3. Felirat(true): pause feliratot villogóra írja át Bill:=readkey: Várakozás bármely billentyűre Felirat(false) Feltételjegyzék: F1: Bill=Esc VarVBe(Kilep: boolean):

(Várakozás animáció időszeletig vagy ha billentyű pufferben van adat, dinamikus lista bővítése.) Lokális adatok jegyzéke: típus: Tido=array[1.4] of word változók: Ido: array[1.2] of Tido; Bill: char Feltételjegyzék: F1. Bill= Kurzor mozgató (Fel,Le,Job,Bal) F2. Bill= Animáció sebességét változtatja (PDo, PUp) vagy (Pau) meghívja All(Kilep) eljárást. Rutinjegyzék: Tevékenység jegyzék: 1. Ido[1 vagy 2]=rendszeridő(óra, perc, másodperc, századmásodperc) 2. Bill=readkey • Lejart: Függvény, mely igaz értéket ad ha: (Ido[2] -Ido[1])>Wait-nal, vagyis várakozásnak vége. • LBpvit(Ir): Autó adatainak rögzítése és a rekord dinamikus listára fűzése. Lásd további jackson 3 Forgalomirányítás Váraljai Sándor • Hang: Rövid figyelmeztető hangjelzés rossz vagy éppen nem elérhető funkció billentyű esetén. LBovit(Ir: byte): (Autó adatainak rögzítése és a rekord dinamikus listára fűzése.) Tevékenységjegyzék:

1. New(AutoL[Ir]Tmp) 2. AutoL[Ir]Tmp^Koor:=0; AutoL[Ir].Tmp^Szin:=(random(15)+1); AutoL[Ir].Tmp^Poz:=0; Feltételjegyzék: F1: AutoL[Ir].Elso = Nil Rutinjegyzék: • Hang: rövid figyelmeztető hangjelzés 4 Forgalomirányítás Váraljai Sándor 5 Forgalomirányítás Váraljai Sándor Forgalom: Lokális változok jegyzéke: Ir: byte Forgalmi irány avagy ciklus változó ElozoK: byte Előtte haladó jármű koordinátája Kilép: boolean Listasor olvasásának vége Kovet: PAuto Következő autó adatai Tevékenységjegyzék: 1. 2. 3. 4. Kilép:=true ElozoK:=Utak[Ir,1]; AutoL[Ir].Tmp := AutoL[Ir]Elso; Többágú elágazás: case AutoL[Ir].Tmp^Poz of Feltételjegyzék: F1: while (AutoL[Ir].Tmp <> Nil) and (kilep) F2: AutoL[Ir].Tmp^Poz=5 F3: AutoL[Ir].Tmp^Poz=4 F4: AutoL[Ir].Tmp^Poz=3 F5: AutoL[Ir].Tmp^Poz=2 F6: AutoL[Ir].Tmp^Poz=1 F7: AutoL[Ir].Tmp^Poz=0 Rutinjegyzék: • • • • • • UtVeg(Ir) Lásd további jackson KerUtan(Ir) Lásd további jackson

KerBen(Ir,Kovet) Lásd további jackson KerElott(Ir,ElozoK) Lásd további jackson UtEleje(Ir,ElozoK) Lásd további jackson UtKezd(Ir,ElozoK,Kilep) Lásd további jackson 6 Forgalomirányítás Váraljai Sándor UtKezd(Ir,ElozoK: byte, Kilep: boolean): Tevékenységjegyzék: 1. 2. 3. 4. Kilep=false AutoL[Ir].TmpˆKoor:=Utak[Ir,4] KepR(Ir): Autó képének megjelenítése. Autópozíció növelése Feltételjegyzék: F1: ElozoK<>Utak[Ir,4] UtEleje(Ir,ElozoK: byte) Tevékenységjegyzék: 1. 2. 3. 4. Előző autó koordinátájának mentése Következő autó lesz az aktuális. KepT(Ir): Autó képének törlése. Autó koordinátájának növelése vagy csökkentése (iránytól függően) 5. KepR(Ir): Autó képének megjelenítése 6. Autópozíció növelése Feltételjegyzék: F1: Előző autó K. <> Aktuális autó + Haladási érték F2: AutoL[Ir].TmpˆKoor= Utak[Ir,3] 7 Forgalomirányítás Váraljai Sándor 8 Forgalomirányítás Váraljai

Sándor KerElott(Ir,ElozoK: byte) Tevékenységjegyzék: 1. 2. 3. 4. 5. 6. 7. 8. Előző autó koordinátájának mentése Következő autó lesz az aktuális. KepT(Ir): Autó képének törlése. Autó koordinátájának növelése vagy csökkentése (iránytól függően) KepR(Ir): Autó képének megjelenítése. Autópozíció növelése AutoL[Ir].Keresz:=felse A kereszteződés foglalt Status:=Ir Ebből az irányból haladhatnak a járművek. Feltételjegyzék: F1: Mind a négy irány kereszteződésében várakozik jármű. F2: Ebből az irányból vagy minden irányból szabad az áthaladás. KerBen(Ir,Kovet: byte) Tevékenységjegyzék: 1. KepT(Ir): Autó képének törlése 2. Autó koordinátájának növelése vagy csökkentése (iránytól függően) 3. KepR(Ir): Autó képének megjelenítése 4. Autópozíció növelése 5. Következő autó lesz az aktuális 6. A következő autó a kereszteződésben vagy közvetlenül előtte áll. Feltételjegyzék: F1:

AutoL[Ir].TmpˆKoor=Utak[Ir,2] F2: Kovetˆ.Poz=3 or Kovetˆ= 2 9 Forgalomirányítás Váraljai Sándor KerUtan(Ir: byte) Tevékenység jegyzék: 1. 2. 3. 4. KepT(Ir): Autó képének törlése. Autó koordinátájának növelése vagy csökkentése (iránytól függően); KepR(Ir): Autó képének megjelenítése. Következő jármű lesz az aktuális. Autópozíció növelése. Feltételjegyzék: F1: AutoL[Ir].TmpˆKoor=Utak[Ir,1] UtVeg(Ir: byte) Tevékenységjegyzék: 1. 2. 3. 4. KepT(Ir): Autó képének törlése. Következő jármű lesz az aktuális. Első jármű által foglalt memória terület felszabadítása. Első jármű lesz az aktuális. 10 Forgalomirányítás Váraljai Sándor FajlBe: (Ha létezik Auto.dat állomány akkor annak blokkjainak beolvasása, egyébként kezdeti értékadás) Lokális adatok jegyzéke: I: byte Ato: Tauto ciklusváltozó Tevékenységjegyzék: 1. Hibakezelés kikapcsolása mellett, Fájl megnyitás 2. New(AutoL[I]Tmp);

read(Autok,Ato); AutoL[I].Tmp^Koor:=AtoKoor; AutoL[I].Tmp^Poz:=AtoPoz; AutoL[I].Tmp^Szin:=AtoSzin; 3. Fájl lezárása Feltételjegyzék: F1: ioresult =0 F2: I:=0-tól 3-ig F3: while AutoL[I].Tmp^Szin <> 0 do FajlKi: (Adatok mentése) Lokális adatjegyzék: I: byte ciklusváltozó Tevékenységjegyzék: 1. 2. 3. Fájl megnyitása felülírással. AutoL[I].Tmp := AutoL[I]Elso; Fájl lezárása. Feltételjegyzék: F1: I:=0-tól 3-ig. F2: while AutoL[I].Tmp <> Nil do 11 Készítette: Váraljai Sándor 1. Képernyőterv 1. Forgalomirányítás 1 Készítette: Váraljai Sándor 2. Képernyőterv 1. Utak-tömb 2