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

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


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

〔プログラムの説明〕  1993年4月1日に創立したX社では、創立20周年の記念日である2013年4月1日に、勤続年数が0〜20年の全ての従業員に特別給を支給することにした。特別給は、基本給に、表1に示す決定表によって導出される支給係数を掛け合わせて百円未満を切り捨てた金額であり、創立記念日に上司が現金の入った封筒を部下に手渡す。このプログラムは、従業員ファイルに格納されている従業員の情報を読み込み、各従業員への支給金額と、各金種の必要数を支給ファイルに出力する。ここで、金種は1万円紙幣、5千円紙幣、千円紙幣、5百円硬貨、百円硬貨の5種類とする。
基本情報技術者試験(平成25年 午後 問10 表1)
(1) 従業員ファイルは、図1に示すレコード様式の順ファイルである。
基本情報技術者試験(平成25年 午後 問10 図1)
 ① 役職には、一般職の場合は0、管理職の場合は1を格納する。  ② 入社日には、入社した年、月、日を、それぞれ4桁、2桁、2桁の西暦で格納する。表1に示す支給係数の決定表の条件1(勤続年数)は、入社日から2013年4月1日までの経過年数とする。例えば、入社日が2012年4月1日の場合は1年であり、2012年4月2日の場合は0年である。
(2) 支給ファイルは、図2に示すレコード様式の順ファイルである。
基本情報技術者試験(平成25年 午後 問10 図2)
 ① 支給金額には、基本給と支給係数から算出した支給金額を格納する。  ② 金種別必要数には、それぞれの金種の必要数を格納する。ここで、必要数の合計が最少となるようにする。
基本情報技術者試験(平成25年 午後 問10 プログラム)

設問1:

問題文を見る
 プログラム中のに入れる正しい答えを、解答群の中から選べ。   aに関する解答群  ア:E-MMDD < 0401  イ:E-MMDD > 0401  ウ:W-YEAR < 20  エ:W-YEAR >= 20   b, cに関する解答群  ア:ADD 1 TO CNT  イ:ADD CNT TO P-CUR(CNT)  ウ:MOVE CUR-KIND(CNT) TO P-CUR(CNT)  エ:SUBTRACT CUR-KIND(CNT) FROM W-PAY  オ:SUBTRACT P-CUR(CNT) FROM W-PAY

模範解答

a:イ、b:エ、c:ア

解説

解答の導き方

この問題では、空欄aで「勤続年数」を正しく求め、空欄bとcで支給金額を紙幣・硬貨に分ける処理を完成させます。
まず、勤続年数の求め方を確認します。プログラムでは、最初に「2013年から入社年を引く」計算をしています。つまり、入社した年だけを見ると、勤続年数を少し多く数えてしまう場合があります。
入社日が2012年4月2日の場合、年の差は1年ですが、2013年4月1日時点では入社日の1年後にまだ達していません。そのため、勤続年数は0年です。一方、入社日が2012年4月1日なら、1年が経過しているので1年です。
この差を調整するには、入社日の月日が2013年4月1日より後なら、勤続年数から1を引きます。したがって、aには「E-MMDD > 0401」が入ります。0401と同じ日や、それより前の日なら、年の差をそのまま勤続年数にできます。
次に、支給係数は表1に従って決まります。プログラムは、求めた勤続年数を「3年以下」「4~9年」「10年以上」の範囲に分け、さらに役職が一般職か管理職かを組み合わせて支給係数を選びます。
支給金額は基本給に支給係数を掛けて求めた後、百円未満を切り捨てます。支給ファイルの金種別必要数は、支給金額を金種ごとの枚数・個数に分けて記録する欄です。
この処理では、CUR-KIND(CNT)が現在調べている金種を表します。配列(同じ種類の値を順番に並べて扱う仕組み)CUR-KINDには、金種が大きい順に入っています。CNTは、そのうち何番目の金種を見ているかを示す番号です。
CUR-VALUEの値を5桁ずつに分けると、金種は10000、05000、01000、00500、00100の順です。また、CNTは最初に1となるので、最初は最も大きい金種から調べます。
W-PAYには、これから金種に分ける残りの金額が入っています。現在の金種が使える、つまりW-PAYがその金種以上なら、その金種の必要数を1増やし、W-PAYからその金種の金額を引きます。金額を引いた後は、まだ同じ金種が使えるかもしれないため、CNTはそのままにします。よって、bには「SUBTRACT CUR-KIND(CNT) FROM W-PAY」が入ります。
反対に、W-PAYが現在の金種より小さい場合、その金種はもう使えません。次に小さい金種を調べる必要があるため、CNTを1増やします。よって、cには「ADD 1 TO CNT」が入ります。
たとえば、残りが16,700円なら、まず1万円紙幣を1枚使い、残りは6,700円です。次に5千円紙幣を1枚使い、残りは1,700円です。その後も同じように、大きい金種から使えるだけ使っていきます。このように大きい金種から順に処理することで、金種の必要数の合計が最少になるようにします。

