9004 REM ****CPATH****BUSINESS PROGRAM 9006 REM CPATH********VERSION #1 (7/31/69)****CRITICAL PATH 9008 PRINT "* CRITICAL PATH *" 9010 PRINT 9012 DIM N(75),E(75),L(75),P(150),S(150),T(150),R(150) 9014 DIM I$(1) 9016 DIM J$(1) 9018 REM N(I) IS THE NUMBER OF EVENT I 9020 REM E(I) IS THE EARLIEST TIME FOR EVENT I 9022 REM L(I) IS THE LATEST TIME FOR EVENT I 9024 REM N1 IS THE NUMBER OF EVENTS 9026 REM P(I) IS THEEVENT PRECEEDING ACTIVITY I 9028 REM I) IS THE NUMBER OF THE EVENT SUCEEDING ACTIVITY I 9030 REM T(I) IS THE TIME TO COMPLETE ACTIVITY I 9032 REM R(I) IS THE NUMBER OF THE ITH RANKED ACTIVITY 9034 REM N2 IS THE NUMBER OF ACTIVITIES 9036 REM C IS THE MINIMUM TIME TO COMPLETE THE PROJECT 9038 PRINT "DO YOU WISH TO ENTER DATA FROM THE TELETYPE AS IT BECOMES NECESSARY," 9040 PRINT "OR TO ENTER IT INTERNALLY WITH 'DATA'-STATEMENTS? (ENTER 'T' FOR" 9042 PRINT "TELETYPE, 'D' OTHERWISE)"; 9044 INPUT I$ 9046 F I$="T" THEN 9110 9048 PRINT "HAS THE DATA ALREADY BEEN ENTERED? ('Y' FOR YES, 'N' FOR NO.)"; 9050 INPUT J$ 9052 IF J$="Y" THEN 9112 9054 PRINT "ENTER DATA STARTING IN LINE 9900. FOR FORMAT SPECIFICATIONS " 9056 PRINT "TYPE 'LIST-9436'. PROGRAM WILL HAVE TO BE RE-STARTED." 9058 STOP 9060 REM READ ACTIVITIES 9062 GOSUB 9152 9064 REM RANK ACTIVITIES ON ASCENDING PREDECESSOR NUMBER 9066 LET N5=0 9068 GOSUB 9194 9070 REM FIND EARLY EVENT TIMES 9072 GUB 9236 9074 REM FIND LATE EVENT TIMES 9076 GOSUB 9274 9078 REM PRINT EVENT TIMES 9080 GOSUB 9316 9082 REM PRINT ACTIVITY TIMES 9084 GOSUB 9348 9086 REM RETURN TO READ A NEW PROBLEM 9088 PRINT 9090 PRINT 9092 PRINT "*****************************************************************" 9094 PRINT 9096 PRINT 9098 PRINT "DO YOU HAVE ANOTHER PROBLEM? ('Y' FOR YES, 'N' FOR NO)"; 9100 INPUT I$ 9102 IF I$="N" THEN 9999 9104 PRINT 9106 GO 9038 9108 MAT N=ZER 9110 REM SUBROUTINE TO READ EVENT NUMBERS 9111 LET A=0 9112 PRINT 9114 IF I$="D" THEN 9122 9116 PRINT "HOW MANY EVENTS DO YOU HAVE"; 9118 INPUT N1 9120 GOTO 9124 9122 READ N1 9124 IF N1 <= 75 THEN 9132 9126 PRINT "SORRY, I CAN ONLY HANDLE 75 EVENTS. TRY A VALUE < 75." 9128 IF I$="D" THEN 9058 9130 GOTO 9118 9132 FOR I=1 TO N1 9134 LET E(I)=0 9136 LET L(I)=0 9138 IF I$="T" THEN 9144 9140 READ N(I) 9142 GOT9148 9144 GOTO 9394 9146 INPUT N(I) 9148 NEXT I 9150 GOTO 9060 9152 LET A=0 9154 PRINT 9156 REM SUBROUTINE TO READ ACTIVITIES 9158 IF I$="D" THEN 9166 9160 PRINT "HOW MANY ACTIVITIES DO YOU HAVE"; 9162 INPUT N2 9164 GOTO 9168 9166 READ N2 9168 IF N2 <= 150 THEN 9176 9170 PRINT "SORRY, I CAN ONLY HANDLE 150 ACTIVITIES. TRY A VALUE < 150." 9172 IF I$="D" THEN 9058 9174 GOTO 9162 9176 FOR I=1 TO N2 9178 IF I$="D" THEN 9186 9180 TO 9414 9182 INPUT P(I),S(I),T(I) 9184 GOTO 9188 9186 READ P(I),S(I),T(I) 9188 NEXT I 9190 LET A=0 9192 RETURN 9194 REM SUBROUTINE TO ASSIGN RANKS TO ACTIVITIES 9196 REM IF N5 = 0, RANK ON ASCENDING ORDER OF PREDECESSOR 9198 REM IF N5 = 1, RANK ON DESCENDING ORDER OF SUCCESSOR 9200 FOR I=1 TO N2 9202 LET R(I)=I 9204 NEXT I 9206 LET N9=N2 9208 LET N9=N9-1 9210 LET N8=0 9212 FOR I=1 TO N9 9214 IF N5=1 THEN 9220 9216 IF P(R(I)) <= P(1+I)) THEN 9230 9218 GOTO 9222 9220 IF S(R(I)) >= S(R(I+1)) THEN 9230 9222 LET R1=R(I) 9224 LET R(I)=R(I+1) 9226 LET R(I+1)=R1 9228 LET N8=1 9230 NEXT I 9232 IF N8=1 THEN 9208 9234 RETURN 9236 REM SUBROUTINE TO FIND EARLY EVENT TIMES 9238 FOR I=1 TO N2 9240 LET N3=P(R(I)) 9242 GOSUB 9260 9244 LET I1=K 9246 LET N3=S(R(I)) 9248 GOSUB 9260 9250 LET I2=K 9252 IF E(I2) >= E(I1)+T(R(I)) THEN 9256 9254 LET E(I2)=E(I1)+T(R(I)) 9256 EXT I 9258 RETURN 9260 REM SUBROUTINE TO FIND INTERNAL NUMBER (I) OF EVENT N3 9262 FOR K=1 TO N1 9264 IF N(K)=N3 THEN 9272 9266 NEXT K 9268 PRINT "SORRY, YOU DIDNT TELL ME ABOUT EVENT",N3 9270 STOP 9272 RETURN 9274 REM SUBROUTINE TO FIND LATE EVENT TIMES 9276 REM RANK ACTIVITIES IN DESCENDING ORDER OF SUCCESSORS 9278 LET N5=1 9280 GOSUB 9194 9282 FOR I=1 TO N2 9284 LET N3=S(R(I)) 9286 GOSUB 9260 9288 LET I1=K 9290 LET N3=P(R(I)) 92 GOSUB 9260 9294 LET I2=K 9296 IF L(I2) >= L(I1)+T(R(I)) THEN 9300 9298 LET L(I2)=L(I1)+T(R(I)) 9300 NEXT I 9302 LET N3=S(R(1)) 9304 GOSUB 9260 9306 LET C=E(K) 9308 FOR I=1 TO N1 9310 LET L(I)=C-L(I) 9312 NEXT I 9314 RETURN 9316 PRINT 9318 PRINT 9320 PRINT "****************************************************************" 9322 REM SUBROUTINE TO PRINT EVENT TIMES 9324 PRINT 9326 PRINT " ","*** EVENT TIMES ***" 9328 PRINT 30 PRINT " EVENT ","EARLIEST TIME","LATEST TIME" 9332 PRINT 9334 FOR I=1 TO N1 9336 IF ABS(E(I)-L(I)) <= .0001 THEN 9342 9338 PRINT N(I),E(I),L(I) 9340 GOTO 9344 9342 PRINT N(I),E(I),L(I),"CRITICAL PATH" 9344 NEXT I 9346 RETURN 9348 PRINT 9350 PRINT "----------" 9352 PRINT 9354 PRINT " ","*** ACTIVITY TIMES ***" 9356 PRINT 9358 PRINT "PREDECESSOR","SUCCESSOR","ACTUAL TIME","MAXIMUM TIME" 9360 PRINT 9362 FOR I=1 TO N2 9364 LET NP(I) 9366 GOSUB 9260 9368 LET I1=K 9370 LET N3=S(I) 9372 GOSUB 9260 9374 LET I2=K 9376 LET D=L(I2)-E(I1) 9378 IF ABS(T(I)-D) <= .0001 THEN 9384 9380 PRINT P(I),S(I),T(I),D 9382 GOTO 9386 9384 PRINT P(I),S(I),T(I),D;TAB(59);"CRITICAL PATH" 9386 NEXT I 9388 RETURN 9390 REM TEST DATA FOR BCP 9394 IF A=1 THEN 9404 9396 IF A=2 THEN 9410 9398 LET A=1 9400 PRINT "ENTER THE ID NUMBER OF THE FIRST EVENT"; 9402 GOTO 9146 9404 LET A=2 06 PRINT "THE ID NUMBER OF THE NEXT EVENT"; 9408 GOTO 9146 9410 PRINT "NEXT"; 9412 GOTO 9146 9414 IF A=1 THEN 9426 9416 IF A=2 THEN 9432 9418 LET A=1 9420 PRINT "FOR THE FIRST ACTIVITY, ENTER THE NUMBER OF THE EVENT PRECEEDING IT," 9422 PRINT "THE NUMBER OF THE EVENT SUCCEEDING IT, AND THE TIME OF THE ACTIVITY." 9424 GOTO 9182 9426 LET A=2 9428 PRINT "FOR THE NEXT ACTIVITY"; 9430 GOTO 9182 9432 PRINT "NEXT"; 9434 GOTO 9182 9436 REM DATA NO. EVENTS, LIST OF ID NOS. OF EVENTS (FOR CLARITY 9438 REM LIST EVENTS IN NUMERICAL ORDER, SMALLEST FIRST.) 9440 REM DATA NO. OF ACTIVITIES, LIST OF (FOR EACH ACTIVITY) THE ID 9442 REM NUMBER OF THE EVENT PRECEEDING IT, THE ID OF THE EVENT 9444 REM SUCCEEDING IT, AND THE TIME NECESSARY TO COMPLETE IT. 9446 REM 9448 REM EXAMPLE: 9450 REM 9900 DATA 5,1,2,3,4,5 9452 REM 9901 DATA 3,1,3,2,2,4,3,3,5,4 9999 END