プログラミング教える用で書いてみたやつなのでそのまま業務で使うにはベタ過ぎるかもです。
つか、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.