ISBN-13←→ISBN-10 変換プログラム。


サンプルその2。前回プログラムの応用編的な感じで。


ISBN1310.COB (ISBN-13→ISBN-10 変換)

       IDENTIFICATION DIVISION.
       PROGRAM-ID. ISBN1310-VER001.
       AUTHOR. DUMBO.
       DATE-WRITTEN. 11.11.2013.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 ISBN-IN PIC X(13).
       01 ISBN-TMP 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 "ISBN-13→ISBN-10 変換プログラム ver0.01"
             UPON CONSOLE.
           PERFORM UNTIL FLG >= 1
             DISPLAY "ISBN-13(13桁) を入力してください。" UPON CONSOLE
             ACCEPT ISBN-IN FROM CONSOLE
             DISPLAY "入力した ISBN-13 = " ISBN-IN UPON CONSOLE
             IF ISBN-IN IS NUMERIC
               THEN
      *          DISPLAY "入力は正しいです。" UPON CONSOLE
                 MOVE ISBN-IN(4:9) TO ISBN-TMP
                 MOVE 1 TO FLG
               ELSE
                 DISPLAY "入力に誤りがあります。" UPON CONSOLE
             END-IF
           END-PERFORM.
      *ISBN-TMPを左桁の数字から順に×10、×9…×2と乗算して、
      *その結果を合計する。
           PERFORM VARYING CNT FROM 1 BY 1 UNTIL CNT > ISBN-CNT
             COMPUTE TEMP = FUNCTION NUMVAL(ISBN-TMP(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 "ISBN-10 は " ISBN-TMP CDIGIT " です。"
             UPON CONSOLE.
           STOP RUN.


ISBN1013.COB (ISBN-10→ISBN-13 変換)

       IDENTIFICATION DIVISION.
       PROGRAM-ID. ISBN1013-VER001.
       AUTHOR. DUMBO.
       DATE-WRITTEN. 11.11.2013.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 ISBN-IN PIC X(10).
       01 ISBN-TMP PIC X(12).
       01 ISBN-HD PIC X(3) VALUE "978".
       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 "ISBN-10→ISBN-13 変換プログラム ver0.01"
             UPON CONSOLE.
           PERFORM UNTIL FLG >= 1
             DISPLAY "ISBN-10(10桁) を入力してください。" UPON CONSOLE
             ACCEPT ISBN-IN FROM CONSOLE
             DISPLAY "入力した ISBN-10 = " ISBN-IN UPON CONSOLE
             IF ISBN-IN IS NUMERIC OR
               (ISBN-IN(1:9) IS NUMERIC AND ISBN-IN(10:1) = "X")
               THEN
      *          DISPLAY "入力は正しいです。" UPON CONSOLE
                 STRING
                   ISBN-HD DELIMITED BY SIZE
                   ISBN-IN(1:9) DELIMITED BY SIZE
                   INTO ISBN-TMP
                 END-STRING
                 MOVE 1 TO FLG
               ELSE
                 DISPLAY "入力に誤りがあります。" UPON CONSOLE
             END-IF
           END-PERFORM.
      *ISBN-TMPを左から奇数桁の数字を合計する。
           PERFORM VARYING CNT FROM 1 BY 2 UNTIL CNT > ISBN-CNT
             ADD FUNCTION NUMVAL(ISBN-TMP(CNT:1)) TO ODD
           END-PERFORM.
      *ISBN-TMPを左から偶数桁の数字を合計×3する。
           PERFORM VARYING CNT FROM 2 BY 2 UNTIL CNT > ISBN-CNT
             ADD FUNCTION NUMVAL(ISBN-TMP(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 "ISBN-13 は " ISBN-TMP CDIGIT " です。"
             UPON CONSOLE.
           STOP RUN.