戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

基本情報技術者 2015年 春期 午後 問10


次のCOBOLプログラムの説明及びプログラムを読んで、設問1,2に答えよ。

〔プログラムの説明〕  C社では、全従業員の出社時刻と退社時刻を入口のゲートで自動的に記録し、出退勤記録ファイルに格納している。このプログラムは、1か月分の出退勤記録ファイルを読み込み、出社した従業員の勤務管理ファイルに書き込むものである。 (1) 出退勤記録ファイルは、図1に示すレコード様式の順ファイルで、ある月の1か月分の出退勤記録が格納されている。
基本情報技術者試験(平成27年 午後 問10 図1)
 ① レコードは日付、時刻、出退勤フラグの昇順に格納されている。  ② 日付には、年、月、日が、それぞれ4桁、2桁、2桁の西暦で格納されている。  ③ 時刻には、出社又は退社の時刻の時、分が、それぞれ2桁の24時間表記で格納されている。  ④ 出退勤フラグには、出社時は0が、退社時は1が格納されている。  ⑤ 従業員番号には、従業員ごとに一意な6桁の番号が格納されている。  ⑥ 同一従業員の出社時の記録と退社時の記録は、必ず対になっている。同じ日付のレコードは1組だけである。  ⑦ 出社時刻は6時から22時までである。退社時刻は同じ日付の24時までである。
(2) 勤務管理ファイルは、図2に示すレコード様式の従業員番号をキーとする索引ファイルである。
基本情報技術者試験(平成27年 午後 問10 図2)
 ① 勤務履歴1〜31には、当該月の1〜31日の出社時刻及び退社時刻が格納される。出社しなかった日と暦にない日の出社時刻及び退社時刻には、9999が格納される。  ② 出社時刻及び退社時刻には、時、分が、それぞれ2桁の24時間表記で格納される。  ③ 勤務時間には、1か月の勤務時間の合計が、3桁の時間と2桁の分で格納される。毎日の出社時刻から退社時刻までの時間が1日の勤務時間である。途中の休み時間も勤務時間に含める。
基本情報技術者試験(平成27年 午後 問10 プログラム)

設問1:

問題文を見る
 プログラム中のに入れる正しい答えを、解答群の中から選べ。   a, bに関する解答群  ア:PIC 9(2)  イ:PIC 9(3)  ウ:PIC 9(4)  エ:PIC 9(5)  オ:PIC 9(6)   cに関する解答群  ア:INITIALIZE ATD-HST  イ:INITIALIZE ATD-HST REPLACING NUMERIC BY 9999  ウ:MOVE 9999 TO ATD-HST  エ:MOVE ALL ZERO TO ATD-HST   dに関する解答群  ア:ATD-OUT(IDX)  イ:HA  ウ:W-MINUTE  エ:W-TIME-ACCUM

模範解答

a:オ、b:イ、c:イ、d:エ

解説

解答の導き方

