RosettaCodeData/Task/CUSIP/QuickBASIC/cusip.basic

62 lines
1.5 KiB
Text
Raw Permalink Normal View History

2026-04-30 12:34:36 -04:00
' CUSIP
DECLARE SUB PrintVerdict (Cusip$)
DECLARE FUNCTION CusipCheckDigit% (Cusip$)
DECLARE FUNCTION IsValidCusip% (Cusip$)
CONST TRUE% = -1, FALSE% = 0
PRINT "CUSIP Verdict"
PrintVerdict "037833100"
PrintVerdict "17275R102"
PrintVerdict "38259P508"
PrintVerdict "594918104"
PrintVerdict "68389X106"
PrintVerdict "68389X105"
END
FUNCTION CusipCheckDigit% (Cusip$)
I% = 1
Sum% = 0
L% = LEN(Cusip$)
DO WHILE I% < L%
IF ("0" <= MID$(Cusip$, I%, 1)) AND (MID$(Cusip$, I%, 1) <= "9") THEN
V% = ASC(MID$(Cusip$, I%, 1)) - 48 ' 0
ELSEIF ("A" <= MID$(Cusip$, I%, 1)) AND (MID$(Cusip$, I%, 1) <= "Z") THEN
V% = ASC(MID$(Cusip$, I%, 1)) - 65 + 10
ELSEIF MID$(Cusip$, I%, 1) = "*" THEN
V% = 36
ELSEIF MID$(Cusip$, I%, 1) = "@" THEN
V% = 37
ELSEIF MID$(Cusip$, I%, 1) = "#" THEN
V% = 38
ELSE
CusipCheckDigit% = -1
EXIT FUNCTION
END IF
IF (I% - 1) MOD 2 = 1 THEN V% = 2 * V%
IF I% <= 8 THEN Sum% = Sum% + (V% \ 10) + (V% MOD 10)
I% = I% + 1
LOOP
IF I% <> 9 THEN
CusipCheckDigit% = -1
ELSE
CusipCheckDigit% = (10 - (Sum% MOD 10)) MOD 10
END IF
END FUNCTION
FUNCTION IsValidCusip% (Cusip$)
Check% = CusipCheckDigit%(Cusip$)
IF Check% < 0 THEN
IsValidCusip% = FALSE
ELSE
IsValidCusip% = (MID$(Cusip$, 9, 1) = CHR$(48 + Check%))
END IF
END FUNCTION
SUB PrintVerdict (Cusip$)
PRINT Cusip$;
IF IsValidCusip%(Cusip$) THEN
PRINT " : Valid"
ELSE
PRINT " : Invalid"
END IF
END SUB