10 REM: *************SCONV***************** 20 REM: ORIGINAL CONCEPT & CRUDE CODE BY LES MICHELSON 30 REM: REFINED ELEGANT VERSION BY JIM BLACKWOOD 40 REM: 50 REM: WHEN ENTERING SCREENED DATA INTO A BASIC PROGRAM, 60 REM: IT IS CONVENIENT TO ENTER THE DATA INTO A STRING 70 REM: VARIABLE. IF CONDITIONS ARE MET, THE STRING CAN 80 REM: THEN BE CONVERTED TO A FLOATING POINT VARIABLE. 90 REM: FOR EXAMPLE: 100 REM: 110 REM: 10 PRINT "ENTER 'S' TO SKIP TO THE NEXT VARIABLE" 120 REM: 20 PRINT "ENTER 'R' TO RETURN TO THE LAST VARIABLE" 130 REM: 30 PRINT "ENTER 'X' TO END DATA ENTRY" 140 REM: 40 INPUT "ENTER CARDIAC OUTPUT";A$ 150 REM: 50 IF A$="S" GOSUB 1000 160 REM: 60 IF A$="R" GOSUB 2000 170 REM: 70 IF A$="X" GOSUB 2500 180 REM: 80 GOSUB 3000 190 REM: 200 REM: SUBROUTINE 3000 CONVERTS THE STRING. INDEXING 210 REM: STRINGS IS VIA HP CONVENTION. WE EXPECT THAT THOSE 220 REM: INTERESTED IN THIS ROUTINE KNOW HOW TO INDEX 230 REM: STRINGS IN THEIR VERSION(S) OF BASIC. 240 REM: ON ENTRY, THE STRING IS IN A$. VARIABLES ARE NOT 250 REM: LOCAL, SO CHANGE AS NECESSARY. ON RETURN, THE 260 REM: FLOATING POINT VARIABLE IS IN T. IF ERROR, E IS 270 REM: 1 AND A$ = "ERROR". 3000 DIM N$(10) 3001 REM: DIMENSION A$ ELSEWHERE 3010 LET N$="0123456789" 3020 GOSUB 3150 3030 RETURN 3040 REM: ROUTINE RETURNS FLOATING POINT RESULT IN T OR 3050 REM: E=1 AND A$ = "ERROR" IF ERROR. 3060 REM: THIS ROUTINE CONVERTS AN ASCII-NUMERIC 3070 REM: STRING TO FLOATING POINT. RULES - LEADING AND 3080 REM: TRAILING BLANKS OK. OPTIONAL '+,-, OR .' 3090 REM: NO IMBEDDED BLANKS. '+/- AND/OR .' W/O DATUM 3100 REM: TREATED AS ZERO. 3110 REM: 3120 REM: STRIP OFF LEADING BLANKS 3150 LET E=1 3160 FOR I = 1 TO LEN(A$) 3170 IF A$(I,I) <> " " GOTO 3210 3175 NEXT I 3180 REM: ALL BLANKS 3190 GOTO 3510 3200 REM: SIGN CHARACTER? 3210 LET S=1 3220 IF A$(I,I)<>"-" GOTO 3260 3230 LET S=-1 3240 LET I=I+1 3250 GOTO 3280 3260 IF A$(I,I)="+" LET I=I+1 3270 REM: SCAN INPUT STRING. PRESET ASSOCIATED VARIABLES 3280 LET T=P=P1=F=0 3290 FOR J=I TO LEN(A$) 3300 FOR K=1 TO 10 3310 IF A$(J,J)<>N$(K,K) GOTO 3350 3320 LET T=T*10+K-1 3330 LET P1=P1+1 3340 GOTO 3410 3350 NEXT K 3360 IF A$(J,J)=" "GOTO 3430 3370 IF A$(J,J)<>"." GOT 3510 3380 IF F=1 GOTO 3510 3390 LET P=J-I 3400 LET F=1 3410 NEXT J 3420 REM: SCAN FOR NON BLANK CHARACTERS 3430 FOR I=J TO LEN(A$) 3440 IF A$(I,I)<>" " GOTO 3510 3450 NEXT I 3460 REM: SCALE MANTISSA 3470 IF F=1 LET T=T*10^(P-P1) 3480 LET T=T*S 3490 LET E=0 3500 RETURN 3510 LET A$="ERROR" 3520 RETURN 3530 END