100 REM CALCULATOR PROGRAM RICK SATTERTHWAITE 200 DIM S%(101%),A%(200%),X%(99%) 300 INPUT "INSTRUCTIONS";L$:IF LEFT(L$,1%)="N" THEN 3800 ELSE IF LEFT(L$,1%)<>"Y" THEN 300 400 PRINT"THE CALCULATOR WILL FIRST ASK HOW MANY DIGITS YOU" 500 PRINT"WANT TO WORK WITH TO THE LEFT AND RIGHT OF THE" 600 PRINT"DECIMAL POINT. IF THE RESULT EXCEEDS THE FIELD" 700 PRINT"WIDTH , THE DECIMAL POINT WILL BE PUSHED TO THE" 800 PRINT"RIGHT APPROPRIATELY." 900 PRINT:PRINT"ALTHOUGH THE PRACTICAL LIMIT OF THIS ROUTINE IS" 1000 PRINT"100 DIGITS, YOU SHOULD LIMIT THE TOTAL NUMBER OF DIGITS" 1100 PRINT"TO 50 IF YOU WANT ANSWERS PRINTED ON ONE OUTPUT LINE." 1200 PRINT:PRINT"IN RESPONSE TO THE QUESTION MARK PRINTED BY THE" 1300 PRINT"CALCULATOR,YOU SHOULD TYPE AN OPERATOR FOLLOWED BY AN" 1400 PRINT"OPERAND. THE LEGAL ARITHMETIC OPERATORS ARE:":PRINT 1500 PRINT" OPERATION OPERATOR":PRINT 1600 PRINT" ADDITION 'ADD','A','+'" 1700 PRINT" SUBTRACTION 'SUBTRACT','S','-'" 1800 PRINT" MULTIPLICATION 'MULTIPLY','M','*" 1900 PRINT" DIVISION 'DIVIDE','D','/' 2000 PRINT:PRINT"THE FOLLOWING SPECIAL OPERATORS DON'T NEED AN OPERAND:" 2100 PRINT:PRINT" OPERATION OPERATOR":PRINT 2200 PRINT" CLEAR ACCUMULATOR 'CLEAR','C'" 2300 PRINT" RESET FIELD WIDTH 'RESET','R'": PRINT" EXIT FROM PROGRAM 'EXIT','E'" 2400 PRINT:PRINT"MORE THAN ONE OPERATION MAY BE ENTERED IN ONE INPUT" 2500 PRINT"LINE. FOR EXAMPLE, THE FOLLOWING SEQUENCES ALL ADD" 2600 PRINT"5,340 TO THE ACCUMULATOR,MULTIPLY THE RESULT BY 67" 2700 PRINT"AND DIVIDE THAT RESULT BY -34.56.":PRINT 2800 PRINT"EXAMPLE 1 ?ADD 5,340 *67 DIVIDE BY -34.56" 2900 PRINT"EXAMPLE 2 ?+5340 MULTIPLY BY 67/-34.56" 3000 PRINT"EXAMPLE 3 ?5340*67/-34.56" 3100 PRINT:PRINT"NOTE THAT ADDITION IS THE DEFAULT OPERATION, EXTRA" 3200 PRINT"CHARACTERS CAN BE INSERTED IN THE OPERATION AND COMMAS" 3300 PRINT" IN THE OPERAND.":PRINT 3400 PRINT:PRINT"AFTER EACH OPERATION, THE CONTENTS OF THE IMAGINARY" 3500 PRINT"ACCUMULATOR IS PRINTED OUT TO THE RIGHT OF AN " 3600 PRINT"EQUAL SIGN.":PRINT 3700 IF H%=1% THEN H%=0%:PRINT "HERE WE GO AGAIN !!":GO TO 4300 3800 PRINT "TYPE HELP IF YOU NEED IT!!":PRINT:PRINT"CALCULATOR":PRINT 3900 INPUT"DIGITS LEFT OF DECIMAL POINT";D1% 4000 INPUT"DIGITS RIGHT OF DECIMAL POINT";D2% 4100 IF D2%+D1%>100% THEN PRINT "SUM OF THESE NUMBERS CAN7T BE GREATER THAN 100":GO TO 3900 4200 PRINT:PRINT:PRINT 4300 PRINT" ="; 4400 FOR X%=99% TO D2% STEP -1%:IF A%(X%)<>0% THEN 4600 4500 NEXT X% 4600 D1=D1%:D3=X%-D2%+1%:IF D1=0 THEN D1=1 4700 PRINT " "; FOR X1%=1% TO D1%+D2%-X%+INT((D1-1)/3)-INT((D3-1)/3)-2% 4800 IF A%(100%)=1% THEN PRINT "-";ELSE PRINT" "; 4900 FOR X1%=X% TO D2% STEP -1% 5000 PRINT MID(NUM$(A%(X1%)),2%,1%);:X1=X1%:D2=D2% 5100 IF (X1-D2)/3=INT((X1-D2)/3) AND X1<>D2 THEN PRINT ","; 5200 NEXT X1%:PRINT ".";:PRINT MID(NUM$(A%(X%)),2%,1%);FOR X%=D2%-1% TO 0% STEP -1% 5300 PRINT:IF R%=0% THEN 5500 ELSE R%=0% 5400 A$=RIGHT(A$,2%) UNTIL LEFT(A$,1%)<>" " OR LEN(A$)=2%:GO TO 5600 5500 INPUT LINE A$:IF LEN(A$)=2% THEN 5500 5600 I$=LEFT(A$,1%):IF I$<>"C" THEN 5700 ELSE A%(X%)=0% FOR X%=0% TO 200%:GO TO 4300 5700 IF I$<>"R" THEN 5800ELSE A%(X%)=0% FOR X%=0% TO 200%:GO TO 3900 5800 IF I$<>"H" THEN 5900 ELSE H%=1%: GO TO 1200 5900 IF I$<>"A" AND I$<>"+" THEN 6000 ELSE O%=0%:GO TO 6700 6000 IF I$<>"S" AND I$<>"-" THEN 6100 ELSE O%=1%: GO TO 6700 6100 IF I$<>"M" AND I$<>"*" THEN 6200 ELSE O%=2%:GO TO 6700 6200 IF I$<>"D" AND I$<>"/" THEN 6300 ELSE O%=3%:GO TO 6700 6300 IF ASCII(I$)>47% AND ASCII(I$)<58% THEN O%=0%: S%(100%),S%(101%)=0%:Q%=1%:GO TO 6800 6400 IF I$="." THEN I$="0":GO TO 6300 6500 IF I$="E" THEN 13000 6600 PRINT "ILL CMD!": R1%=0%:GO TO 5500 6700 S%(100%),S%(101%)=0%:Q%=1%:A$=MID(A$,2%,LEN(A$)-1%) 6800 Q%=Q%+1% UNTIL MID(A$,Q%,1%)="-" OR MID(A$,Q%,1%)="." OR(ASCII( MID(A$,Q%,1%))<58% AND ASCII(MID(A$,Q%,1%))>47%) OR Q%>100% 6900 IFQ%=101% THEN 5500 7000 IF MID(A$,Q%,1%)<>"-" THEN 7100 ELSE Q%=Q%+1%:S%(100%)=1% 7100 IF MID(A$,Q%,1%)<>"." THEN 7200 ELSE D3%=1%:P1%=D2%-1%: S9%=99%:Q%=Q%+1%:GO TO 7300 7200 P1%=99%:D3%=0% 7300 IF P1%<0% THEN Q%=Q%+1%:GO TO 7600 7400 IF P1%47% THEN 7300 7700 IF MID(A$,Q%,1%)<>"," THEN 7800 ELSE Q%=Q%+1%:GO TO 7600 7800 IF D3%=1% THEN 8100 ELSE IF MID(A$,Q%,1%)="." THEN D3%=1%: S9%=P1%:P1%=D2%-1%:Q%=Q%+1%:GO TO 7600 7900 S%(D2%+X1%-1%)=S%(P1%+X1%) FOR X1%=1% TO 99%-P1% 8000 Z%=100%-P1%+D2%:P1%=D2%-1%:GO TO 8300 8100 S%(D2%+X1%-1%)=S%(S9%+X1%) FOR X1%=1% TO 99%-S9% 8200 Z%=100%-S9%+D2% 8300 S%(X1%)=0% FOR X1%=Z%-1% TO 99% 8400 S%(X1%)=0% FOR X1%=0% TO P1% 8500 IF Q%>=LEN(A$) THEN R1%=0% ELSE R1%=1%!MULTI OP OP 8600 A$=RIGHT(A$,Q%):IF LEN(A$)>2% THEN R%=1% ELSE R%=0% 8700 S%(101%)=Z%-1%:ON O%+1% GO TO 8800,9900,10200,11300 8800 IF A%(100%)=S%(100%) THEN 9700 ELSE X%=99% 8900 X%=X%-1% WHILE A%(X%)=S%(X%) AND X%>0% 9000 IF A%(X%)>= S%(X%) THEN 9200 ELSE A%(100%)=1% 9100 FOR X%=0% TO 100%:Z1%=A%(X%):A%(X%)=S%(X%):S%(X%)=Z1%:NEXT X% 9200 FOR X%=0% TO 98% 9300 IF A%(X%)0% 10600 IF Y%=0% AND X%(Y%)=0% THEN 4300 10700 FOR X1%=0% TO S%(101%)-1%:IF S%(X1%)=0% THEN 11000 10800 FOR Y1%=0% TO Y%:IF X%(Y1%)=0% THEN 10900 ELSE Z%=X1%+Y1%:P%=S%(X1%)*X%(Y1%):FOR I%=Z% TO 199%: IF P%=0% AND Y%+Z%0%:IF X%=0% THEN 4300 11400 FOR X1%=0% TO X% 11500 A%(X1%+199%-X%)=A%(X1%):A%(X1%)=0%:NEXT X1%:IF A%(100%)= S%(100%) THEN A%(100%)=0% ELSE A%(100%)=1% 11600 Y%=0%:Y%=Y%+1% WHILE S%(Y%)=0% AND Y%<>99% 11700 IF Y%=99% THEN PRINT "DIVISION BY ZERO--TYPE'CLEAR'":GO TO 5500 11800 Z%=99%:Z%=Z%-1% WHILE S%(Z%)=0% 11900 FOR Z1%=0% TO 99% 12000 Z2%=99%:Z2%=Z2%-1% WHILE A%(100%+Z2%)=S%(Z%+Z1%+Z2%-99%) AND Z2%<>0% AND Z%+Z1%+Z2%<>99% 12100 IF A%(Z2%+100%)=0% THEN T%=199%:T%=T%-1% UNTIL A%(T%)<>0% OR T%=100%:IF T%=100% THEN 4300 12200 IF A%(Z2%+100%)Z%+1% THEN 12700 12400 IF A%(Z4%)