Credit Card Validation
Problem Description
Validate credit card number using Luhn algorithm. Check: 16 digits, valid checksum, identify card type (Visa/Master/Amex).
Expected Output
VALID or INVALID with card type
Hints
Luhn: double every second digit from right, sum digits, must be divisible by 10.
Solution
IDENTIFICATION DIVISION.
PROGRAM-ID. CCVALID.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-CARD-NUM PIC X(16).
01 WS-DIGIT PIC 9.
01 WS-DOUBLED PIC 99.
01 WS-SUM PIC 999 VALUE 0.
01 WS-IDX PIC 99.
01 WS-CARD-TYPE PIC X(10).
01 WS-REMAINDER PIC 99.
PROCEDURE DIVISION.
DISPLAY "ENTER 16-DIGIT CARD NUMBER: ".
ACCEPT WS-CARD-NUM.
IF WS-CARD-NUM(1:1) = "4"
MOVE "VISA" TO WS-CARD-TYPE
ELSE IF WS-CARD-NUM(1:1) = "5"
MOVE "MASTERCARD" TO WS-CARD-TYPE
ELSE
MOVE "UNKNOWN" TO WS-CARD-TYPE
END-IF.
MOVE 0 TO WS-SUM.
PERFORM VARYING WS-IDX FROM 16 BY -1 UNTIL WS-IDX < 1
MOVE WS-CARD-NUM(WS-IDX:1) TO WS-DIGIT
IF FUNCTION MOD(16 - WS-IDX, 2) = 1
MULTIPLY WS-DIGIT BY 2 GIVING WS-DOUBLED
IF WS-DOUBLED > 9
SUBTRACT 9 FROM WS-DOUBLED
END-IF
ADD WS-DOUBLED TO WS-SUM
ELSE
ADD WS-DIGIT TO WS-SUM
END-IF
END-PERFORM.
DIVIDE WS-SUM BY 10 GIVING WS-IDX REMAINDER WS-REMAINDER.
IF WS-REMAINDER = 0
DISPLAY "VALID " WS-CARD-TYPE " CARD"
ELSE
DISPLAY "INVALID CARD NUMBER"
END-IF.
STOP RUN.
Explanation:
Luhn algorithm implementation with card type detection.