100 CLS
110 A$=STRING$(80,205)
120 PRINT A$
130 PRINT TAB(24)"NORMAL DISTRIBUTION  #3003-A"
140 COLOR 23,0,0
150 PRINT :PRINT :PRINT TAB(39)"IPCO"
160 COLOR 7,0,0
170 PRINT :PRINT :PRINT TAB(25)"PERSONAL COMPUTER OWNERS GROUP"
180 PRINT :PRINT :PRINT TAB(19)"p.o. box 10426, pittsburgh, pennsylvania 15234"
190 PRINT A$
200 PRINT :PRINT :PRINT :PRINT :PRINT
210 PRINT TAB(28)"PRESS ANY KEY TO CONTINUE"
220 A$=INKEY$:IF A$="" THEN 220
230 CLS
240 'MASTER-CONTROL ROUTINE
250 CLS
260 PRINT "THIS PROGRAM COMPUTES AREAS UNDER THE NORMAL DISTRIBUTION"
270 PRINT "PROBABILITY CURVE FROM THE MEAN TO A DESIGNATED `Z' VALUE."
280 PRINT "THIS PROGRAM ALSO CAN COMPUTE `Z' VALUES FROM A GIVEN AREA."
290 PRINT
300 PRINT "JUST AS IN MOST STATISTICAL TABLES, ONLY HALF THE CURVE IS "
310 PRINT "CONSIDERED.  Z VALUES MUST BE BETWEEN -4 AND +4 (THESE"
320 PRINT "LIMITS ARE SOMEWHAT ARBITRARY) AND AREA FIGURES MUST BE"
330 PRINT "BETWEEN 0 AND 0.5 (ACTUALLY .49997).  IF OUT-OF-RANGE"
340 PRINT "FIGURES ARE INPUT, THE NEAREST RANGE LIMIT IS ASSUMED"
350 PRINT "INSTEAD."
360 PRINT
370 PRINT "HIT ANY KEY TO START"
380 SELECTION$ = INKEY$ : IF SELECTION$ = "" THEN GOTO 380 `SAME LINE
390 'AREA RESULTS (GIVEN Z) ARE ACCURATE TO THE 5 DISPLAYED DIGITS.
400 'Z VALUES ARE ACCURATE TO 2 DIGITS BASED ON AN INPUT AREA,
410 'OR THE 3 DISPLAYED DIGITS BASED ON THE PROGRAM'S APPROXIMATION
420 'OF THE AREA.
430 '
440 'THIS PRECISION CAN BE CHANGED BY CHANGING THE PRECISION
450 'CONSTANTS IN THE PROGRAM FROM THEIR 0.000001 SETTING.
460 'FOR HIGHER PRECISION, YOU MUGHT ALSO WANT TO CHANGE THE
470 'VARIABLES TO DOUBLE, INSTEAD OF SINGLE, PRECISION FORM.
480 'WITH HIGHER PRECISION, YOU MAY WISH TO CHANGE THE NUMBER
490 'OF DIGITS DISPLAYED, TOO.
500 '
510 'OUT OF RESPECT, PLEASE DO NOT MUTILATE THE STRUCTURED
520 'PROGRAMMING APPROACH THAT MAKES CHANGES SO EASY AND
530 'MAKES THE PROGRAM ALMOST READABLE.  OF COURSE YOU CAN
540 'EASILY USE THE SUBROUTINES IN MORE ELABORATE PROGRAMS.
550 'THIS PROGRAM IS FAIRLY INSIGNIFICANT BY ITSELF.
560 '
570 SELECTION$ = "1" 'INITIALIZATION
580 WHILE (SELECTION$ = "1" OR SELECTION$ = "2")
590 CLS : PRINT STRING$(60,42)
600 PRINT :PRINT  "MENU:"
610 PRINT :PRINT "     <1>  .  .  .  .  .  .  COMPUTE AREA FROM Z"
620 PRINT :PRINT "     <2>  .  .  .  .  .  .  COMPUTE Z VALUE FROM AREA"
630 PRINT :PRINT "     <ANY OTHER KEY>  .  .  EXIT PROGRAM"
640 PRINT :PRINT STRING$(60,45)
650 PRINT :PRINT "HIT ANY KEY IN INDICATED RANGE TO MAKE SELECTION:"
660 SELECTION$ = INKEY$ : IF SELECTION$ = "" THEN GOTO 660 `SAME LINE
670 CLS : PRINT  "THANK YOU"
680 IF 0 = INSTR("12" ,SELECTION$)                                                      THEN : PRINT "I HOPE THE PROGRAM WAS USEFUL TO YOU.  BYE."                             : GOTO 720 'WEND
690 ON INSTR("12",SELECTION$) GOSUB 1020,760
700     'IE:  IF 1, GOSUB COMPUTE-Z-FROM-AREA ROUTINE
710     '     IF 2, GOSUB COMPUTE-AREA-FROM-Z ROUTINE
720 WEND
730 END
740 '
750 '
760 'COMPUTE-Z-FROM-AREA-ROUTINE
770   PRINT  : PRINT  STRING$(80,42) : PRINT
780 QUIT% = 0
790 WHILE NOT QUIT%
800 PRINT "INPUT AREA VALUE FROM WHICH TO COMPUTE FREQUENCY."
810 PRINT "(ENTRIES OVER 5.0 CAUSE RETURN TO MENU.)"
820 INPUT "INPUT AREA VALUE (0 TO 0.49997): ",AREA
830 IF AREA > 5 THEN QUIT% = -1 : GOTO 990 `WEND
840 HI.CALCULATED.AREA = .49997 : HI.Z = 4  '*** AREA < .49997
850 LO.CALCULATED.AREA = 0      : LO.Z = 0  '*** AREA > 0
860 IF AREA >= .49997 THEN CALCULATED.AREA = .49997 : Z = 4                                                  : GOTO 930
870 IF AREA <= 0 THEN CALCULATED.AREA = 0 : Z = 0 : GOTO 930 `PRNT
880 WHILE ABS(CALCULATED.AREA - AREA) > .000001
890         IF AREA > CALCULATED.AREA                                                          THEN LO.CALCULATED.AREA = CALCULATED.AREA : LO.Z = Z                            ELSE HI.CALCULATED.AREA = CALCULATED.AREA : HI.Z = Z
900 Z = (LO.Z +HI.Z) / 2
910 GOSUB 1200 `MCLAUREN-METHOD-AREA-CALCULATION ROUTINE
920 WEND
930 PRINT :PRINT "THE NORMAL-DISTRIBUTION Z-VALUE CORRESPONDING"
940        PRINT "TO A MEAN-TO-Z AREA OF  ";
950        PRINT USING "#.#####"; CALCULATED.AREA;
960        PRINT " IS:   ";
970        PRINT USING "#.###"; Z
980 PRINT :PRINT STRING$(80,42) : PRINT
990 WEND
1000 RETURN
1010 '
1020 'COMPUTE-AREA-FROM-Z ROUTINE
1030 PRINT :PRINT STRING$(80,42) : PRINT
1040 QUIT% = 0
1050 WHILE NOT QUIT%
1060        PRINT "INPUT Z VALUE FROM WHICH TO COMPUTE FREQUENCY."
1070        PRINT "(ENTRIES OVER 5.0 CAUSE RETURN TO MENU.)"
1080 INPUT "INPUT Z VALUE (-4.0 TO +4.0):  ", Z
1090 IF Z >=5 THEN QUIT% = -1 : GOTO 1170  'WEND
1100 IF ABS(Z) >=4 THEN CALCULATED.AREA = .49997 : Z.SGN% = SGN(Z)                                  : Z = 4 :GOTO 1120  'PRINT OUTPUT
1110 GOSUB 1200 'MCLAUREN-METHOD-AREA-CALCULATION ROUTINE
1120 PRINT :PRINT  "THE AREA UNDER THE NORMAL DISTRIBUTION CURVE"
1130         PRINT "FROM THE MEAN TO Z = " Z.SGN%*Z " IS :  ";
1140 PRINT USING "#.#####" ; CALCULATED.AREA
1150 PRINT
1160 PRINT :PRINT STRING$(80,42) :PRINT
1170 WEND
1180 RETURN
1190 '
1200 'MCLAUREN-METHOD-AREA-CALCULATION ROUTINE
1210 '
1220 Z.SGN% = SGN(Z) : Z = ABS(Z) : Z.SQR = Z*Z
1230 CALCULATED.AREA = Z * (1/SQR(2*3.141592654#))
1240 Z.CONSTANT = CALCULATED.AREA
1250 PRECISION.ERROR = 1 : INTERMEDIATE.TERM = 1 : I% = 1
1260 '
1270 WHILE ABS(PRECISION.ERROR) > .000001
1280 INTERMEDIATE.TERM = -(INTERMEDIATE.TERM * Z.SQR) / (2*I%)
1290 PRECISION.ERROR = Z.CONSTANT * (INTERMEDIATE.TERM / (2*I% + 1))
1300 CALCULATED.AREA = CALCULATED.AREA + PRECISION.ERROR
1310 I% =I% +1
1320 WEND
1330 CALCULATED.AREA = CALCULATED.AREA -PRECISION.ERROR
1340 RETURN
LATED.AREA + PRECISION.ERROR
131