RosettaCodeData/Task/CUSIP/ANSI-BASIC/cusip.basic
2026-04-30 12:34:36 -04:00

63 lines
1.7 KiB
Text

100 REM CUSIP
110 DECLARE EXTERNAL SUB PrintVerdict
120 DECLARE EXTERNAL FUNCTION CusipCheckDigit
130 DECLARE EXTERNAL FUNCTION IsValidCusip
140 PRINT "CUSIP Verdict"
150 CALL PrintVerdict("037833100")
160 CALL PrintVerdict("17275R102")
170 CALL PrintVerdict("38259P508")
180 CALL PrintVerdict("594918104")
190 CALL PrintVerdict("68389X106")
200 CALL PrintVerdict("68389X105")
210 END
220 REM **
230 EXTERNAL FUNCTION CusipCheckDigit(Cusip$)
240 LET I = 1
250 LET Sum = 0
260 LET L = LEN(Cusip$)
270 DO WHILE I < L
280 LET C$ = Cusip$(I:I)
290 IF ("0" <= C$) AND (C$ <= "9") THEN
300 LET V = VAL(C$)
310 ELSEIF ("A" <= C$) AND (C$ <= "Z") THEN
320 LET V = ORD(C$) - 65 + 10
330 ELSEIF C$ = "*" THEN
340 LET V = 36
350 ELSEIF C$ = "@" THEN
360 LET V = 37
370 ELSEIF C$ = "#" THEN
380 LET V = 38
390 ELSE
400 LET CusipCheckDigit = -1
410 EXIT FUNCTION
420 END IF
430 IF MOD(I - 1, 2) = 1 THEN LET V = 2 * V
440 IF I <= 8 THEN LET Sum = Sum + INT(V / 10) + MOD(V, 10)
450 LET I = I + 1
460 LOOP
470 IF I <> 9 THEN
480 LET CusipCheckDigit = -1
490 ELSE
500 LET CusipCheckDigit = MOD(10 - MOD(Sum, 10), 10)
510 END IF
520 END FUNCTION
530 REM **
540 EXTERNAL FUNCTION IsValidCusip (Cusip$)
550 LET Check = CusipCheckDigit(Cusip$)
560 IF Check < 0 THEN
570 LET IsValidCusip = 0
580 ELSEIF Cusip$(9:9) = CHR$(48 + Check) THEN
590 LET IsValidCusip = -1
600 ELSE
610 LET IsValidCusip = 0
620 END IF
630 END FUNCTION
640 REM **
650 EXTERNAL SUB PrintVerdict (Cusip$)
660 PRINT Cusip$;
670 IF IsValidCusip(Cusip$) <>0 THEN
680 PRINT " : Valid"
690 ELSE
700 PRINT " : Invalid"
710 END IF
720 END SUB