誤りやすいポイント

  • 入社年だけで勤続年数を決めないことが大切です。2013年4月1日より後の日付で入社している場合は、まだその年の入社日の到来前なので、1年差し引きます。
  • 入社日が0401と同じ場合は、1年が経過しています。条件は「E-MMDD > 0401」であり、「E-MMDD >= 0401」ではありません。
  • 金種を1枚使った後に、すぐ次の金種へ進むわけではありません。まず現在の金種を使えるだけ使い、使えなくなったときに次の金種へ進みます。
  • bとcの役割を混同しないようにします。bは残り金額を減らす処理、cは次の金種へ移る処理です。
  • 必要数を増やす対象はP-CUR(CNT)です。CNTは金額ではなく、現在扱っている金種の位置を示します。

FAQ

Q: なぜ、最初から一番小さい金種を使わないのですか?
A: 小さい金種を先に使うと、必要な枚数・個数が増えてしまうことがあるためです。このプログラムでは、大きい金種から使えるだけ使って、必要数の合計を最少にします。
Q: W-PAYとP-PAYは何が違いますか?
A: P-PAYは従業員に支給する金額です。W-PAYは、その金額を金種に分ける処理の中で、まだ金種に置き換えられていない残りの金額です。
Q: CNTは何を表していますか?
A: 金種を並べた表の何番目を見ているかを表します。CNTが1なら最初の金種を、CNTが2なら次の金種を調べます。

関連キーワード: COBOL、決定表、配列、貪欲法、順ファイル

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

この設問をAIに質問する

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

 プログラム中の、支給係数を求めるEVALUATE文について、正しく判定できることを確認するために、従業員ファイルのテストデータを作成した。全ての選択対象(WHEN指定に書かれた作用対象を指す)について真を判定できる組合せを、解答群の中から選べ。ここで、解答群では見やすくするために項目の区切りに“,”を挿入しているが、実際のデータ中には存在しない。   解答群  ア:   000001,0,20100901,117000   000002,1,20100401,121000   000003,0,20060401,151000   000004,1,20020901,192000   000005,0,20000401,198000   000006,1,19980401,254000  イ:   000001,0,20110401,115000   000002,1,20110901,132000   000003,0,20060401,151000   000004,1,20060401,186000   000005,0,20010401,195000   000006,1,19970901,223000  ウ:   000001,0,20120401,102000   000002,1,20080901,132000   000003,0,20070401,151000   000004,1,20050901,186000   000005,0,20040401,188000   000006,1,20010901,223000  エ:   000001,0,20120901,110800   000002,1,20100401,132000   000003,0,20080401,151000   000004,1,20020901,176000   000005,0,20010401,198000   000006,1,19950901,254000

模範解答

イ

解説

解答の導き方

