home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Guide / c-cplusplus-interactive-guide.iso / c_ref / csource5 / 349_01 / sss.arc / EX_0702.C < prev    next >
Encoding:
C/C++ Source or Header  |  1991-04-10  |  2.6 KB  |  131 lines

  1. /* Program EX_0702.C
  2.    Listing 15C - see documentation in TUTOR.SSS
  3. */
  4.  
  5. #include "SSSC.H"
  6.  
  7. #define  WHITE   1
  8. #define  BLUE    2
  9. #define  RED     3
  10. #define  YELLOW  4
  11.  
  12. #define  MAINP   1
  13. #define  COVER   2
  14. #define  MREQ    3
  15.  
  16. #define  ARRIVL  1
  17. #define  STARTA  2
  18. #define  ENDACT  3
  19. #define  NEXTAC  4
  20. #define  MATCH   5
  21.  
  22. int ecode, server;
  23.  
  24. void prime()
  25. {
  26.   server = 1;
  27.   INIQUE(2, 1, 1);
  28.   SIMEND(150.0);
  29.   CREATE(EX(12.0), MAINP);
  30.   CREATE(EX(12.0), COVER);
  31. }
  32.  
  33. int other()
  34. {
  35.   if (IDE() == MAINP) return(COVER);
  36.   else                return(MAINP);
  37. }
  38.  
  39. void find1()
  40. {
  41.   int i, o;
  42.   i = 1;
  43.   o = other();
  44.   while ((i <= NQ(o)) && (AIQ(o, i, 1) != A(1))) i++;
  45.   if (i <= NQ(o))
  46.   {
  47.     DISPOS();
  48.     REMVFQ(o, i);
  49.     SCHED(0.0, STARTA, IDE());
  50.   } else QUEUE(IDE(), 0.0);
  51. }
  52.  
  53. void find2()
  54. {
  55.   int i, j, found;
  56.   double color;
  57.   found = 0;
  58.   j = 1;
  59.   do
  60.   {
  61.     color = AIQ(MAINP, j, 1);
  62.     i = 1;
  63.     while ((i <= NQ(COVER)) &&
  64.       (AIQ(COVER, i, 1) != color)) i++;
  65.  
  66.     if (i <= NQ(COVER))
  67.     {
  68.       REMVFQ(COVER, i);
  69.       DISPOS();
  70.       REMVFQ(MAINP, j);
  71.       found = 1;
  72.     } else j++;
  73.   } while  ((found == 0) && (j <= NQ(MAINP)));
  74. }
  75.  
  76. main()
  77. {
  78.   prime();
  79.  
  80.   do
  81.   {
  82.     if ((ecode = NEXTEV()) > 0)
  83.     switch(ecode)
  84.     {
  85.  
  86.       case ARRIVL:
  87.                 if (IDE() == MREQ)
  88.                   SCHED(0.0, MATCH, IDE()); else
  89.                 {
  90.                   CREATE(EX(12), IDE());
  91.                   if(RA() < 0.35) SETA(1, WHITE ); else
  92.                   if(RA() < 0.50) SETA(1, BLUE  ); else
  93.                   if(RA() < 0.80) SETA(1, RED   ); else
  94.                                    SETA(1, YELLOW);
  95.                   SCHED(0.0, NEXTAC, IDE());
  96.                 }
  97.                 break;
  98.  
  99.       case NEXTAC:
  100.                 if ((server) && (NQ(other())))
  101.                   SCHED(0.0, MATCH, IDE());
  102.                 else QUEUE(IDE(), 0.0);
  103.                 break;
  104.  
  105.       case MATCH:
  106.                 if (IDE() == MREQ)
  107.                 {
  108.                   DISPOS();
  109.                   find2();
  110.                 }
  111.                 else find1();
  112.                 if (NCEN()) SCHED(0.0, STARTA, IDE());
  113.                 break;
  114.  
  115.       case STARTA:
  116.                 server--;
  117.                 SCHED(RN(10.0, 2.0), ENDACT, IDE());
  118.                 break;
  119.  
  120.       case ENDACT:
  121.                 DISPOS();
  122.                 server++;
  123.                 if ((NQ(MAINP)) && (NQ(COVER)))
  124.                   CREATE(0.0, MREQ);
  125.                 break;
  126.     }
  127.   } while (ecode);
  128.  
  129.   SUMRY("");
  130. }
  131.