home *** CD-ROM | disk | FTP | other *** search
- /* Program EX_0501.C
- Listing 9C - see documentation in TUTOR.SSS
- */
-
- #include "SSSC.H"
-
- #define ARRIVL 1
- #define STARTA 2
- #define ENDACT 3
- #define NEXTAC 4
- #define STRTDY 5
-
- #define CLOSES 0
- #define WATCH 1
-
- #define FALSE 0
- #define TRUE 1
-
- int ecode, opens, repars;
- double inter, rept;
-
- void prime()
- {
- INIQUE(3, 1, 1);
- INISTA(1, "Sojourn time", 0, 10, 0.0, 0.2);
-
- CREATE(0.0, WATCH );
- CREATE(0.5, CLOSES);
- SIMEND(10.0);
-
- opens = TRUE;
- repars = FALSE;
- inter = 7.0/25.0;
- rept = 2.0/24.0;
- }
-
- void clshop()
- {
- opens = FALSE;
- while (NQ(3))
- {
- REMVFQ(3, 1);
- TALLY(1, T() - A(1));
- DISPOS();
- }
- }
-
- void newday()
- {
- CREATE(0.5, CLOSES);
- DISPOS();
- opens = TRUE;
- repars = FALSE;
-
- while (NQ(1))
- {
- REMVFQ(1, 1);
- QUEUE(2, 0.0);
- }
- }
-
- main()
- {
- prime();
-
- do
- {
- if ((ecode = NEXTEV()) > 0)
- switch(ecode)
- {
-
- case ARRIVL:
- if (IDE() == WATCH)
- {
- CREATE(EX(inter), WATCH);
- SETA(1, T());
- SCHED(0.0, NEXTAC, WATCH);
- } else
- {
- SCHED(0.5, STRTDY, CLOSES);
- clshop();
- }
- break;
-
- case NEXTAC:
- if (opens)
- {
- if (repars) QUEUE(2, 0.0);
- else SCHED(0.0, STARTA, IDE());
- }
- else QUEUE(1, 0.0);
- break;
-
- case STARTA:
- SCHED(EX(rept), ENDACT, 0);
- repars = TRUE;
- break;
-
- case ENDACT:
- QUEUE(3, 0.0);
- if (NQ(2))
- {
- REMVFQ(2, 1);
- SCHED(0.0, STARTA, 0);
- }
- else repars = FALSE;
- break;
-
- case STRTDY:
- newday();
- break;
- }
- } while (ecode);
-
- SUMRY("");
- }