この問題では、COBOL(Common Business-Oriented Language:事務処理向けのプログラミング言語)のプログラムにある4か所の空欄について、日付の分解方法、勤務時間の合計方法、新しい従業員の記録の初期化方法を順に考えます。
a:日付を「月」と「日」に分けて取り出します。
プログラムでは、出退勤記録の日付を「MOVE LOG-DATE TO W-DATE」でW-DATEに移し、その後にIDXを使って勤務履歴の位置を指定しています。日付は「年、月、日が、それぞれ4桁、2桁、2桁」で、全体で8桁です。
W-DATEの先頭部分は名前のない項目FILLERで、後半は2桁のIDXです。したがって、先頭のFILLERには年と月の合計6桁が入り、IDXには日の2桁が入ります。FILLERの桁数を指定するPICは、6桁の数字を表すPIC 9(6)です。
たとえば日付が20250403なら、先頭の6桁が202504、IDXが03になります。IDXが3日を示すので、勤務履歴の3番目に時刻を格納できます。
b:月の合計時間を格納できる桁数にします。
勤務管理ファイルの勤務時間について、問題文には「3桁の時間と2桁の分」で格納するとあります。W-TIME-ACCUMは、HAに時間、MAに分を分けて持つ項目です。MAはすでにPIC 9(2)なので、HAには3桁が必要です。
また、後の処理では、合計時間を分に直してから60で割り、時間をHA、余りの分をMAに入れています。したがって、HAの指定はPIC 9(3)になります。
c:新しい従業員の勤務履歴を、未出社の日として初期化します。
勤務管理ファイルは、従業員番号をキーにして記録を探す索引ファイルです。索引ファイルは、キーを使って該当する記録を探せるファイルです。「READ ATD-FILE」の結果が「INVALID KEY」になるのは、その従業員の記録がまだない場合です。
問題文では、「出社しなかった日と暦にない日の出社時刻及び退社時刻には、9999が格納される」とあります。そのため、新しく作る記録の勤務履歴には、出社時刻と退社時刻の両方に9999を入れる必要があります。
ATD-HSTには、31日分の出社時刻と退社時刻が繰り返し格納されています。INITIALIZEは項目を初期化する命令ですが、指定なしでは数値項目は通常ゼロになります。この問題では9999にしたいので、数値項目を指定値で初期化する「INITIALIZE ATD-HST REPLACING NUMERIC BY 9999」が適切です。
その直後に「MOVE ZERO TO ATD-SUM」とあるため、勤務時間の合計は0から始めます。勤務履歴の初期値と勤務時間の初期値は異なるので、別々に設定しています。
d:計算後の勤務時間の合計をATD-SUMに戻します。
出社時の記録では、出社時刻をその日の勤務履歴に格納します。退社時の記録では、退社時刻と、その日の出社時刻を使って勤務時間を計算します。
この計算では、まず「MOVE ATD-SUM TO W-TIME-ACCUM」で、これまでの月間合計をHA(時間)とMA(分)に分けます。その後、次の式で、これまでの合計時間と今日の勤務時間を合わせた合計分数を求めます。
HTとMTは退社時刻の時と分、HFとMFは出社時刻の時と分です。HAとMAは、これまでの合計時間と分です。退社時刻と出社時刻の差に、これまでの合計を加えることで、今月の合計を分単位で計算できます。
例として、これまでの合計が8時間30分で、今日の出社時刻が9時00分、退社時刻が17時45分だとします。
1035分を60で割ると、商は17、余りは15です。続く「DIVIDE W-MINUTE BY 60 GIVING HA REMAINDER MA」によって、HAに17、MAに15が入ります。つまり、更新後の合計は17時間15分です。
更新後の時間と分を持っているのはW-TIME-ACCUMなので、その内容をATD-SUMに移す必要があります。したがって、dにはW-TIME-ACCUMを指定します。ATD-OUT(IDX)はその日の退社時刻だけであり、月間合計ではありません。また、W-MINUTEは合計分数なので、時間と分に分けた後の値を格納する項目とは異なります。

誤りやすいポイント

  • 日付の8桁を均等に分けるのではありません。年と月で6桁、日で2桁に分けるため、FILLERは6桁です。
  • HAは1日の勤務時間だけを格納する項目ではありません。月間の合計時間を持つため、問題文の「3桁の時間」に合わせます。
  • 新しい記録の勤務履歴をゼロで埋めると、未出社を示す9999になりません。出社時刻・退社時刻の未記録を表す値と、勤務時間の合計の初期値を区別してください。
  • 退社時刻を勤務時間の合計として保存するわけではありません。退社時刻と出社時刻から勤務時間を計算し、これまでの合計に加えた値を保存します。

FAQ

Q: なぜ勤務履歴は9999で、勤務時間の合計はゼロで初期化するのですか?
A: 勤務履歴の9999は「その日は出社していない」ことを表す値です。一方、勤務時間の合計は、まだ勤務時間を加えていないため0から始めます。それぞれの目的が異なります。
Q: なぜ勤務時間をいったん分に直すのですか?
A: 分にそろえると、日ごとの勤務時間と、それまでの合計を足し算できます。合計した分数を60で割れば、時間と分に戻せます。
Q: IDXは何に使われますか?
A: 日付から取り出した日を使い、ATD-IN(IDX)やATD-OUT(IDX)の格納位置を決めます。たとえばIDXが3なら、その月の3日分の勤務履歴にアクセスします。

