home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / INFO / C / CPM2.ZIP / CPM2.C
Encoding:
C/C++ Source or Header  |  1988-04-19  |  6.1 KB  |  255 lines

  1. /*-------------------------------------------------------------------*/
  2. /*                                                                   */
  3. /*  Critical Path Method Project Scheduler - 18 Sept 83 - E. Dong    */
  4. /*  Based on BASIC version, "Hard Hat Management: Two On-Site        */
  5. /*  Tools", by Richard Parry, INTERFACE AGE, February, 1981.         */
  6. /*                                                                   */
  7. /*  Translated into CIC86 "C" by Edward V. Dong                      */
  8. /*                                                                   */
  9. /*  Modifications: (1) No PERT option.                               */
  10. /*                 (2) Added GANTT chart output.                     */
  11. /*                 (3) Allow naming of activities.                   */
  12. /*                                                                   */
  13. /*  Updated 30 Sept 83  - Fix Gantt chart output.                    */
  14. /*                                                                   */
  15. /*-------------------------------------------------------------------*/
  16.  
  17. #include "stdio.h"
  18. #define  BEGIN  {
  19. #define  END    }
  20. #define  SIZE   100
  21.  
  22. int i, j, k, m, num;                    /* Internal Integer Parms    */
  23.  
  24. int c1, c2, du, l1, m1, m2, pl;
  25.  
  26. int ml[SIZE], mo[SIZE], mp[SIZE], cp[SIZE], me[SIZE], sd[SIZE], ic[20];
  27. int s[SIZE], f[SIZE], d[SIZE], e[SIZE], l[SIZE], f1[SIZE];
  28.  
  29. char jobname[SIZE][9];                /* Job names */
  30.  
  31. main()
  32.  
  33. BEGIN
  34. printf("CPM: Project Scheduler\n\n");        /* identify program */
  35.  
  36. /* initialize variables */
  37. c1 = 0; c2 = 0; du = 0; m1 = 0; m2 = 0; pl = 0;
  38.  
  39. printf("Enter number of activities: ");        /* get # of activities*/
  40. scanf("%d",&num);
  41.  
  42. for (i=1; i<num+1; i++)                /* input routine */
  43.     BEGIN
  44.     printf("Activity %d\n",i);
  45.     getdata();
  46.     printf("\n");
  47.     END
  48.  
  49. printf("\n--> SORTING IN PROGRESS <--\n");    /* call sort routine */
  50. sort();
  51.  
  52. printf("Activity #\tName\t");                  /* display sort */
  53. printf("From\tTo\tDuration\n");            /* display sort */
  54. for (i=1; i<num+1; i++)
  55.     BEGIN
  56.     printf("%d\t\t%s\t%d\t%d\t%d\n",i,jobname[i],s[i],f[i],d[i]);
  57.     END
  58.  
  59. cpm();                 /* do critical path analysis */
  60. c2 = 0;
  61. printf("\nCP Analysis is:\n");
  62. printf("[EST   = Earliest Starting Time]\n");
  63. printf("[LFT   = Latest  Finishing Time]\n");
  64. printf("[FLOAT = Float  or  Slack  Time]\n");
  65. printf("Name\tFrom\tTo\tEST\tLFT\tFLOAT\n");
  66. for (i=1; i<num+1; i++)
  67.     BEGIN
  68.     printf("%s\t",jobname[i]);
  69.     printf("%d\t%d\t%d\t%d\t%d\n",s[i],f[i],e[s[i]],l[f[i]],f1[i]);
  70.     END
  71. printf("\nThe Critical Path Length is %d\n",pl);
  72. printf("\nThe Critical Path is:\nName\tFrom\tTo\n");
  73. i=1; while (f1[i] != 0) i++;    /* locate start of critical path */
  74. cplout();            /* critical path printout */
  75. gantt();            /* display GANTT chart */
  76. END
  77.  
  78. /* Sort Data Subroutine, Using Start Node as Key */
  79. sort()
  80. BEGIN
  81. int sw, temp;
  82. sw = 0;
  83. for (i=1; i<num; i++)
  84.     BEGIN
  85.     j = i + 1;
  86.     if (s[i] > s[j])
  87.         BEGIN
  88.         temp = s[i]; s[i] = s[j]; s[j] = temp;
  89.         temp = f[i]; f[i] = f[j]; f[j] = temp;
  90.         temp = d[i]; d[i] = d[j]; d[j] = temp;
  91.         sw = 1;
  92.         END
  93.     END
  94. if (sw==1) sort();    /* sort again if needed */
  95. END
  96.  
  97. cpm()
  98. BEGIN
  99. printf("--> CPM ANALYSIS IN PROGRESS <--\n");
  100.  
  101. /* compute earliest starting time */
  102. c1 = 0; c2 = 0; pl = 0;
  103. for (i=1; i<num+1; i++)
  104.     BEGIN
  105.     m1 = e[s[i]] + d[i];
  106.     if (e[f[i]] <= m1) e[f[i]] = m1;
  107.     END
  108.  
  109. /* compute latest finishing time */
  110. l[f[num]] = e[f[num]];
  111. for (i=num; i>0; i--)
  112.     BEGIN
  113.     l1 = s[i]; m2 = l[f[i]] - d[i];
  114.     if ((l[l1] >= m2) || (l[l1] == 0))
  115.         l[l1] = m2;
  116.     END
  117.  
  118. /* compute float time */
  119. for (i=1; i<num+1; i++)
  120.     BEGIN
  121.     f1[i] = l[f[i]] - e[s[i]] - d[i];
  122.     if (f1[i] == 0) c1 = c1 + 1;
  123.     END
  124.  
  125. /* compute critical path length */
  126. for (i=1; i<num+1; i++)
  127.     BEGIN
  128.     if (l[f[i]] > pl) pl = l[f[i]];
  129.     END
  130.  
  131. /* compute critical path */
  132. i = 0;
  133. while (f[i] != 0) i++;
  134. cpm_test:
  135.     c2 = c2 + 1; cp[i] = cp[i] + 1;
  136.     if (i > num) goto cpm_exit;
  137. for (m=1; m<num+1; m++)
  138.     BEGIN
  139.     if (s[m] != f[i]) continue;
  140.     else if (f1[m] != 0) continue;
  141.         else
  142.             BEGIN
  143.             i=m;
  144.             goto cpm_test;
  145.             END
  146.     END
  147. cpm_exit:
  148.     if (c1 != c2) du = du + 1;
  149. END
  150.  
  151. /* Input Data Subroutine */
  152. getdata()
  153. BEGIN
  154.     int temp;
  155.     printf("Jobname:\t\t");    scanf("%s",jobname[i]);
  156.     printf("From:\t\t");     scanf("%d",&temp); s[i] = temp;
  157.     printf("To:\t\t");     scanf("%d",&temp); f[i] = temp;
  158.     printf("Duration:\t");     scanf("%d",&temp); d[i] = temp;
  159.     while (f[i] > num)
  160.         BEGIN
  161.         printf("*** End Node # %d ",f[i]);
  162.         printf("Not =< # (%d) of Activities ***\n",num);
  163.         printf("To: ");
  164.         scanf("%d",f[i]);
  165.         END
  166.     if (s[i] >= f[i])
  167.         BEGIN
  168.         printf("*** Start Node (%d)",s[i]);
  169.         printf("Must Be < End Node (%d) ***\n",f[i]);
  170.         printf("\n*** Redo Entry ***\n");
  171.         getdata();
  172.         END
  173. END
  174.  
  175. /* critical path printout */
  176. cplout()
  177. BEGIN
  178. int iname, jname;
  179.  
  180. iname = s[i];
  181. jname = f[i];
  182. printf("%s\t%d\t%d\n",jobname[i],iname,jname);
  183. c2 = c2 + 1;
  184. if (i<=num)
  185.     BEGIN
  186.     for (m=1; m<num+1; m++)
  187.         BEGIN
  188.         if ((s[m]==f[i]) && (f1[m]==0))
  189.             BEGIN
  190.             i = m;
  191.             cplout();
  192.             END
  193.         END
  194.     END
  195. if (c1 != c2) printf("There is more than one critical path.\n");
  196. END
  197.  
  198. /* generate GANTT chart */
  199. gantt()
  200. BEGIN
  201.  
  202. float linelen, scale, xtemp;
  203. int limit, incrm, step;
  204. char newpg, symbol;
  205.  
  206. printf("%cGANTT Chart for Project:\n\n",newpg);
  207. printf("Non-critical path is denoted as ==\n");
  208. printf("    Critical path is denoted as **\n\n");
  209.  
  210. /* calculate chart scaling */
  211. linelen = 60.0;
  212. scale = linelen/pl;
  213. incrm = scale;
  214. step=1;
  215. while (incrm < 1)
  216.     BEGIN
  217.     limit = 10.0 * scale;
  218.     step = 60 / limit;
  219.     incrm = limit;
  220.     END
  221.  
  222. /* generate ruler line for chart */
  223. printf("               0");
  224. for (j=0; j<pl+step; j=j+step)
  225.     BEGIN
  226.     for (k=0; k<incrm; k++)
  227.         BEGIN
  228.         printf("-");
  229.         END
  230.     printf("+");
  231.     END
  232. printf("\n");
  233.  
  234. /* generate GANTT waterfall */
  235. for (j=1; j<num+1; j++)
  236.     BEGIN
  237.     printf("%8s\t",jobname[j]);
  238.     xtemp = e[s[j]] * scale;
  239.     limit = (xtemp + 0.5);
  240.     for (k=0; k<limit; k++)
  241.         BEGIN
  242.         printf(" ");
  243.         END
  244.     if (f1[j]==0) symbol = '*';
  245.         else  symbol = '=';
  246.     xtemp = l[f[j]] * scale - xtemp;
  247.     limit = (xtemp + 0.5);
  248.     for (k=0; k<limit; k++)
  249.         BEGIN
  250.         printf("%c",symbol);
  251.         END
  252.     printf("\n");
  253.     END
  254. END
  255.