ISBN チェックディジット算出サンプル。


プログラミング教える用で書いてみたやつなのでそのまま業務で使うにはベタ過ぎるかもです。
つか、COBOL 知らない俺が COBOL 説いてるってのがまず訳解らんのですがねぇ…。


ISBN13.COB

       IDENTIFICATION DIVISION.
       PROGRAM-ID. ISBN13-VER001.
       AUTHOR. DUMBO.
       DATE-WRITTEN. 11.09.2013.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 ISBN-IN PIC X(12).
       01 ISBN-CNT PIC 99 VALUE 12.
       01 MOD-10 PIC 9(3) VALUE 10.
       01 WAIT-3-1 PIC 9(3) VALUE 3.
       01 ODD PIC 9(3) VALUE ZEROS.
       01 EVEN PIC 9(3) VALUE ZEROS.
       01 TOTAL PIC 9(3) VALUE ZEROS.
       01 Q PIC 9(3).
       01 R PIC 9(3).
       01 CDIGIT PIC 9.
       01 CNT PIC 99.
       01 FLG PIC 9 VALUE ZERO.
       PROCEDURE DIVISION.
       MAIN.
           DISPLAY "ISBN13 チェックディジット算出プログラム ver0.01"
             UPON CONSOLE.
           PERFORM UNTIL FLG >= 1
             DISPLAY "チェックディジットを調べる ISBN(12桁) を"
      -        "入力してください。" UPON CONSOLE
             ACCEPT ISBN-IN FROM CONSOLE
             DISPLAY "入力した ISBN(12桁) = " ISBN-IN UPON CONSOLE
             IF ISBN-IN IS NUMERIC
               THEN
      *          DISPLAY "入力は正しいです。" UPON CONSOLE
                 MOVE 1 TO FLG
               ELSE
                 DISPLAY "入力に誤りがあります。" UPON CONSOLE
             END-IF
           END-PERFORM.
      *ISBN-INを左から奇数桁の数字を合計する。
           PERFORM VARYING CNT FROM 1 BY 2 UNTIL CNT > ISBN-CNT
             ADD FUNCTION NUMVAL(ISBN-IN(CNT:1)) TO ODD
           END-PERFORM.
      *ISBN-INを左から偶数桁の数字を合計×ウェイト3する。
           PERFORM VARYING CNT FROM 2 BY 2 UNTIL CNT > ISBN-CNT
             ADD FUNCTION NUMVAL(ISBN-IN(CNT:1)) TO EVEN
           END-PERFORM.
           COMPUTE EVEN = EVEN * WAIT-3-1.
      *合計÷モジュラス10=余り
      *→モジュラス10−余り=チェックデジット を算出する。
      *結果が10なら0、それ以外なら余り値がチェックディジット。
           COMPUTE TOTAL = ODD + EVEN.
           DIVIDE MOD-10 INTO TOTAL GIVING Q REMAINDER R.
           COMPUTE CDIGIT = MOD-10 - R.
           DISPLAY "チェックディジットは " CDIGIT " です。"
             UPON CONSOLE.
           STOP RUN.


ISBN10.COB

       IDENTIFICATION DIVISION.
       PROGRAM-ID. ISBN10-VER001.
       AUTHOR. DUMBO.
       DATE-WRITTEN. 11.09.2013.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 ISBN-IN PIC X(9).
       01 ISBN-CNT PIC 99 VALUE 9.
       01 MOD-11 PIC 9(3) VALUE 11.
       01 WAIT-10-2 PIC 9(3) VALUE 10.
       01 TEMP PIC 9(3) VALUE ZEROS.
       01 TOTAL PIC 9(3) VALUE ZEROS.
       01 Q PIC 9(3).
       01 R PIC 9(3).
       01 CDTEMP PIC 9.
       01 CDIGIT PIC X.
       01 CNT PIC 99.
       01 FLG PIC 9 VALUE ZERO.
       PROCEDURE DIVISION.
       MAIN.
           DISPLAY "ISBN10 チェックディジット算出プログラム ver0.01"
             UPON CONSOLE.
           PERFORM UNTIL FLG >= 1
             DISPLAY "チェックディジットを調べる ISBN(9桁) を"
      -        "入力してください。" UPON CONSOLE
             ACCEPT ISBN-IN FROM CONSOLE
             DISPLAY "入力した ISBN(9桁) = " ISBN-IN UPON CONSOLE
             IF ISBN-IN IS NUMERIC
               THEN
      *          DISPLAY "入力は正しいです。" UPON CONSOLE
                 MOVE 1 TO FLG
               ELSE
                 DISPLAY "入力に誤りがあります。" UPON CONSOLE
             END-IF
           END-PERFORM.
      *ISBN-INを左桁の数字から順に×10、×9…×2と乗算して、
      *その結果を合計する。
           PERFORM VARYING CNT FROM 1 BY 1 UNTIL CNT > ISBN-CNT
             COMPUTE TEMP = FUNCTION NUMVAL(ISBN-IN(CNT:1))
             COMPUTE TOTAL = (WAIT-10-2 - CNT + 1) * TEMP + TOTAL
           END-PERFORM.
      *合計÷モジュラス11=余り
      *→モジュラス11−余り=チェックデジット を算出する。
      *結果が10ならX、11なら0、それ以外なら余り値がチェックディジット。
           DIVIDE MOD-11 INTO TOTAL GIVING Q REMAINDER R.
           COMPUTE TEMP = MOD-11 - R.
           MOVE TEMP TO CDTEMP.
           EVALUATE TEMP
             WHEN 10
               MOVE "X" TO CDIGIT
             WHEN 11
               MOVE 0 TO CDIGIT
             WHEN OTHER
               MOVE CDTEMP TO CDIGIT
           END-EVALUATE.
           DISPLAY "チェックディジットは " CDIGIT " です。"
             UPON CONSOLE.
           STOP RUN.