Yabu.log

ITなどの雑記

COBOLが基本情報午後問題から廃止されるらしいので解いてみた&動かしてみた

基本情報の午後試験からCOBOLが廃止されますのでH30秋のCOBOLを解きました。問題自体は完答できて満点でした。それだけだと面白くないのでMacCOBOL環境を構築して実行してみました。

問題はこちらの設問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

第 5 章 ファイル状態コード

MacにCobolを入れていじってみた話 - Qiita