【COBOL言語】基本情報技術者試験と過去問題-平成25年度秋期-|合格対策

COBOL(コボル)言語の平成25年度秋期問題の解き方とは

※情報処理推進機構(IPA)は、午後の試験で選択できるプログラミング言語のうち、「COBOL」の出題を令和元年秋期試験で廃止しました。

試験-平成25年度秋期-イメージ

COBOL(コボル)言語の平成25年度秋期の出題内容

平成25年度秋期に出題された問題は、テニスコートの予約管理システムを題材にしたプログラムが出題されました。

COBOLでよく使用されるファイルの入出力処理や、PERFORMによる繰り返し処理でのデータを順に突き合わせを行うプログラムの内容がメインとなります。

PERFORMによる入れ子の処理があり一見複雑な処理に感じますが、プログラムの説明を読んで、コートの面数や予約時間などを整理しておけば難易度はそう高くないと言えるでしょう。

また、空欄を埋めていく処理は前後のプログラムの内容を把握しておけば、選択肢の中から該当する処理が何であるかを導き出せるようになっています。

COBOL(コボル)言語の平成25年度秋期問題

ここでは平成25年度秋期に出題された、プログラムに必要な内容を穴埋めしていく問題について解説していきます。

■プログラムの説明

X社では、自社の事業所内にある4面のテニスコートについて、従業員が予約やキャンセル、空き状況の確認ができるシステムを開発することになりました。このプログラムは、テニスコートの予約を受け付けるサブプログラムであり、利用希望者からの予約情報をパラメタで受け取り、予約管理ファイルで管理している予約状況と照らし合わせて、予約結果をパラメタで呼出し元に返却します。

(1) プログラムには二つのパラメタがある。各パラメタの様式は、図1のとおりである。

試験-平成25年度秋期-パラメタの様式

① 予約番号には、予約希望に対して一意に割り振られる000001 ~ 999999の番号が 格納されている。

② 希望面数には、希望するコートの面数が格納されている。

③ 希望日には、年,月,日が、それぞれ4桁,2桁,2桁の西暦で格納されている。

④ 希望時刻には、希望する利用開始時刻の“時”が、24時間表記で格納されている。 利用可能な時間帯は8時から17 時までであり、1時間単位で予約できる。

⑤ 希望時間には、希望する利用時間数が格納されている。

⑥ 結果には、希望どおりに予約できた場合は0を、予約できなかった場合は9を設定する。

⑦ 予約コートには、予約できたコートのコート番号を設定する。例えば3番コートを予約できた場合は3000を設定し、1番コートと2番コートを予約できた場合は1200を設定する。予約ができなかった場合は、0000を設定する。

⑧ コートは1番~4番の順に検索し,番号の小さいコートから確保する。

⑨ 予約情報の各項目の値は呼出し側プログラムで検査するので,①~⑤で 示した範囲以外の値が設定されることはない。

(2) 予約管理ファイルは、日付を主キーとする図2に示すレコード様式の索引ファイルで、予約状況を管理するために使用する。

試験-平成25年度秋期-予約管理ファイルのレコード様式

① 日付には、年,月,日が、それぞれ4桁,2桁,2桁の西暦で格納される。

② 予約状況の各要素には、予約済の場合は予約番号が、予約が入っていない場合は0が格納される。

③ 予約が入っていない日付をキーとするレコードは存在しない。

■プログラム(1 / 2)

試験-平成25年度秋期-プログラム1

■プログラム(2 / 2)

試験-平成25年度秋期-プログラム2

出典:平成25年度秋期 COBOL試験区分 午後 問10 設問1

■設問1 プログラムの中の[ ]に入れる正しい答えを、解答群の中から選べ。

a~cに関する解答群

ア COMPUTE TIME-START = PRM-TIME - 7

イ MOVE BKUP-AREA TO RSV-COURT(COURT-CNT)

ウ MOVE COURT-CNT TO KEEP-COURT

エ MOVE PRM-TIME TO TIME-CNT

オ MOVE RSV-RNO(COURT-CNT TIME-CNT) TO PRM-RNO

カ MOVE TIME-CNT TO COURT-CNT

キ SET CHK-NG TO TRUE

ク SET CHK-OK TO TRUE

dに関する解答群

ア CHK-NG

イ CHK-OK

ウ KEEP-COURT NOT = ZERO

エ PRM-NUM NOT = KEEP-COURT

オ PRM-NUM = KEEP-COURT

■解答

設問1(a) :ア

設問1(b) :ク

設問1(c) :イ

設問1(d) :エ

【aの解説】

RSV-PROCでは読み込んだ予約管理ファイルを元に、受け取ったパラメタの情報を照らし合わせて予約の有無を受け付ける処理となります。

aの処理の後では、COMPUTE文で終了時刻を開始時刻TIME-STARTと希望時間PRM-HOURSを加算して取得していますが、プログラムの中で開始時刻を取得する処理がありません。

そのため、aの処理では開始時刻を取得する処理が入ることが分かります。開始時刻を取得するために受け取ったパラメタの希望時刻PRM-TIMEを取得する必要があります。希望時刻には24時間単位で8時から17時までを指定できますが、後のIF文の処理では開始時刻TIME-STARTを1から比較しているため、8時の場合は1、17時の場合は9の1~9の範囲で開始時刻を取得する必要があります。

そのため、aの処理は「COMPUTE TIME-START = PRM-TIME - 7」となります。

【bの解説】

54行目のPERFORM文でテニスコートの面数を1に設定し、4コート分及び希望の面数に達するまで予約の空きを検索する処理になります。

