COBOLが基本情報午後問題から廃止されるらしいので解いてみた&動かしてみた
基本情報の午後試験からCOBOLが廃止されますのでH30秋のCOBOLを解きました。問題自体は完答できて満点でした。それだけだと面白くないのでMacにCOBOL環境を構築して実行してみました。
問題はこちらの設問10です。
https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2018h30_2/2018h30a_fe_pm_qs.pdf
問題内容
- 全社員の資格(4つ限定w)の合格状況を管理するプログラム
- プログラムは半年に一回だけ実行されるバッチ。この利用頻度だとCOBOLからリプレースされないだろうとちょっと納得できる設定。
- 繰り返しと分岐をきちんと理解していないと完答できないような良問だと個人的に思う。
情報サービス企業であるP社には社内資格として資格1~4があり,従業員に取得を奨励している。 社内資格を取得するための試験は定期的に実施しており, 全従業員の保有状況を保有資格ファイルで管理する。P社の事業年度は4月から翌年3月までであり, 上期(4月~9月)と下期( 10 月~翌年3月)の2期から成る。 資格試験に合格した従業員の情報は合格ファイルに1期分を蓄積する。 上期の合格者を蓄積した合格ファイルは 10 月初めに,下期の合格者を蓄積した合格ファイルは 4月初めにプログラムを実行して,保有資格ファイルに反映する運用である。
ざっくり概要がわかる程度に紹介しましたが、完全版が見たい人は上記リンク先を見てください。
環境
$ cobc --version cobc (OpenCOBOL) 1.1.0 Copyright (C) 2001-2009 Keisuke Nishida / Roger While Built Aug 24 2018 04:30:53 Packaged Feb 06 2009 10:30:55 CET
ソース&ビルド
open-cobolをインストールします
brew install open-cobol
適当に写経したままだと動かなかったので先頭8行を足した。
IDENTIFICATION DIVISION. PROGRAM-ID. QLF. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT SRT-FILE ASSIGN TO 'sort.txt'. SELECT QLF-FILE ASSIGN TO 'qlf.txt'. SELECT PAS-FILE ASSIGN TO 'pas.txt'. DATA DIVISION. FILE SECTION. SD SRT-FILE. 01 SRT-REC. 02 SRT-NO PIC X(8). 02 SRT-CD PIC 9(1). 02 SRT-DATE PIC 9(8). FD QLF-FILE. 01 QLF-REC. 02 QLF-NO PIC X(8). 02 QLF-INF. 03 QLF-DATE PIC 9(8) OCCURS 4. FD PAS-FILE. 01 PAS-REC. 02 PAS-NO PIC X(8). 02 PAS-CD PIC 9(1). 02 PAS-DATE PIC 9(8). WORKING-STORAGE SECTION. 77 SRT-FLAG PIC X(1) VALUE SPACE. 88 SRT-EOF VALUE "E". 77 CR-NO PIC X(8) VALUE SPACE. PROCEDURE DIVISION. MAIN-PROC. OPEN I-O QLF-FILE. SORT SRT-FILE ASCENDING KEY SRT-NO USING PAS-FILE OUTPUT PROCEDURE IS RET-PROC. CLOSE QLF-FILE. STOP RUN. RET-PROC. PERFORM TEST BEFORE UNTIL SRT-EOF RETURN SRT-FILE AT END SET SRT-EOF TO TRUE PERFORM WRI-PROC NOT AT END PERFORM UPD-PROC END-RETURN END-PERFORM. UPD-PROC. IF SRT-NO NOT = CR-NO THEN PERFORM WRI-PROC MOVE SRT-NO TO QLF-NO READ QLF-FILE END-READ MOVE QLF-NO TO CR-NO END-IF. MOVE SRT-DATE TO QLF-DATE(SRT-CD). WRI-PROC. IF CR-NO NOT = SPACE THEN REWRITE QLF-REC END-IF.
ちなみにプログラムの大部分は 【基本情報技術者試験】平成30年 秋期 午後 問題と解答 からコピペしたものを手直しした。
上記ファイルをコンパイルします
$ cobc -x --free -W prog.cob
実行前ファイル内容確認〜実行
必要になるファイルを用意する。sort.txt処理に必要な中間ファイルなので空でOK
$ ls pas.txt prog prog.cob qlf.txt sort.txt $ cat pas.txt 00000001220180203 $ cat qlf.txt 00000001 0000000220170101 00000003
実行〜結果確認
$ cat qlf.txt 00000001 00000002 00000003 $ ./prog $ cat qlf.txt 00000001 20180203 00000002 00000003
無事00000001
の社員の資格2の合格日が更新されました。
感想
COBOLは自分の知ってるどの言語よりも自然言語(英文)っぽく書けるように工夫されている。可読性は高いと思う。
参考にさせていただいたサイト
動かす時に少し調べました。
gnucobol - Opening file for reading in COBOL - Stack Overflow