この設問では、EVALUATE文(条件に合う処理を選ぶCOBOLの分岐文)に書かれた6つのWHEN条件を、それぞれ真にする従業員データがそろっている選択肢を探します。
まず、勤続年数の求め方を確認します。47行目で「2013 - E-YEAR」を計算し、入社日の月日が0401より大きい場合は、49行目で勤続年数を1減らします。比較するのは入社日全体と2013年4月1日ではなく、入社日の月日と0401です。
例えば、入社日が2011年9月1日の場合、年の差は「2013 - 2011 = 2」です。しかし、月日の0901は0401より大きいので、1を引き、勤続年数は1年になります。一方、入社日が2011年4月1日の場合は、月日が0401と等しいため、1は引きません。
また、役職は一般職が0、管理職が1です。プログラム中の条件名は、UPTO-3が0〜3年、UPTO-9が4〜9年、UPTO-20が10〜20年を表しています。これらをWHEN条件に当てはめると、確認すべき組合せは次の6つです。
WHEN条件勤続年数と役職
UPTO-3 AND NON-MANAGER0〜3年、一般職
UPTO-3 AND MANAGER0〜3年、管理職
UPTO-9 AND NON-MANAGER4〜9年、一般職
UPTO-9 AND MANAGER4〜9年、管理職
UPTO-20 AND NON-MANAGER10〜20年、一般職
UPTO-20 AND MANAGER10〜20年、管理職
0.10と0.15の支給係数には、それぞれ2つのWHEN条件があります。隣り合うWHEN条件は同じ処理につながっていますが、どちらの条件も別々に真になるデータが必要です。
選択肢イのデータで勤続年数を計算すると、次のようになります。
従業員番号役職入社日勤続年数の計算該当するWHEN条件
0000010201104012013 - 2011 = 2。0401は0401より大きくないので、2年UPTO-3 AND NON-MANAGER
0000021201109012013 - 2011 = 2。0901は0401より大きいので、2 - 1 = 1年UPTO-3 AND MANAGER
0000030200604012013 - 2006 = 7。0401は0401より大きくないので、7年UPTO-9 AND NON-MANAGER
0000041200604012013 - 2006 = 7。0401は0401より大きくないので、7年UPTO-9 AND MANAGER
0000050200104012013 - 2001 = 12。0401は0401より大きくないので、12年UPTO-20 AND NON-MANAGER
0000061199709012013 - 1997 = 16。0901は0401より大きいので、16 - 1 = 15年UPTO-20 AND MANAGER
このように、選択肢イには6つのWHEN条件すべてに当てはまるデータがあります。
ほかの選択肢では、次の条件を満たすデータが不足しています。
  • アとエには、4〜9年の管理職に当たるデータがありません。
  • ウには、0〜3年の管理職と、10〜20年の一般職に当たるデータがありません。
したがって、すべてのWHEN条件を確認できる組合せはイです。

誤りやすいポイント

  • 入社日全体を2013年4月1日と比べて、勤続年数を調整しないでください。プログラムで比べるのは、入社日の月日と0401です。
  • 月日が0401と等しい場合は、勤続年数を減らしません。1を引くのは、月日が0401より大きい場合です。
  • 支給係数が同じでも、隣り合うWHEN条件は別々に確認します。例えば、0.10の処理につながる2つの条件の両方を真にするデータが必要です。
  • 役職の値は、一般職が0、管理職が1です。値を逆にすると、勤続年数が合っていても別のWHEN条件に当てはまります。

FAQ

Q: 入社日が2011年9月1日の場合、なぜ勤続年数は2年ではなく1年ですか?
A: 年の差は2年ですが、入社日の月日0901が基準の0401より後です。そのため、まだ入社日の2回目の記念日を迎えておらず、1を引いた1年になります。
Q: 支給係数が同じでも、WHEN条件ごとにデータが必要なのはなぜですか?
A: この設問では、係数の種類だけでなく、それぞれのWHEN条件が真になることを確認します。別々の条件に対して、それぞれ当てはまるデータを用意します。
Q: 月日が0401ちょうどの場合は、なぜ1を引かないのですか?
A: 2013年4月1日を基準にしたとき、入社日の月日も0401なら、その年の入社日を迎えています。したがって、年の差がそのまま経過年数になります。

関連キーワード: COBOL、EVALUATE文、88レベル条件名、経過年数、順ファイル

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

この設問をAIに質問する

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

 金融機関に現金を用意してもらうために、金種ごとの必要数を集計して、図3に示すとおり画面に表示するようプログラムを変更する。表2中のに入れる正しい答えを、解答群の中から選べ。
基本情報技術者試験(平成25年 午後 問10 図3)
基本情報技術者試験(平成25年 午後 問10 表2)
dに関する解答群  ア:行番号42と43の間に追加  イ:行番号44と45の間に追加  ウ:行番号46と47の間に追加  エ:行番号66と67の間に追加   eに関する解答群  ア:ADD 1 TO CUR-TOTAL(CNT)  イ:ADD CUR-KIND(CNT) TO CUR-TOTAL(CNT)  ウ:ADD P-CUR(CNT) TO CUR-TOTAL(CNT)  エ:ADD P-PAY TO CUR-TOTAL(CNT)

