サンプルその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.