home *** CD-ROM | disk | FTP | other *** search
- /* Program EX_0702.C
- Listing 15C - see documentation in TUTOR.SSS
- */
-
- #include "SSSC.H"
-
- #define WHITE 1
- #define BLUE 2
- #define RED 3
- #define YELLOW 4
-
- #define MAINP 1
- #define COVER 2
- #define MREQ 3
-
- #define ARRIVL 1
- #define STARTA 2
- #define ENDACT 3
- #define NEXTAC 4
- #define MATCH 5
-
- int ecode, server;
-
- void prime()
- {
- server = 1;
- INIQUE(2, 1, 1);
- SIMEND(150.0);
- CREATE(EX(12.0), MAINP);
- CREATE(EX(12.0), COVER);
- }
-
- int other()
- {
- if (IDE() == MAINP) return(COVER);
- else return(MAINP);
- }
-
- void find1()
- {
- int i, o;
- i = 1;
- o = other();
- while ((i <= NQ(o)) && (AIQ(o, i, 1) != A(1))) i++;
- if (i <= NQ(o))
- {
- DISPOS();
- REMVFQ(o, i);
- SCHED(0.0, STARTA, IDE());
- } else QUEUE(IDE(), 0.0);
- }
-
- void find2()
- {
- int i, j, found;
- double color;
- found = 0;
- j = 1;
- do
- {
- color = AIQ(MAINP, j, 1);
- i = 1;
- while ((i <= NQ(COVER)) &&
- (AIQ(COVER, i, 1) != color)) i++;
-
- if (i <= NQ(COVER))
- {
- REMVFQ(COVER, i);
- DISPOS();
- REMVFQ(MAINP, j);
- found = 1;
- } else j++;
- } while ((found == 0) && (j <= NQ(MAINP)));
- }
-
- main()
- {
- prime();
-
- do
- {
- if ((ecode = NEXTEV()) > 0)
- switch(ecode)
- {
-
- case ARRIVL:
- if (IDE() == MREQ)
- SCHED(0.0, MATCH, IDE()); else
- {
- CREATE(EX(12), IDE());
- if(RA() < 0.35) SETA(1, WHITE ); else
- if(RA() < 0.50) SETA(1, BLUE ); else
- if(RA() < 0.80) SETA(1, RED ); else
- SETA(1, YELLOW);
- SCHED(0.0, NEXTAC, IDE());
- }
- break;
-
- case NEXTAC:
- if ((server) && (NQ(other())))
- SCHED(0.0, MATCH, IDE());
- else QUEUE(IDE(), 0.0);
- break;
-
- case MATCH:
- if (IDE() == MREQ)
- {
- DISPOS();
- find2();
- }
- else find1();
- if (NCEN()) SCHED(0.0, STARTA, IDE());
- break;
-
- case STARTA:
- server--;
- SCHED(RN(10.0, 2.0), ENDACT, IDE());
- break;
-
- case ENDACT:
- DISPOS();
- server++;
- if ((NQ(MAINP)) && (NQ(COVER)))
- CREATE(0.0, MREQ);
- break;
- }
- } while (ecode);
-
- SUMRY("");
- }