関連キーワード: COBOL、PIC句、索引ファイル、順ファイル、配列、初期化値

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

 C社では22時以降の勤務を深夜手当の対象としている。勤務管理ファイルのレコードに深夜勤務時間の領域を追加し、1か月の深夜勤務時間の合計も集計するようにプログラムを変更する。表1中のに入れる正しい答えを、解答群の中から選べ。ここで、表1中のdには設問1の正しい答えが入っているものとする。
基本情報技術者試験(平成27年 午後 問10 表1)
e, fに関する解答群  ア:ATD-IN(IDX)  イ:ATD-NIGHTSUM  ウ:ATD-OUT(IDX)  エ:ATD-SUM  オ:NIGHT-TIME

模範解答

e:オ、f:イ

解説

解答の導き方

この変更では、退社時刻のうち「22時を過ぎてから退社するまで」の時間を、1か月分合計します。勤務時間全体の合計とは別に計算するため、開始時刻と加算先をそれぞれ考えます。
まず、既存の処理では退社時の記録を処理するとき、行番号69で退社時刻をATD-OUT(IDX)とW-TIME-TOに格納しています。その後、勤務全体の時間を計算しています。
CALC-PROCでは、行番号81で開始時刻から終了時刻までの時間に、すでにたまっている時間を加えています。開始時刻はW-TIME-FROM、終了時刻はW-TIME-TO、計算前までの合計はW-TIME-ACCUMに入っています。計算後の合計は、行番号82でW-TIME-ACCUMの中にある時・分に戻されます。
深夜勤務の計算では、開始時刻を「22時」にします。表1には、22時を表すNIGHT-TIMEが2200として追加されています。退社時刻はすでにW-TIME-TOに入っているので、開始時刻側のW-TIME-FROMにNIGHT-TIMEを入れれば、「22時から退社時刻まで」の時間を計算できます。したがって、eにはNIGHT-TIMEを選びます。
次に、計算した時間をどの合計に加えるかを考えます。勤務全体の合計はATD-SUM、深夜勤務時間の合計はATD-NIGHTSUMです。深夜勤務の計算では、深夜勤務時間の合計にそれまでたまっていた値を引き継ぐ必要があります。そのため、W-TIME-ACCUMに移すのはATD-NIGHTSUMです。よって、fにはATD-NIGHTSUMを選びます。
ATD-OUT(IDX)がNIGHT-TIMEより大きい場合だけ計算する条件も重要です。退社時刻が22時より後でなければ、22時以降の勤務時間はないためです。計算後は、既存の処理と同じように、W-TIME-ACCUMの計算結果をATD-NIGHTSUMに戻します。

誤りやすいポイント

  • 開始時刻にATD-IN(IDX)を選ぶと、22時からではなく出社時刻から退社時刻までを計算することになります。深夜勤務として集計する範囲と一致しません。
  • 加算先にATD-SUMを選ぶと、勤務時間全体の合計を深夜勤務時間の合計に使ってしまいます。両者は別々に集計する値です。
  • 退社時刻だけを使って計算するのではありません。すでに設定されているW-TIME-TOを終了時刻として使い、W-TIME-FROMに深夜勤務の開始時刻を設定します。

FAQ

Q: 退社時刻が22時ちょうどの場合も、深夜勤務時間を計算しますか?
A: 条件はATD-OUT(IDX)がNIGHT-TIMEより大きい場合です。22時ちょうどは2200と同じなので、条件を満たさず、22時以降の勤務時間は加算されません。
Q: なぜW-TIME-ACCUMにATD-NIGHTSUMを移すのですか?
A: CALC-PROCは、開始から終了までの時間だけでなく、W-TIME-ACCUMに入っている既存の合計も加えて計算するためです。深夜勤務時間だけを月ごとに集計するには、深夜勤務時間の合計を引き継ぐ必要があります。
Q: W-TIME-TOに退社時刻を入れる処理を追加しなくてよいのはなぜですか?
A: 退社時の処理の前半で、行番号69が退社時刻をW-TIME-TOに格納しています。追加処理ではその値を終了時刻として使えるため、開始時刻と合計の値を設定すれば計算できます。

関連キーワード: 条件分岐、累積計算、時刻計算、レコード、配列

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

戦国ITクイズ機能

\ せっかくなら /

基本情報技術者を
クイズ形式で学習しませんか?

クイズ画面へ遷移する→

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について