58行目の入れ子PERFORMの処理では、予約番号を格納している配列RSV-RNOがゼロの場合(空きがある場合)に予約番号を設定し、ゼロ以外(空きがない場合)はCHK-NGをTRUEに設定しています。

入れ子のPERFORMの後の処理では、予約結果CHK-OKがTRUEの場合に更新処理を行いますが、項目CHK-OKに値をセットする処理がありませんので、必然的にbの処理では項目CHK-OKを事前に設定する処理であるクの「SET CHK-OK TO TRUE」となります。

【cの解説】

58行目の入れ子のPERFORM文では、開始時刻TIME-STARTが1で予約結果がNGの場合か、希望時刻TIME-CNTが終了時刻TIME-ENDと等しいまたは大きい場合に繰り返し処理を行います。

60行目のPERFORM処理の中のIF文では、予約の空きのある場合に予約状況の配列RSV-RNOに予約番号を指定していますが、空きが無かった場合は予約結果CHK=NGをTRUEに指定し、予約状況の配列には57行目の処理で設定したバックアップデータBKUP-AREAを再度元に戻す処理を行います。

そのため、cの処理はイの「MOVE BKUP-AREA TO RSV-COURT(COURT-CNT) 」が入ります。

【d解説】

dの処理はRSV-PROCの最後の処理にあたり、予約面数PRM-NUMと希望の予約面数KEEP-COURTが一致しなかった場合に、予約結果RSV-NGをTRUEに指定し、予約コート情報RET-COURTの初期化処理を行います。そのため、dの処理は「PRM-NUM NOT = KEEP-COURT」となります。

練習問題

ここでは練習問題にチャレンジしてみましょう。

問)

平成25年度秋期COBOLのプログラムにおいて、手続き部(PROCEDURE DIVISION)から始まる処理内容について簡単に説明してください。

答え)

MAIN-PROCでは主に予約管理ファイルを読み込み、条件によって処理を分岐させます。

はじめに予約結果RSV-OKをTRUEでセットし、予約結果の集団項目RET-COURTをINITIALIZEで初期化します。

39行目のINVALID KEYの条件で予約状況が更新されている場合は、受信処理RSV-PROCに移動し、43行目の条件がNOT INVALIDE KEYの場合で予約できている場合はレコードの上書き処理を行います。

RSV-PROCの処理では主に受け取ったパラメタから、予約状況と照らし合わせて予約結果を返却する処理を行います。

まずは希望のテニスコートの面数KEEP-COURTをゼロで初期化し、52行目のaの処理は「COMPUTE TIME-START = PRM-TIME - 7」が入り、COMPUTE文で希望時刻PRM-TIMEを-7した結果が開始時刻TIME-STARTとして格納されます。

次に終了時刻TIME-ENDを開始時刻TIME-STARTと、希望時間PRM-HOURSを加算した結果を格納しています。

54行目のPERFORM文ではテニスコートの面数COURT-CNTを1で設定し、4コート分または、希望テニスコートの面数分一致するまで繰り返し処理を行います。

54行目から始まる一連の処理では1~4番のコートと、各コートの時間単位の入れ子のループで予約の空きを検索している処理となります。

56行目の繰り返し処理の中のbの処理では「SET CHK-OK TO TRUE」が入り、予約結果をTRUEでセットしておきます。

57行目では更新処理を行う前に、既存のテニスコートの予約状況を格納するRSV-AREAの配下の配列RSV-COURTを要素数にコート番号COURT-CNTを指定して、バックアップ用の項目BKUP-AREAを設定しています。

58行目のPERFORM文では、希望時刻TIME-CNTが開始時刻TIME-STARTが1で予約結果がNGの場合か、希望時刻TIME-CNTが終了時刻TIME-ENDと等しいまたは大きい場合に繰り返し処理を行います。

60行目のIF文の条件式では、対象の予約コートCOURT-CNTと希望時刻TIME-CNTを要素数に指定した予約状況RSV-RNOの配列がゼロの場合に、予約状況の配列に予約番号を格納します。

条件が一致しなかった場合(予約が取れなかった場合)は、CHK-NGの項目をTRUEにセットし、cの項目には「MOVE BKUP-AREA TO RSV-COURT(COURT-CNT)」が入ります。元々予約していた番号を予約状況の配列に再度格納します。

67行目のIF文の条件式では予約結果がTRUEの場合に、希望の予約面数KEEP-COURTに1ずつ加算し、予約コートRET-COURTの配列にコート番号COURT-CNTを格納します。

72行目のIF文の条件式のdの項目には「PRM-NUM NOT = KEEP-COURT」の処理で予約面数PRM-NUMが希望の予約面数KEEP-COURTと一致しなかった場合に結果RSV-NGをTRUEに指定し、予約コートRET-COURTを初期化します。

ここでは、平成25年度秋期のCOBOLの出題内容について解説しました。

今回は外部から受け取ったパラメタの情報を元に予約状況を管理しているテーブルを読み込み、呼び出し元に結果を返却する処理を行いました。

牽引ファイルの入出力操作やPERFORM文での入れ子の処理がありましたが、特別に難しい処理はなく、プログラムの説明文をよく読んで、内容を理解しておけば難易度はそう高くないと言えるでしょう。

この記事を読んだ人は、こちらの記事も読んでいます

【未経験者歓迎】COBOLプログラマー・システムエンジニアの募集

株式会社COBOLの求人・転職・募集情報を見る

COBOL入門のカテゴリー

取引企業様 募集中
COBOL技術者 募集
COBOL魂
読者採用
COBOL入門