1 REM TACKER: jovan (Jovan Trujillo) 2 REM DATE: 09-Aug-16 16:40:51 3 REM CHECKED: TurboBasic 100 REM *** PROGRAM PJFRAME *** 105 REM AUTHOR: 110 REM DAVID K. BROWN 112 REM DEPARTMENT OF MECHANICAL ENGINEERING 113 REM UNIVERSITY OF GLASGOW 120 REM SCOTLAND 125 REM 130 REM March 2015 135 REM (VERSION 3/10/15) 140 REM ** THE PROGRAM WILL ANALYSE PLANE 141 REM FRAME/TRUSS PROBLEMS WITH UP TO 142 REM 40 NODES AND 40 MEMBERS. ** 145 REM 146 REM ** LOADING IS APPLIED THROUGH COORDINATE 147 REM NODAL FORCES AND 4 TYPES OF DISPLACEMENT 148 REM BOUNDARY CONDITIONS ARE ALLOWED. ** 149 REM 150 REM ** DATA INPUT IS FROM THE USER VIA THE KEYBOARD 151 REM (IN RESPONSE TO PROMPTS APPEARING ON THE SCREEN). ** 153 REM 155 REM ** OUTPUT IS SEND DIRECT TO THE PRINTER AND CONSISTS OF: 156 REM NODAL DISPLACEMENTS AND FORCES; 157 REM MEMBER FORCES, STRESSES AND ELONGATIONS. ** 160 REM 170 REM 220 PN$ = "PJFRAME" 225 GOSUB 50140 : REM CLEARSCREEN 230 MX = 40 : REM MAX # OF MEMBERS 240 NX = 40 : REM MAX # OF NODES 245 NF = 2*NX : REM MAX # OF DEGREES OF FREEDOM 260 DIM NI(MX),NJ(MX),A(MX),E(MX) 270 DIM P(NF),PO(NF+2) 280 DIM X(NX),Y(NX),KODE(NX) 290 DIM KS(NF,NF),KH(NF,NF) 300 DIM PH(NF),F(NF),SP$(NX) 310 IR = 0 320 FOR I = 1 TO NF : PO(I) = 0 : P(I) = 0 : PH(I) = 0 : F(I) = 0 : NEXT I 330 FOR I = 1 TO NF 340 FOR J = 1 TO NF 350 KH(I,J) = 0 : KS(I,J) = 0 360 NEXT J 370 NEXT I 380 IF IR = 1 THEN 600 390 REM ** DATA IS NOW REQUESTED 400 TM$ = "TOO MANY " : MA$ = " MAXIMUM ALLOWED = " 410 PRINT "HOW MANY MEMBERS IN THE STRUCTURE "; : INPUT NM 420 IF NM > MX THEN PRINT TM$;"MEMBERS,";MA$;MX : GOTO 410 430 PRINT "HOW MANY NODES "; : INPUT NN 440 IF NN > NX THEN PRINT TM$;"NODES,";MA$;NX : GOTO 430 450 PRINT : PRINT 460 PRINT " NODAL DATA IS REQUIRED" : PRINT 470 PRINT " NODE NUMBER "; : INPUT I 480 IF I < 1 OR I > NN THEN PRINT "INVALID NODE NUMBER " : GOTO 470 490 PRINT "TYPE IN KODE (SEE SHEET) "; : INPUT KODE(I) 500 IF KODE(I) < 1 OR KODE(I) > 4 THEN PRINT "INVALID KODE " : GOTO 490 510 PRINT "X,Y COORDS OF NODE";I;" "; : INPUT X(I),Y(I) 520 PRINT 530 PRINT "APPLIED X,Y FORCES " 540 PRINT " AT NODE";I;" "; 550 INPUT PO(2*I-1),PO(2*I) : PRINT 560 PRINT "ANY MORE NODES OR CORRECTIONS [Y/N] "; 570 INPUT AN$ : L1$ = LEFT$(AN$,1) 580 IF L1$ = "Y" OR L1$ = "y" THEN GOTO 470 590 IF L1$ <> "N" AND L1$ <> "n" THEN GOTO 560 600 PRINT "DO YOU WISH A PRINT-OUT OF THE NODAL DATA [Y/N] "; 610 INPUT AN$ : L1$ = LEFT$(AN$,1) 620 IF L1$ = "N" OR L1$ = "n" THEN GOTO 800 630 IF L1$ <> "Y" AND L1$ <> "y" THEN GOTO 600 640 GOSUB 60120 : REM OPEN PRINTER CHANNEL 650 P$ = " **** PROGRAM " + PN$ + " ****" 660 GOSUB 60000 : IP = 2 : GOSUB 60060 670 P$ = " N KODE X Y" 680 P$ = " " + P$ 690 P$ = P$ + " PX PY" : GOSUB 60000 700 FW = 12 : NS = 3 710 FOR I = 1 TO NN 720 XA = I : GOSUB 30000 : P$ = XA$ 730 XA = KODE(I) : GOSUB 30000 : P$ = P$ + XA$ 740 XS = X(I) : GOSUB 10040 : P$ = P$ + XS$ 750 XS = Y(I) : GOSUB 10040 : P$ = P$ + XS$ 760 XS = PO(2*I - 1) : GOSUB 10040 : P$ = P$ + XS$ 770 XS = PO(2*I) : GOSUB 10040 : P$ = P$ + XS$ : GOSUB 60000 780 NEXT I 790 GOSUB 60130 : REM CLOSE PRINTER CHANNEL 800 PRINT "DO YOU WISH TO CORRECT THE DATA [Y/N] "; 810 INPUT AN$ : L1$ = LEFT$(AN$,1) 820 IF L1$ = "Y" OR L1$ = "y" THEN GOTO 460 830 IF L1$ <> "N" AND L1$ <> "n" THEN GOTO 800 840 IF IR = 1 THEN GOTO 970 850 N = 2*NN 860 GOSUB 50140 870 PRINT " MEMBER DATA IS REQUIRED" 880 PRINT : PRINT : PRINT "INPUT THE MEMBER #,& THE I,J OF ITS END NODES"; 890 INPUT L, NI(L), NJ(L) 900 IF L < 1 OR L > NM THEN PRINT "INVALID MEMBER NUMBER" : GOTO 880 910 PRINT "INPUT THE AREA AND ELASTIC MODULUS OF THE MEMBER "; 920 INPUT A(L), E(L) 930 PRINT : PRINT "ANY MORE MEMBERS OR CORRECTIONS [Y/N] "; 940 INPUT AN$ : L1$=LEFT$(AN$,1) 950 IF L1$ = "Y" OR L1$ = "y" THEN GOTO 880 960 IF L1$ <> "N" AND L1$ <> "n" THEN GOTO 930 970 PRINT "DO YOU WISH A PRINT-OUT OF MEMBER DATA [Y/N] "; 980 INPUT AN$ : L1$ = LEFT$(AN$,1) 990 IF L1$ = "N" OR L1$ = "n" THEN GOTO 1120 1000 IF L1$ <> "Y" AND L1$ <> "y" THEN GOTO 970 1010 GOSUB 60120 : REM OPEN PRINTER CHANNEL 1020 GOSUB 60040 1030 P$ = " M NI NJ AREA E" : GOSUB 60000 1040 FOR L = 1 TO NM 1050 XA = L : GOSUB 30000 : P$ = XA$ + " " 1060 XA = NI(L) : GOSUB 30000 : P$ = P$ + XA$ + " " 1070 XA = NJ(L) : GOSUB 30000 : P$ = P$ + XA$ + " " 1080 XS = A(L) : GOSUB 10000 : P$ = P$ + XS$ 1090 XS = E(L) : GOSUB 10000 : P$ = P$ + XS$ : GOSUB 60000 1100 NEXT L 1110 GOSUB 60130 : REM CLOSE PRINTER CHANNEL 1120 PRINT "DO YOU WISH TO CORRECT THE DATA [Y/N] "; 1130 INPUT AN$ : L1$ = LEFT$(AN$,1) 1140 IF L1$ = "Y" OR L1$ = "y" THEN GOTO 880 1150 IF L1$ <> "N" AND L1$ <> "n" THEN GOTO 1120 1160 GOSUB 50140 : PRINT " PROGRAM " + PN$ + " IS NOW RUNNING ....." 1170 FOR I = 1 TO 5 : PRINT : NEXT I 1180 REM ** SCAN THROUGH ALL MEMBERS DETERMINING 1190 REM ALL THEIR STIFFNESS COEFFICIENTS AND 1200 REM LODGING THEM IN THE UNCONDENSED 1210 REM GLOBAL STIFFNESS MATRIX [KS]. ** 1220 REM 1230 L1 = 0 1240 L = 0 1250 L = L + 1 1260 II = NI(L) 1270 JJ = NJ(L) 1280 K = 2*NJ(L) 1290 M = 2*NI(L) 1300 GOTO 3390 1310 Z = -1 1320 J = 1 1330 ON J GOTO 1440,1370,1400,1340,1500 1340 Z = 1 1350 K = 2*NJ(L) 1360 GOTO 1440 1370 Z = 1 1380 K = 2*NI(L) 1390 GOTO 1440 1400 Z = -1 1410 M = 2*NJ(L) 1420 REM ** LOCATE STIFFNESS COEFFICIENTS 1430 REM INTO STIFFNESS MATRIX. 1440 KS(K-1,M-1)=KS(K-1,M-1)+Z*CL*CL*E(L)*A(L)/DL 1450 KS(K-1,M)=KS(K-1,M)+Z*CM*CL*E(L)*A(L)/DL 1460 KS(K,M-1)=KS(K,M-1)+Z*CM*CL*E(L)*A(L)/DL 1470 KS(K,M) = KS(K,M) + Z*CM*CM*E(L)*A(L)/DL 1480 J = J + 1 1490 GOTO 1330 1500 IF L - NM >= 0 THEN GOTO 1540 1510 IF L - NM < 0 THEN GOTO 1250 1520 REM ** HOLD UNCONDENSED LOAD VECTOR [P] IN [PH], 1530 REM HOLD UNCONDENSED STIFFNESS MATRIX [KS] IN [KH]. ** 1540 FOR I = 1 TO N 1550 P(I) = PO(I) 1560 PH(I) = P(I) 1570 NEXT I 1580 FOR I = 1 TO N 1590 FOR J = 1 TO N 1600 KH(I,J) = KS(I,J) 1610 NEXT J 1620 NEXT I 1630 REM ** USING KODE AT EACH NODE, 1640 REM PROGRESSIVELY CONDENSE THE 1650 REM STIFFNESS MATRIX [KS] AND HOLD 1660 REM FINALLY IN [KS]; SIMILARLY 1670 REM CONDENSE [P] INTO [P]. ** 1680 MZ = 1 1690 FOR IJ = 1 TO NN : REM&987654321 THIS LOOP ENDS AT REM&123456789 1700 ON KODE(IJ) GOTO 2030,1890,1750,1720 1710 PRINT "KODE(";IJ;") WRONG" : GOTO 3640 1720 MZ = MZ + 2 1730 GOTO 2140 1740 REM 1750 FOR I = MZ TO N 1760 P(I) = P(I+1) 1770 FOR J = 1 TO N 1780 KS(I,J) = KS(I+1,J) 1790 NEXT J 1800 NEXT I 1810 FOR J = MZ TO N 1820 FOR I = 1 TO N 1830 KS(I,J) = KS(I,J+1) 1840 NEXT I 1850 NEXT J 1860 MZ = MZ + 1 1870 GOTO 2140 1880 REM 1890 FOR I = MZ TO N 1900 P(I+1) = P(I+2) 1910 FOR J = 1 TO N 1920 KS(I+1,J) = KS(I+2,J) 1930 NEXT J 1940 NEXT I 1950 FOR J = MZ TO N 1960 FOR I = 1 TO N 1970 KS(I,J+1) = KS(I,J+2) 1980 NEXT I 1990 NEXT J 2000 MZ = MZ + 1 2010 GOTO 2140 2020 REM 2030 FOR I = MZ TO N 2040 P(I) = P(I+2) 2050 FOR J = 1 TO N 2060 KS(I,J) = KS(I+2,J) 2070 NEXT J 2080 NEXT I 2090 FOR J = MZ TO N 2100 FOR I = 1 TO N 2110 KS(I,J) = KS(I,J+2) 2120 NEXT I 2130 NEXT J 2140 NEXT IJ : REM&123456789 THIS LOOP STARTS AT REM&987654321 2150 MZ = MZ - 1 2160 M = MZ 2170 GOSUB 60120 : REM OPEN PRINTER 2180 GOSUB 60040 2190 P$ = "" : MQ = MZ 2200 IF MQ > 6 THEN MQ = 6 : P$ = "TOP LEFT 6X6 CORNER OF THE " 2210 P$ = P$ + "CONDENSED STIFFNESS MATRIX" : GOSUB 60000 2220 FW = 12 : NS = 4 : REM * DON'T INCREASE FW! ** 2230 FOR I = 1 TO MQ : P$ = "" 2240 FOR J = 1 TO MQ 2250 XS = KS(I,J) : GOSUB 10040 : P$ = P$ + XS$ 2260 NEXT J : GOSUB 60000 : GOSUB 60040 2270 NEXT I 2280 FW = 12 : NS = 4 2290 P$ = " CONDENSED LOAD VECTOR" : GOSUB 60000 2300 FOR I = 1 TO MZ 2310 XS = P(I) : GOSUB 10000 : P$ = " " + XS$ : GOSUB 60000 2320 NEXT I 2330 GOSUB 60130 : REM CLOSE PRINTER 2340 PRINT " DO YOU WISH THE PROGRAM TO CONTINUE [Y/N] "; 2350 INPUT AN$ : L1$ = LEFT$(AN$,1) 2360 IF L1$ = "N" OR L1$ = "n" THEN GOTO 3640 2370 IF L1$ <> "Y" AND L1$ <> "y" THEN GOTO 2340 2380 REM ** SOLUTION OF EQUATIONS NOW BEGINS 2390 REM BY GAUSSIAN ELIMINATION ** 2400 M1 = M - 1 2410 FOR I = 1 TO M1 2420 L = I + 1 2430 FOR J = L TO M 2440 IF KS(J,I) = 0 THEN GOTO 2490 2450 FOR K = L TO M 2460 KS(J,K) = KS(J,K) - KS(I,K)*KS(J,I)/KS(I,I) 2470 NEXT K 2480 P(J) = P(J) - P(I)*KS(J,I)/KS(I,I) 2490 NEXT J 2500 NEXT I 2510 P(M) = P(M)/KS(M,M) 2520 FOR I = 1 TO M1 2530 K = M - I 2540 L = K + 1 2550 FOR J = L TO M 2560 P(K) = P(K) - P(J)*KS(K,J) 2570 NEXT J 2580 P(K) = P(K)/KS(K,K) 2590 NEXT I 2600 REM ** THE VECTOR OF UNKNOWN DISPLACEMENTS 2610 REM IS HELD IN [P]. ** 2620 GOSUB 60120 2630 GOSUB 60040 2640 P$ = " VECTOR OF UNKNOWN DISPLACEMENTS" : GOSUB 60000 2650 FW = 12 : NS = 4 2660 FOR I = 1 TO MZ 2670 XS = P(I) : GOSUB 10040 : P$ = " " + XS$ : GOSUB 60000 2680 NEXT I 2690 REM ** EXPAND VECTOR [P] INTO [PH] BY 2700 REM INCORPORATING BOUNDARY DISPLACEMENT VALUES ** 2710 MS = 0 2720 MA = 0 2730 FOR IJ = 1 TO NN 2740 IF KODE(IJ) <> 4 THEN GOTO 2800 2750 MS = MS + 2 2760 MA = MA + 2 2770 PH(MS - 1) = P(MA - 1) 2780 PH(MS) = P(MA) 2790 GOTO 2950 2800 IF KODE(IJ) <> 3 GOTO 2860 2810 MS = MS + 2 2820 MA = MA + 1 2830 PH(MS - 1) = 0 2840 PH(MS) = P(MA) 2850 GOTO 2950 2860 IF KODE(IJ) <> 2 THEN GOTO 2920 2870 MS = MS + 2 2880 MA = MA + 1 2890 PH(MS-1) = P(MA) 2900 PH(MS)=0 2910 GOTO 2950 2920 MS = MS + 2 2930 PH(MS-1) = 0 2940 PH(MS) = 0 2950 NEXT IJ 2960 GOSUB 60040 2970 P$ = "VECTOR OF ALL NODAL DISPLACEMENTS" : GOSUB 60000 2980 P$ = " N UX VY" : GOSUB 60000 2990 FW = 15 : NS = 4 3000 FOR I = 1 TO NN 3010 XS = PH(2*I - 1) : GOSUB 10040 : P$ = XS$ 3020 XS = PH(2*I) : GOSUB 10040 : P$ = P$ + XS$ 3030 XS = I : GOSUB 30000 : P$ = XA$ + P$ : GOSUB 60000 3040 NEXT I 3050 REM ** CALCULATE FOR EACH MEMBER: 3060 REM MEMBER ELONGATION, 3070 REM FORCES AND STRESSES. ** 3080 L1 = 1 3090 I = 0 3100 GOSUB 60040 3110 P$ = " M ELON FORCE STRESS" 3120 P$ = " " + P$ : GOSUB 60000 3130 I = I + 1 3140 J2 = 2*NJ(I) 3150 I2 = 2*NI(I) 3160 II = I2/2 3170 JJ = J2/2 3180 DU = PH(J2-1)-PH(I2-1) 3190 DV = PH(J2)-PH(I2) 3200 GOTO 3390 3210 REM ** ELONGATION CALCULATED BY COMBINING 3220 REM NETT COORDINATE DISPLACEMENTS OF 3230 REM ONE END RELATIVE TO THE OTHER. ** 3240 EL = DU*CL + DV*CM 3250 REM ** FORCE CALCULATED FROM STRESS/STRAIN 3260 REM RELATION AND ELONGATION. ** 3270 REM THEN STRESS = FORCE/AREA. 3280 FC = EL*E(I)*A(I)/DL 3290 RS = FC/A(I) 3300 FW = 15 : NS = 4 3310 XS = EL : GOSUB 10040 : P$ = XS$ 3320 XS = FC : GOSUB 10040 : P$ = P$ + XS$ 3330 XS = RS : GOSUB 10040 : P$ = P$ + XS$ 3340 XA = I : GOSUB 30000 : P$ = XA$ + P$ : GOSUB 60000 3350 IF I - NM < 0 GOTO 3130 3360 IF I - NM >= 0 GOTO 3500 3370 REM ** DETERMINE MEMBER LENGTHS DL AND 3380 REM DIRECTION COSINES CL, CM.. ** 3390 DX = X(JJ) - X(II) 3400 DY = Y(JJ) - Y(II) 3410 DL = SQR(DX*DX+DY*DY) 3420 CL = DX/DL 3430 CM = DY/DL 3440 IF L1 = 0 GOTO 1310 3450 GOTO 3240 3460 REM ** MULTIPLY UNCONDENSED STIFFNESS 3470 REM MATRIX [KH] BY THE EXPANDED 3480 REM (UNCONDENSED) DISPLACEMENT VECTOR [PH] 3490 REM TO FIND ALL NODAL FORCES ** 3500 FOR I = 1 TO N 3510 FOR J = 1 TO N 3520 F(I) = KH(I,J)*PH(J) + F(I) 3530 NEXT J 3540 NEXT I 3550 GOSUB 60040 3560 P$ = "NODE FX FY" : GOSUB 60000 3570 FW = 15 : NS = 4 3580 FOR I = 1 TO NN 3590 XA = I : GOSUB 30000 : P$ = XA$ + " " 3600 XS = F(2*I-1) : GOSUB 10040 : P$ = P$ + XS$ 3610 XS = F(2*I) : GOSUB 10040 : P$ = P$ + XS$ : GOSUB 60000 3620 NEXT I 3630 GOSUB 60130 : REM CLOSE PRINTER 3640 FOR I = 1 TO 3 : PRINT : NEXT I 3650 PRINT " DO YOU WISH TO RERUN THE PROGRAM USING" 3660 PRINT " THE SAME # OF NODES AND MEMBERS BUT" 3670 PRINT " WITH DIFFERENT DATA FOR THE NODES" 3680 PRINT " AND/OR MEMBERS? [Y/N] "; 3690 INPUT AN$ : L1$=LEFT$(AN$,1) 3700 IF L1$ = "Y" OR L1$ = "y" THEN IR = 1 : GOTO 330 3710 IF L1$ <> "N" AND L1$ <> "n" THEN GOTO 3640 3720 GOSUB 60120 : IP = 3 : GOSUB 60060 3730 P$ = "**** END OF RUN OF PROGRAM " + PN$ + " ****" : GOSUB 60000 3740 IP = 5 : GOSUB 60060 : GOSUB 60130 3750 FOR I = 1 TO 5 : PRINT : NEXT I 3760 PRINT "************ SOLUTION COMPLETED *************" 3770 END 10000 REM FORMATTING AND INPUT/OUTPUT 10004 REM SUBROUTINES BY 10008 REM D.A. PIRIE 10012 REM DEPARTMENT OF AEROSPACE ENGINEERING 10016 REM UNIVERSITY OF GLASGOW 10020 REM SCOTLAND 10024 REM MAY 1989 10028 REM 10032 REM ** FORMAT NUMERICAL OUTPUT IN SCIENTIFIC NOTATION ** 10036 FW = 12 : NS = 4 : REM DEFAULT VALUES 10040 WE = 1E-30 : REM ANYTHING SMALLER TAKEN AS ZERO 10050 XA = XS : GOSUB 30010 : XS$ = XA$ 10060 KE = 0 : KE$ = "" : BL$ = " " : B0$ = "00000000" 10070 F5 = FW - NS - 5 : N3 = NS + 3 : Z$ = "0." : AX = ABS(XS) 10080 IF AX < WE THEN XS$ = LEFT$(BL$,F5) + Z$ + LEFT$(BL$,N3) : GOTO 10130 10090 LX = LEN(XS$) : L3 = LX - 3 : XA = XS 10100 IF LX > 5 THEN IF MID$(XS$,L3,1) = "E" THEN GOSUB 10400 10110 IF ABS(XS) < 1 OR ABS(XS) >= 10 THEN GOSUB 10240 10120 GOSUB 10140 10130 RETURN 10140 REM FORM OUTPUT$ 10150 GOSUB 10200 10160 IF ABS(XS) >= 10 THEN GOSUB 10240 10170 GOSUB 10280 10180 GOSUB 10330 10190 RETURN 10200 REM ROUNDOFF MANTISSA 10210 XR = 5 : FOR I5 = 1 TO NS : XR = XR/10 : NEXT I5 10220 XS = XS + XR*SGN(XS) 10230 RETURN 10240 REM NORMALISE MANTISSA 10250 IF ABS(XS) < 1 THEN XS = XS*10 : KE = KE - 1 : GOTO 10250 10260 IF ABS(XS) >= 10 THEN XS = XS/10 : KE = KE + 1 : GOTO 10260 10270 RETURN 10280 REM FORM EXPONENT% 10290 S$ = "+" : IF KE < 0 THEN S$ = "-" 10300 XA = KE : GOSUB 30010 : KE$ = XA$ 10310 KE$ = S$ + RIGHT$("0" + MID$(KE$,2),2) 10320 RETURN 10330 REM FORM(MANTISSA + EXPONENT)$ 10340 XA = XS : GOSUB 30010 : XS$ = XA$ 10350 X1$ = LEFT$(XS$,NS + 2) 10360 XS$ = X1$:IF LEN(X1$)= 10^(8-NS) THEN XX = XS : GOTO 20090 20080 GOSUB 20210 20090 IF LEN(XS$)> 5 THEN IF MID$(XS$,LEN(XS$) - 3, 1) = "E" THEN GOSUB 20190 20100 XA = XX : GOSUB 30010 : XX$ = XA$ 20110 FOR J5 = 1 TO LEN(XX$) 20120 IF MID$(XX$,J5,1) = "." THEN DP = J5 : GOTO 20140 20130 NEXT J5 : DP = LEN(XX$) + 1 : XX$ = XX$ + "." 20140 XX$ = XX$ + "0000000" : XS$ = LEFT$(XX$,DP+NS) + XE$ 20150 LX = LEN(XS$):IF LX >= FW THEN XS$ = " " + LEFT$(XS$,FW+1) : GOTO 20170 20160 XS$ = LEFT$(BL$,FW-LX)+XS$ 20170 RETURN 20180 REM SEPARATE MANTISSA, EXPONENTS 20190 XE$ = RIGHT$(XS$,4) : XS=VAL(LEFT$(XS$,LEN(XS$) - 4)) 20200 GOSUB 20210 : RETURN 20210 REM ROUND-OFF TO NS DECIMAL PLACES 20220 XX = XS + .5*SGN(XS)/10^NS : RETURN 30000 GOSUB 30010 : GOSUB 30060 : RETURN 30010 REM * FIX FOR BASIC(EG APPLE) WHICH STRIP LEADING BLANK FROM 30020 REM STR$(NON-NEGATIVE NUMBER) * 30030 XA$ = STR$(XA) : X1$ = LEFT$(XA$,1) 30040 IF X1$ <> " " AND X1$ <> "-" THEN XA$ = " " + XA$ 30050 RETURN 30060 REM * RIGHT-JUSTIFY INTEGERS <= 99 30070 XA$ = RIGHT$(" " + XA$, 3) 30080 RETURN 30090 REM ********************************************* 50000 REM ** THE FOLLOWING STATEMENTS 50010 REM ** ARE SPECIFIC TO MS-DOS 50020 REM TURBO BASIC ** 50030 PRINT P$ : RETURN : REM ** PRINTLINE ON OUTPUTFILE ** 50040 PRINT , : RETURN : REM ** 1 NEWLINE ON OUTPUTFILE ** 50050 REM 50060 FOR KP = 1 TO IP : REM DO IP 50070 PRINT , : REM NEWLINES 50080 NEXT KP : REM ON 50090 RETURN : REM OUTPUT FILE * 50100 GOSUB 50000 : GOSUB 50040 : RETURN : REM PRINTLINE + NEWLINE 50110 REM OPEN PN$ + ".IN" FOR INPUT AS #2 : RETURN : REM ** OPEN INFILE ** 50120 REM OPEN PN$ + ".OUT" FOR OUTPUT AS #3 : RETURN : REM ** OPEN OUTFILE ** 50130 REM CLOSE #2, #3 : RETURN : REM CLOSE INFILE & OUTFILE 50140 CLS : RETURN : REM CLEARSCREEN 60000 REM 60010 REM 60030 PRINT P$ : RETURN : REM ** PRINTLINE ON PRINTER ** 60040 PRINT : RETURN : REM ** 1 NEWLINE ON PRINTER ** 60050 REM 60060 FOR KP = 1 TO IP : REM DO IP 60070 PRINT : REM NEWLINES 60080 NEXT KP : REM ON 60090 RETURN : REM PRINTER * 60100 REM 60110 REM 60120 REM OPEN "LPT1:" AS #1 : RETURN : REM OPEN PRINTER 60130 REM CLOSE #1 : RETURN : REM CLOSE PRINTER