模範解答

d:イ、e:ウ

解説

解答の導き方

このプログラムは、COBOL(Common Business-Oriented Language:事務処理向けのプログラミング言語)で書かれています。メイン処理では、従業員ファイルを1人分ずつ読み込み、支給金額を計算し、金種ごとの必要数を求めてから支給ファイルに書き込みます。
まず、金種ごとの合計をどこで加算するかを考えます。
金種ごとの必要数を求めるのは、CUR-PROCです。行番号67で、現在の従業員の必要数を入れるP-CUR-TBLを初期化しています。その後、行番号70からの処理で支給金額を各金種に分け、P-CUR(CNT)に現在の従業員が必要とする枚数・個数を記録します。
一方、追加されたCUR-TOTALは、全従業員分の金種ごとの合計を入れるための項目です。CUR-TOTALは作業領域にあり、最初に0に設定された後、従業員ごとの処理を通じて値を保ちます。
したがって、現在の従業員の必要数がすべてP-CURに入った後で、金種ごとに加算します。行番号77の後ろに追加する処理は、次の形です。
ADD P-CUR(CNT) TO CUR-TOTAL(CNT)
ADD A TO Bは、BにAを加える処理です。CNTを1から5まで変えながら処理することで、各金種について、現在の従業員の必要数を累計に加えられます。このため、eには、P-CUR(CNT)をCUR-TOTAL(CNT)に加える処理を入れます。
ほかの選択肢では、ADD 1 TO CUR-TOTAL(CNT)は従業員ごとに毎回1だけ加算してしまいます。金種の金額を加える処理や、支給金額全体を加える処理でも、必要数の合計にはなりません。
次に、合計をいつ画面に表示するかを考えます。
本文には「金種ごとの必要数を集計して、図3に示すとおり画面に表示」とあります。画面に表示するのは、全従業員分の集計が終わった後でなければなりません。
メイン処理では、行番号36からの繰返しで従業員を順に読み込み、各人についてCUR-PROCを実行します。ファイルの終わりまで処理すると、この繰返しを抜け、行番号44でファイルを閉じます。その後、プログラムが終了する行番号45の前に表示処理を置けば、全従業員分の集計が終わった状態で表示できます。
その位置は、行番号44と45の間です。ここに表示処理を置けば、CUR-KIND-X(CNT)とCUR-TOTAL-X(CNT)を使って、金種とその合計を順に画面に出せます。REDEFINESは、同じデータを別の形式で扱うための指定です。このプログラムでは、金種や合計を表示用の文字として扱うために使っています。

誤りやすいポイント

  • P-CUR(CNT)は、現在処理している従業員の金種別必要数です。全従業員分の合計を保持するCUR-TOTAL(CNT)とは役割が異なります。
  • P-CUR-TBLは従業員ごとに初期化しますが、CUR-TOTALは累計に使うため、従業員ごとに初期化してはいけません。
  • 画面表示を従業員ごとの繰返しの中に置くと、途中までの合計を表示してしまいます。最終的な合計を表示するには、全員分の処理が終わった後に置きます。
  • CNTは金種を順に指定するための値です。従業員の人数を数える値ではありません。

FAQ

Q: なぜP-CUR-TBLは従業員ごとに初期化するのですか?
A: P-CUR-TBLには、現在の従業員に支給する金種別必要数を入れるためです。前の従業員の数が残らないように、毎回初期化します。
Q: なぜ支給金額のP-PAYではなく、P-CUR(CNT)を加算するのですか?
A: 求めたいのは金種ごとの必要数の合計だからです。P-PAYは金額、P-CUR(CNT)は金種ごとの枚数・個数を表します。
Q: 画面表示を従業員ファイルの繰返しの中に置くと、どうなりますか?
A: その時点までに処理した従業員の合計が表示されます。全員分の合計を表示するには、繰返しが終わってから表示します。

関連キーワード: COBOL、順ファイル、配列、REDEFINES、累積集計

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

この設問をAIに質問する

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

戦国ITクイズ機能

\ せっかくなら /

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

クイズ画面へ遷移する→

すぐに利用可能!

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

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