3 (*****************************************************************************)
\r
4 (********************************** F I F O **********************************)
\r
5 (*****************************************************************************)
\r
7 unit FIFO : class ( type T);
\r
9 var HEAD,LAST : ELEM;
\r
11 unit ELEM : class ( INFO : T);
\r
16 unit EMPTY : function : boolean;
\r
18 result := (HEAD=NONE)
\r
21 unit INTO : procedure ( INFO : T );
\r
24 HEAD := new ELEM(INFO);
\r
27 LAST.NEXT := new ELEM(INFO);
\r
32 unit FIRST : function : T;
\r
37 unit OUT_FIRST : procedure;
\r
45 unit CARDINAL : function : integer;
\r
51 result :=result + 1;
\r
59 (*****************************************************************************)
\r
60 (************************** E N D F I F O *******************************)
\r
61 (*****************************************************************************)
\r
65 (*****************************************************************************)
\r
66 (************************* S I M U L A T I O N *******************************)
\r
67 (*****************************************************************************)
\r
69 UNIT PRIORITYQUEUE: IIUWGRAPH CLASS;
\r
71 UNIT QUEUEHEAD: CLASS;
\r
72 (* HEAP ACCESING MODULE *)
\r
75 UNIT MIN: FUNCTION: ELEM;
\r
77 IF ROOT=/= NONE THEN RESULT:=ROOT.EL FI;
\r
80 UNIT INSERT: PROCEDURE(E:ELEM);
\r
81 (* INSERTION INTO HEAP *)
\r
87 ROOT.LEFT,LAST:=ROOT
\r
104 LAST.LEFT.RIGHT:=X;
\r
110 CALL CORRECT(E,FALSE)
\r
113 UNIT DELETE: PROCEDURE(R: ELEM);
\r
120 if y<>none then Y.RIGHT:= LAST else root :=none fi;
\r
130 LAST.NS:= LAST.NS-1;
\r
134 z.left.right := none;
\r
136 z.left, z.right, z.up := none;
\r
137 IF X.LESS(X.UP) THEN CALL CORRECT(X.EL,FALSE)
\r
138 ELSE CALL CORRECT(X.EL,TRUE) FI;
\r
141 UNIT CORRECT: PROCEDURE(R:ELEM,DOWN:BOOLEAN);
\r
142 (* CORRECTION OF THE HEAP WITH STRUCTURE BROKEN BY R *)
\r
143 VAR X,Z:NODE,T:ELEM,FIN,LOG:BOOLEAN;
\r
148 IF Z.NS =0 THEN FIN:=TRUE ELSE
\r
149 IF Z.NS=1 THEN X:=Z.LEFT ELSE
\r
150 IF Z.LEFT.LESS(Z.RIGHT) THEN X:=Z.LEFT ELSE X:=Z.RIGHT
\r
152 IF Z.LESS(X) THEN FIN:=TRUE ELSE
\r
163 IF X=NONE THEN LOG:=TRUE ELSE LOG:=X.LESS(Z); FI;
\r
172 IF X=NONE THEN LOG:=TRUE ELSE LOG:=X.LESS(Z);
\r
181 UNIT NODE: CLASS (EL:ELEM);
\r
182 (* ELEMENT OF THE HEAP *)
\r
183 VAR LEFT,RIGHT,UP: NODE, NS:INTEGER;
\r
184 UNIT LESS: FUNCTION(X:NODE): BOOLEAN;
\r
186 IF X= NONE THEN RESULT:=FALSE
\r
187 ELSE RESULT:=EL.LESS(X.EL) FI;
\r
192 UNIT ELEM: CLASS(PRIOR:REAL);
\r
193 (* PREFIX OF INFORMATION TO BE STORED IN NODE *)
\r
195 UNIT VIRTUAL LESS: FUNCTION(X:ELEM):BOOLEAN;
\r
197 IF X=NONE THEN RESULT:= FALSE ELSE
\r
198 RESULT:= PRIOR< X.PRIOR FI;
\r
201 LAB:= NEW NODE(THIS ELEM);
\r
206 UNIT SIMULATION: PRIORITYQUEUE CLASS;
\r
207 (* THE LANGUAGE FOR SIMULATION PURPOSES *)
\r
210 signal ERROR1, ERROR2;
\r
211 VAR CURR : SIMPROCESS, (* ACTIVE PROCESS *)
\r
212 PQ : QUEUEHEAD, (* THE TIME AXIS *)
\r
213 MAINPR : MAINPROGRAM;
\r
216 UNIT SIMPROCESS: COROUTINE;
\r
217 (* USER PROCESS PREFIX *)
\r
219 VAR EVENT, (* ACTIVATION MOMENT NOTICE *)
\r
220 EVENTAUX: EVENTNOTICE,
\r
221 (* THIS IS FOR AVOIDING MANY NEW CALLS AS AN RESULT OF *)
\r
222 (* SUBSEQUENT PASSIVATIONS AND ACTIVATIONS *)
\r
225 UNIT IDLE: FUNCTION: BOOLEAN;
\r
227 RESULT:= EVENT= NONE
\r
230 UNIT TERMINATED: FUNCTION :BOOLEAN;
\r
235 UNIT EVTIME: FUNCTION: REAL;
\r
236 (* TIME OF ACTIVATION *)
\r
238 IF IDLE THEN raise ERROR1; FI;
\r
239 RESULT:= EVENT.EVENTTIME;
\r
243 WRITELN(" AN ATTEMPT TO ACTIVATE AN IDLE PROCESS TIME");
\r
246 WRITELN(" AN ATTEMPT TO ACTIVATE A TERMINATED PROCESS TIME");
\r
259 UNIT EVENTNOTICE: ELEM CLASS;
\r
260 (* A PROCESS ACTIVATION NOTICE TO BE PLACED ONTO THE TIME AXIS PQ *)
\r
261 VAR EVENTTIME: REAL, PROC: SIMPROCESS;
\r
263 UNIT VIRTUAL LESS: FUNCTION(X: EVENTNOTICE):BOOLEAN;
\r
264 (* OVERWRITE THE FORMER VERSION CONSIDERING EVENTTIME *)
\r
270 RESULT:= EVENTTIME< X.EVENTTIME OR
\r
271 (EVENTTIME=X.EVENTTIME AND PRIOR<= X.PRIOR);
\r
278 UNIT MAINPROGRAM: SIMPROCESS CLASS;
\r
279 (* IMPLEMENTING MASTER PROGRAM AS A PROCESS *)
\r
281 DO ATTACH(MAIN) OD;
\r
284 UNIT TIME:FUNCTION:REAL;
\r
285 (* CURRENT VALUE OF SIMULATION TIME *)
\r
287 RESULT:=CURRENT.EVTIME
\r
290 UNIT CURRENT: FUNCTION: SIMPROCESS;
\r
291 (* THE FIRST PROCESS ON THE TIME AXIS *)
\r
296 UNIT SCHEDULE: PROCEDURE(P:SIMPROCESS,T:REAL);
\r
297 (* ACTIVATION OF PROCESS P AT TIME T AND DEFINITION OF *)
\r
298 (* "PRIOR"- PRIORITY WITHIN TIME MOMENT T *)
\r
301 if p.terminated then raise ERROR2 fi;
\r
303 IF T<TIME THEN T:= TIME FI;
\r
304 IF P=CURRENT THEN CALL HOLD(T-TIME) ELSE
\r
305 IF P.IDLE AND P.EVENTAUX=NONE THEN (* HAS NOT BEEN SCHEDULED YET*)
\r
306 P.EVENT,P.EVENTAUX:= NEW EVENTNOTICE(RANDOM);
\r
309 IF P.IDLE (* P HAS ALREADY BEEN SCHEDULED *) THEN
\r
310 P.EVENT:= P.EVENTAUX;
\r
311 P.EVENT.PRIOR:=RANDOM;
\r
313 (* NEW SCHEDULING *)
\r
314 P.EVENT.PRIOR:=RANDOM;
\r
315 CALL PQ.DELETE(P.EVENT)
\r
318 P.EVENT.EVENTTIME:= T;
\r
319 CALL PQ.INSERT(P.EVENT) FI;
\r
322 UNIT HOLD:PROCEDURE(T:REAL);
\r
323 (* MOVE THE ACTIVE PROCESS T MINUTES BACK ALONG PQ *)
\r
324 (* REDEFINE PRIOR *)
\r
326 CALL PQ.DELETE(CURRENT.EVENT);
\r
327 CURRENT.EVENT.PRIOR:=RANDOM;
\r
328 IF T<0 THEN T:=0; FI;
\r
329 CURRENT.EVENT.EVENTTIME:=TIME+T;
\r
330 CALL PQ.INSERT(CURRENT.EVENT);
\r
331 CALL CHOICEPROCESS;
\r
334 UNIT PASSIVATE: PROCEDURE;
\r
335 (* REMOVE THE ACTVE PROCESS FROM PQ AND ACTIVATE THE NEXT ONE *)
\r
337 CALL PQ.DELETE(CURRENT.EVENT);
\r
338 CURRENT.EVENT:=NONE;
\r
342 UNIT RUN: PROCEDURE(P:SIMPROCESS);
\r
343 (* ACTIVATE P IMMEDIATELY AND DELAY THE current PROCESS BY REDEFINING*)
\r
346 CURRENT.EVENT.PRIOR:=RANDOM;
\r
349 P.EVENT.EVENTTIME:=TIME;
\r
350 CALL PQ.CORRECT(P.EVENT,FALSE)
\r
352 IF P.EVENTAUX=NONE THEN
\r
353 P.EVENT,P.EVENTAUX:=NEW EVENTNOTICE(0);
\r
355 P.EVENT:=P.EVENTAUX;
\r
358 P.EVENT.EVENTTIME:=TIME;
\r
360 CALL PQ.INSERT(P.EVENT);
\r
362 CALL CHOICEPROCESS;
\r
365 UNIT CANCEL:PROCEDURE(P: SIMPROCESS);
\r
366 (* REMOVE PROCESS P FROM PQ AND CONTINUE SIMULATION *)
\r
368 IF P= CURRENT THEN CALL PASSIVATE ELSE
\r
369 CALL PQ.DELETE(P.EVENT);
\r
373 UNIT CHOICEPROCESS:PROCEDURE;
\r
374 (* CHOOSE THE FIRST PROCESS FROM PQ TO BE ACTIVATED *)
\r
376 (**** poprawka 10-93 ****)
\r
377 CURR:= PQ.MIN QUA EVENTNOTICE.PROC;
\r
378 IF CURR=NONE THEN WRITE(" ERROR IN THE HEAP"); WRITELN;
\r
380 ELSE ATTACH(CURR); FI;
\r
384 PQ:=NEW QUEUEHEAD; (* SIMULATION TIME AXIS*)
\r
385 CURR,MAINPR:=NEW MAINPROGRAM;
\r
386 MAINPR.EVENT,MAINPR.EVENTAUX:=NEW EVENTNOTICE(0);
\r
387 MAINPR.EVENT.EVENTTIME:=0;
\r
388 MAINPR.EVENT.PROC:=MAINPR;
\r
389 CALL PQ.INSERT(MAINPR.EVENT);
\r
390 (* THE FIRST PROCESS TO BE ACTIVATED IS MAIN PROGRAM *)
\r
395 (*****************************************************************************)
\r
396 (************************ E N D S I M U L A T I O N *********************)
\r
397 (*****************************************************************************)
\r
400 (* B U S S I M U L A T I O N *)
\r
402 pref iiuwgraph block
\r
405 PREF SIMULATION BLOCK
\r
406 const pojemnosc=30;
\r
409 przystan:arrayof przystanek,
\r
413 praz, booo:boolean,
\r
414 i,j,jj,p,czas_sym,czas,ilosc_przystankow,
\r
415 ilosc_auto,czestosc,odstep1,odstep2,podst1,podst2:integer;
\r
417 unit wsp:class(x,y,i:integer);
\r
421 unit nast:function(w:wsp):wsp;
\r
424 if w.i <= ilosc_przystankow div 2
\r
426 pom:=new wsp(w.x,w.y - odstep1,i mod ilosc_przystankow +1)
\r
430 pom:=new wsp(600-w.x,20,i mod ilosc_przystankow+1)
\r
432 pom:=new wsp(w.x,w.y+odstep1,i mod ilosc_przystankow+1)
\r
438 unit bus:simprocess class(nr,kolor:integer);
\r
439 (* nr = numer autobusu *)
\r
441 wolnych_miejsc : integer,
\r
442 dokad : arrayof integer,
\r
444 wsiadajacy:pasazer;
\r
446 array dokad dim (1: ilosc_przystankow);
\r
447 wolnych_miejsc := pojemnosc;
\r
450 ws := new wsp(480,282,1);
\r
451 call auto(kolor,ws.x,ws.y,wolnych_miejsc);
\r
454 i:= entier(random*10);
\r
457 (* dojazd do pierwszego przystanku *)
\r
459 while ws.y>przystan(i).ws.y
\r
461 call auto(kolor,ws.x,ws.y,wolnych_miejsc);
\r
462 if nr<> 1 then call hold(nr*2) fi;
\r
463 call auto(0 ,ws.x,ws.y,wolnych_miejsc);
\r
467 do (* petla w ktorej pracuje autobus *)
\r
469 ws.y:=przystan(i).ws.y;
\r
471 if i <= ilosc_przystankow div 2
\r
473 kier:=1; ws.x := 480 else kier := -1; ws.x :=420;
\r
476 call auto(kolor,ws.x+kier*10,ws.y,wolnych_miejsc);
\r
478 (* autobus jest na przystanku *)
\r
480 wolnych_miejsc:=wolnych_miejsc + dokad(i);
\r
481 (* z autobusu wysiadlo dokad(i) pasazerow *)
\r
482 call auto(kolor,ws.x+kier*10,ws.y,wolnych_miejsc);
\r
486 (*** teraz pasazerowie wsiadaja ***)
\r
487 while (wolnych_miejsc > 0) and (not przystan(i).kolejka.empty)
\r
489 wsiadajacy:=przystan(i).kolejka.first;
\r
490 dokad(wsiadajacy.dokad) := dokad(wsiadajacy.dokad) +1;
\r
491 call usun(przystan(i).ws.x,przystan(i).ws.y,
\r
492 kier*przystan(i).kolejka.cardinal);
\r
493 call przystan(i).kolejka.out_first;
\r
494 wolnych_miejsc:=wolnych_miejsc - 1;
\r
496 call auto(0,ws.x+kier*10,ws.y,wolnych_miejsc);
\r
497 call auto(kolor,ws.x+kier*10,ws.y,wolnych_miejsc);
\r
499 call run(wsiadajacy);
\r
504 (* autobus rusza z przystanku *)
\r
505 call auto(0,ws.x+kier*10,ws.y,wolnych_miejsc);
\r
506 if i= ilosc_przystankow div 2
\r
510 call auto(kolor,ws.x,ws.y,wolnych_miejsc);
\r
512 call auto(0,ws.x,ws.y,wolnych_miejsc);
\r
515 ws.x := 420; (*autobus przeskakuje na druga strone ulicy*)
\r
519 if i=ilosc_przystankow then
\r
522 call auto(kolor,ws.x,ws.y,wolnych_miejsc);
\r
524 call auto(0,ws.x,ws.y,wolnych_miejsc);
\r
527 ws.x := 480; (*autobus przeskakuje na druga strone ulicy*)
\r
532 if i<ilosc_przystankow div 2
\r
534 while ws.y>przystan(i+1).ws.y
\r
536 call auto(kolor,ws.x,ws.y,wolnych_miejsc);
\r
538 call auto(0,ws.x,ws.y,wolnych_miejsc);
\r
539 ws.y := ws.y-kier*2;
\r
542 while ws.y< przystan(i+1).ws.y
\r
544 call auto(kolor,ws.x,ws.y,wolnych_miejsc);
\r
546 call auto(0,ws.x,ws.y,wolnych_miejsc);
\r
547 ws.y := ws.y-kier*2;
\r
551 i:=i mod ilosc_przystankow + 1;
\r
555 unit pasazer:simprocess class(nr,kolor:integer);
\r
556 var czas_przyjscia,czas_oczekiwania:integer,
\r
559 dokad := 1+entier(random*(ilosc_przystankow-1));
\r
560 czas_przyjscia:=time;
\r
562 czas_oczekiwania:=time-czas_przyjscia;
\r
563 przystan(nr).laczny_czas:=przystan(nr).laczny_czas +
\r
565 przystan(nr).sredniczas:=przystan(nr).laczny_czas /
\r
569 unit zajezdnia : simprocess class(ilosc,czestosc : integer) ;
\r
570 var autobus : bus, i,j : integer;
\r
574 j:= entier(random*5)+2; (*kolor autobusu i= numer autobusu*)
\r
575 autobus := new bus(i,j) ;
\r
576 call schedule(autobus,time+2);
\r
577 call HOLD(czestosc*i);
\r
581 unit przystanek : simprocess class(nr:integer);
\r
582 var k, jak_czesto : integer,
\r
586 kier,ilosc_pas,total,laczny_czas,czas_do_nast:integer,
\r
589 kolejka := new FIFO(pasazer);
\r
591 (*to powinno byc zalezne od szybkosci autobusu*)
\r
592 (* i odleglosci miedzy przystankami*)
\r
594 if nr<=ilosc_przystankow div 2 then
\r
595 ws := new wsp(510,290-podst1-(nr-1)*odstep1,nr)
\r
597 ws := new wsp(390,podst2+(nr-ilosc_przystankow div 2-1)*odstep2,nr)
\r
601 call move(ws.x-15,ws.y+10)
\r
603 call move(ws.x,ws.y+10)
\r
608 (* generowanie pasazerow *)
\r
610 (* jak_czesto sa losowani pasazerowie *)
\r
611 if nr<= (ilosc_przystankow div 2)
\r
613 kier := 1 else kier := -1
\r
615 k:= entier(random*12)+2; (*kolor pasazera*)
\r
616 new_pas:=new pasazer(nr,k);
\r
618 call kolejka.into(new_pas);
\r
619 call kol(ws.x,ws.y,kier*kolejka.cardinal,k);
\r
620 call schedule(new_pas,time);
\r
621 call hold(entier(random*10)+10);
\r
626 (*------------------------------------------------------------------------*)
\r
627 (*-------------------- PROCEDURY POMOCNICZE ----------------------------*)
\r
628 (*------------------------------------------------------------------------*)
\r
630 unit ludzik:procedure(x,y,k :integer);
\r
635 call draw(x-2,y+10);
\r
637 call draw(x+2,y+10);
\r
638 call move(x-2,y+2);
\r
639 call draw(x+2,y+2);
\r
640 call move(x-2,y+2);
\r
641 call draw(x-4,y+4);
\r
642 call move(x+2,y+2);
\r
643 call draw(x+4,y+4);
\r
648 unit usun:procedure(x,y,m:integer);
\r
654 call ludzik(x+8*m,y,0);
\r
659 unit kol:procedure(x,y,m,k:integer);
\r
664 call ludzik(x+8*m,y,k)
\r
669 unit wypisz : procedure(x:integer);
\r
670 unit CHRTYP :function ( x:integer):string;
\r
671 (* zamiana liczby na tekst *)
\r
674 when 1 : result:="1";
\r
675 when 2 : result:="2";
\r
676 when 3 : result:="3";
\r
677 when 4 : result:="4";
\r
678 when 5 : result:="5";
\r
679 when 6 : result:="6";
\r
680 when 7 : result:="7";
\r
681 when 8 : result:="8";
\r
682 when 9 : result:="9";
\r
683 when 0 : result:="0"
\r
688 if x<0 then call outstring("ujemna liczba")
\r
690 call outstring(chrtyp(x div 10));
\r
691 call outstring(chrtyp(x mod 10))
\r
696 unit zegar:simprocess class;
\r
700 call ramka(420,310,480,335);
\r
701 call ramka(422,312,478,333);
\r
702 call ramka(421,311,479,334);
\r
706 call move(433,320);
\r
708 call outstring(":");
\r
711 if j=60 then j:=0;i:=i+1 fi;
\r
717 unit info:simprocess class;
\r
721 call ramka(0,0,324,140+10*ilosc_przystankow);
\r
722 call ramka(1,1,326,141+10*ilosc_przystankow);
\r
725 call outstring("Max. nb. of persons in the bus:");
\r
726 call outstring("30 os.");
\r
728 call outstring("Time przejazdu miedzy");
\r
730 call outstring("przystankami:");
\r
731 call outstring(" 3 min.");
\r
733 call outstring("The time of Simulation:");
\r
734 if czas_sym div 60=/=0
\r
736 call wypisz(czas_sym div 60);
\r
737 call outstring(" h. ")
\r
739 call wypisz(czas_sym mod 60);
\r
740 call outstring(" min.");
\r
742 call outstring("Frequency :");
\r
743 call wypisz(czestosc);
\r
744 call outstring(" min.");
\r
745 call move(200,100);
\r
746 call outstring("Avrage ");
\r
747 call move(200,110);
\r
748 call outstring("waiting-time:");
\r
750 call outstring("BUS");
\r
752 call outstring("STOP");
\r
753 call outstring(" ");
\r
755 call outstring("Number");
\r
757 call outstring("of persons");
\r
759 call ramka(530,5,610,20);
\r
761 call outstring("Esc - END");
\r
764 if inkey=27 then call run(mainpr) fi;
\r
766 for i:=1 to ilosc_przystankow
\r
768 call move(30,120+i*10);
\r
770 call outstring(" ");
\r
771 call move(90,120+i*10);
\r
772 call wypisz(przystan(i).kolejka.cardinal);
\r
773 call outstring(" ");
\r
774 call move(200,120+i*10);
\r
775 call wypisz(entier(przystan(i).sredniczas));
\r
776 call outstring(".");
\r
777 call wypisz(entier(przystan(i).sredniczas*10) mod 10);
\r
778 call outstring(" min. ")
\r
786 unit ramka : procedure(x1,y1,x2,y2:integer);
\r
796 unit pr:procedure(x,y,dx,dy:integer);
\r
798 call ramka(x-dx div 2,y-dy div 2,x+dx div 2,y+dy div 2)
\r
801 unit auto:procedure(k,x,y,n:integer);
\r
802 begin (* ilosc miejsc wolnych w aucie *)
\r
805 call pr(x,y,10,20);
\r
807 call wypisz(n); (* ilosc pasazerow w autobusie *)
\r
812 unit zabij_pas:procedure(i:integer);
\r
815 while przystan(i).kolejka.cardinal>0
\r
817 p:=przystan(i).kolejka.first;
\r
818 call przystan(i).kolejka.out_first;
\r
819 if p.event=/=none then call cancel(p) fi;
\r
824 unit wstep:procedure;
\r
827 call ramka(230,120,480,220);
\r
828 call ramka(228,118,482,222);
\r
829 call ramka(226,116,484,224);
\r
830 call move(250,140);
\r
831 call outstring(" PROJET 6 ");
\r
832 call move(250,160);
\r
833 call outstring(" BUS SIMULATION ");
\r
834 call move(250,180);
\r
835 call outstring("Author: Nguyen Tuan Trung");
\r
836 call move(250,200);
\r
837 call outstring(" Warsaw 24 - 05 - 1990");
\r
838 WHILE INKEY=0 DO OD;
\r
842 unit Jezdnia : procedure;
\r
847 (* rysowanie pasa srodkowego jezdni *)
\r
849 call ramka(448,300-i*40,452,320-i*40);
\r
850 call ramka(449,300-i*40,451,320-i*40);
\r
851 call ramka(450,300-i*40,450,320-i*40);
\r
856 (*----------- PROGRAM GLOWNY---------------------------------------------*)
\r
860 call wstep; booo:= true;
\r
861 DO (* to repeat simulation *)
\r
864 write("Simulation time = ");
\r
868 else writeln(" The simulation time must be >0 ")
\r
872 write("Number of bus-stops (1-10) = ");
\r
873 readln(ilosc_przystankow);
\r
874 if ilosc_przystankow>1 and ilosc_przystankow < 11 then exit
\r
875 else writeln("It must be not bigger than 10!")
\r
879 write("Number of buses (>0) = ");
\r
880 readln(ilosc_auto);
\r
881 if ilosc_auto>0 then
\r
884 writeln("Must be bigger than 0 !")
\r
888 write("Frequency of buses (>10) = ");
\r
890 if czestosc>=10 then exit
\r
892 writeln("Must be bigger than 9 !")
\r
897 call color(2); (* ta ramka odpowiada jezdni *)
\r
898 call ramka(400,3,502,300);
\r
899 call ramka(399,2,503,301);
\r
900 call ramka(398,1,504,302);
\r
901 call ramka(395,0,507,305);
\r
903 odstep1:=290 div (ilosc_przystankow div 2 + 1);
\r
904 podst1:=(290- (ilosc_przystankow div 2-1)*odstep1) div 2;
\r
905 odstep2:=290 div (ilosc_przystankow -
\r
906 ilosc_przystankow div 2 + 1);
\r
907 podst2:=(290- (ilosc_przystankow-
\r
908 ilosc_przystankow div 2-1)*odstep2) div 2;
\r
911 (*_____________________________________________________________*)
\r
913 array przystan dim(1:ilosc_przystankow);
\r
914 for i:=1 to ilosc_przystankow
\r
916 przystan(i):=new przystanek(i);
\r
917 call schedule(przystan(i),time)
\r
921 call schedule(cl,time);
\r
923 call schedule(inf,time+0.5);
\r
925 zaj := new zajezdnia(ilosc_auto,czestosc);
\r
926 call schedule(zaj, time);
\r
929 call hold(czas_sym+0.7);
\r
930 (* program glowny czeka az sie skonczy czas symulacji *)
\r
932 call ramka(520,290,620,345);
\r
933 call ramka(521,291,619,344);
\r
934 call move(530,300);
\r
936 call outstring("TIME IS OUT");
\r
937 call move(530,320);
\r
938 call outstring("GO ON(y/n)?");
\r
940 while i=0 do i:=inkey od;
\r
944 call move(530,320);
\r
945 call outstring("add: ");
\r
946 call move(565,320);
\r
951 while ( not( i>=ord('0') and i<=ord('9')) and i=0)
\r
954 jj := 10*jj+ (i-ord('0'));
\r
957 call outstring(" min");
\r
959 for j:=1 to 2000 do od;
\r
961 call ramka(520,290,620,345);
\r
962 call ramka(521,291,619,344);
\r
964 call move(530,300);
\r
965 call outstring(" ");
\r
966 call move(530,320);
\r
967 call outstring(" ");
\r
969 czas_sym:=czas_sym+czas;
\r
972 call outstring(" ");
\r
974 call outstring("Czas symulacji:");
\r
975 if czas_sym div 60<>0
\r
977 call wypisz(czas_sym div 60);
\r
978 call outstring(" godz. ")
\r
980 if czas_sym mod 60 <>0 then
\r
981 call wypisz(czas_sym mod 60);
\r
982 call outstring(" min.");
\r
985 booo := false; (* nie przedluzam *)
\r
986 fi; (*******************************)
\r
988 OD (* WHILE BOOO *);
\r
990 (*___________________________________________________________________*)
\r
991 (* usuwanie obiektow stworzonych przez symulacje *)
\r
992 (*___________________________________________________________________*)
\r
994 for i:=1 to ilosc_przystankow
\r
997 call cancel(przystan(i));
\r
1009 write("Do you like to repeat the simulation process (y/n) ?");
\r
1010 (* uwaga!! autobusy nie zostaly usuniete !! *)
\r
1013 if c<> 'y' then exit fi ;
\r