FC2ブログ

記事一覧

平成17年春期基本情報技術者試験午後問11、COBOL言語

本ページは平成17年春期基本情報技術者試験午後問11、COBOL言語の解説です。
問題文、解答、解説の順で掲載しております。
**************************************************
無料から学べる講座
http://ai-light.com/itkeiei/

ニコニコチャンネル
http://ch.nicovideo.jp/ai-light

YouTubeチャンネル
https://www.youtube.com/user/ailightcom

Access・Excel倶楽部
http://ai-light.com/accessclub/

株式会社アイライト公式HP
http://www.ai-light.com/
(Access・Excelでシステム開発会社を探されている法人様はこちら)
**************************************************

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

〔プログラムの説明〕

ローン条件情報を受け取り,“返済回数指定の月払元金均等方式”で,ローン返済計画書を出力するサブプログラムである。

返済回数指定の月払元金均等方式とは,元金部分は返済回数による均等額,利息部分は元金残高に利率を乗じて算出し,それらの合計を毎月の返済額とする返済方式である。

(1) ローン条件情報(COND-R)のレコード様式は,次のとおりである。

ローン借入日
8けた
年利
5けた
毎月返済日
2けた
初回返済日
8けた
ローン元金
11けた
返済回数
3けた


① ローン借入日及び初回返済日は,4けたの西暦年,2けたの月,2けたの日で構成される8けたの日付とする(例:2005年7月1日の場合は,20050701)。

② 毎月返済日は,1~31の値とする。返済日に対応する日が存在しない月は,月末の日を返済日とする。

③ 年利は,%を単位とし,整数部2けた小数部3けたで構成される5けたの数値とする (例:年利5.0%の場合は05000)。 返済回数は1~420とする。

④ ローン条件情報で与えられたデータには,誤りがないものとする。

(2) ローン返済計画書の出力例を次に示す。

借入日=2005/06/01  毎月返済日=31 年利= 5.000% ローン元金= 5,000,000円
回数  返済日  日数  元金部分  利息部分  返済額  残高
1 2005/06/30 30 555,556 20,547 576,103 4,444,444
2 2005/07/31 31 555,556 18,873 574,429 3,888,888
3 2005/08/31 31 555,556 16,514 572,070 3,333,332
4 2005/09/30 30 555,556 13,698 569,254 2,777,776
5 2005/10/31 31 555,556 11,796 567,352 2,222,220
6 2005/11/30 30 555,556 9,132 564,688 1,666,664
7 2005/12/31 31 555,556 7,077 562,633 1,111,108
8 2006/01/31 31 555,556 4,718 560,274 555,552
9 2006/02/28 28 555,552 2,130 557,682 0
     273 5,000,000 104,485 5,104,485

ローン返済計画書の見出し部分(出力例の1,2行目)は,あらかじめ印字されているものとする。

(3) 毎月返済額の元金部分及び利息部分の計算は,次のように行う。

① 毎月の元金返済に充てる金額は,“ローン元金÷返済回数”で求める。この元金返済部分を,毎月の返済ごとにローン元金から減算し,ローン元金残高を更新する。

② “ローン元金÷返済回数”が割り切れない場合,毎月の元金返済額は小数点以下を切上げとし,最終回の元金返済額は次の端数の金額となる。

   端数=ローン元金-毎月元金返済額×(返済回数-1 )

③ 毎月の利息は,“ローン元金残高×(年利÷100)×日数÷365”で求め,割り切れない場合は切り捨てる。ここで日数は,最初の返済の場合はローン借入日から初回返済日までの日数,2回目以降は前回返済日の翌日から当月返済日までの日数とする。

(4) 関数 INTEGER-OF-DATE は,8けたの日付をグレゴリオ暦で1601年1月1日を1とする通算日に変換した整数値を返す。

(5) 日付が正しいかどうかを調べるために,副プログラム DATECHK を使用する。
DATECHK は,与えられた日付がカレンダーにある正しい日付かどうかを調べ,正しければ0,正しくなければ1を結果に返す。DATECHK の呼出し方法は,次のとおりである。

CALL "DATECHK" USING 日付 結果

〔プログラム〕
(行番号)
1 DATA DIVISION.
2 FILE SECTION.
3 FD PRINT-F EXTERNAL.
4 01 PRINT-R PIC X(128).
5 WORKING-STORAGE SECTION.
6 01 W-KAISU PIC 9(04).
7 01 W-AMARI PIC 9(05).
8 01 W-GANKIN-KINTOU PIC 9(15).
9 01 W-GANKIN-HASUU PIC 9(15).
10 01 W-REC.
11 05 W-NISSU PIC 9(04).
12 05 W-GANKIN PIC 9(15).
13 05 W-RISOKU PIC 9(15).
14 05 W-HENSAI-GAKU PIC 9(15).
15 05 W-ZANDAKA PIC 9(15).
16 01 MEI-R.
17 05 M-KAISU PIC ZZZ9.
18 05 FILLER PIC X(03).
19 05 M-HENSAI-YMD PIC 9999/99/99.
20 05 FILLER PIC X.
21 05 M-NISSU PIC ZZZZ9.
22 05 FILLER PIC X.
23 05 M-GANKIN PIC ZZZ,ZZZ,ZZ9.
24 05 FILLER PIC X.
25 05 M-RISOKU PIC ZZZ,ZZZ,ZZ9.
26 05 FILLER PIC X.
27 05 M-HENSAI-GAKU PIC ZZZ,ZZZ,ZZ9.
28 05 FILLER PIC X.
29 05 M-ZANDAKA PIC ZZZ,ZZZ,ZZ9.
30 01 GOUKEI.
31 05 G-NISSU PIC 9(05).
32 05 G-GANKIN PIC 9(15).
33 05 G-RISOKU PIC 9(15).
34 05 G-HENSAI-GAKU PIC 9(15).
35 01 W-HENSAI-YMD PIC 9(08).
36 01 W-HENSAI-YMD-R REDEFINES W-HENSAI-YMD.
37 05 W-HENSAI-YY PIC 9(04).
38 05 W-HENSAI-MM PIC 9(02).
39 05 W-HENSAI-DD PIC 9(02).
40 01 JDATE1 PIC 9(15).
41 01 JDATE2 PIC 9(15).
42 01 W-RETCD PIC 9.
43 LINKAGE SECTION.
44 01 COND-R.
45 03 CD-KARIIRE-YMD PIC 9(08).
46 03 CD-NENRI PIC 9(02)V9(03).
47 03 CD-MAITSUKI-DD PIC 9(02).
48 03 CD-SHOKAI-YMD PIC 9(08).
49 03 CD-GANKIN PIC 9(11).
50 03 CD-KAISU PIC 9(03).
51 PROCEDURE DIVISION USING COND-R.
52 MAIN-RTN.
53 PERFORM INIT-RTN.
54 PERFORM LOAN-RTN{ a } .
55 PERFORM GOUKEI-PRINT.
56 EXIT PROGRAM.
57 INIT-RTN.
58 INITIALIZE GOUKEI.
59 DIVIDE CD-GANKIN BY CD-KAISU GIVING W-GANKIN-KINTOU
60 REMAINDER W-AMARI.
61 IF W-AMARI > 0 THEN
62 ADD 1 TO W-GANKIN-KINTOU
63 END-IF.
64 COMPUTE W-GANKIN-HASUU = CD-GANKIN -
65 W-GANKIN-KINTOU * (CD-KAISU - 1).
66 LOAN-RTN.
67 IF W-KAISU = 1 THEN
68 * 最初の返済時
69 MOVE CD-GANKIN TO W-ZANDAKA
70 MOVE CD-SHOKAI-YMD TO W-HENSAI-YMD
71 COMPUTE JDATE1 =
72 FUNCTION INTEGER-OF-DATE(CD-KARIIRE-YMD)
73 COMPUTE JDATE2 =
74 FUNCTION INTEGER-OF-DATE(CD-SHOKAI-YMD)
75 COMPUTE W-NISSU = { b }
76 ELSE
77 * 2 回目以降の返済時
78 COMPUTE JDATE1 =
79 FUNCTION INTEGER-OF-DATE(W-HENSAI-YMD)
80 PERFORM NEXT-HENSAIBI-RTN
81 COMPUTE JDATE2 =
82 FUNCTION INTEGER-OF-DATE(W-HENSAI-YMD)
83 COMPUTE W-NISSU = { c }
84 END-IF.
85 COMPUTE W-RISOKU = { d }.
86 IF W-KAISU = CD-KAISU
87 MOVE W-GANKIN-HASUU TO W-GANKIN
88 ELSE
89 MOVE W-GANKIN-KINTOU TO W-GANKIN
90 END-IF.
91 COMPUTE W-HENSAI-GAKU = W-RISOKU + W-GANKIN.
92 SUBTRACT W-GANKIN FROM W-ZANDAKA.
93 MOVE SPACE TO MEI-R.
94 MOVE W-KAISU TO M-KAISU.
95 MOVE W-HENSAI-YMD TO M-HENSAI-YMD.
96 MOVE W-NISSU TO M-NISSU.
97 MOVE W-GANKIN TO M-GANKIN.
98 MOVE W-RISOKU TO M-RISOKU.
99 MOVE W-HENSAI-GAKU TO M-HENSAI-GAKU.
100 MOVE W-ZANDAKA TO M-ZANDAKA.
101 WRITE PRINT-R FROM MEI-R.
102 ADD W-NISSU TO G-NISSU.
103 ADD W-GANKIN TO G-GANKIN.
104 ADD W-RISOKU TO G-RISOKU.
105 ADD W-HENSAI-GAKU TO G-HENSAI-GAKU.
106 NEXT-HENSAIBI-RTN.
107 * 翌月の返済日を求める
108 MOVE CD-MAITSUKI-DD TO W-HENSAI-DD.
109 ADD 1 TO W-HENSAI-MM.
110 IF W-HENSAI-MM > 12 THEN
111 ADD 1 TO W-HENSAI-YY
112 MOVE 1 TO W-HENSAI-MM
113 END-IF.
114 * 月末の存在しない日付の調整
115 MOVE 1 TO W-RETCD.
116 PERFORM UNTIL W-RETCD = 0
117 CALL "DATECHK" USING W-HENSAI-YMD W-RETCD
118 IF W-RETCD NOT = 0 THEN
119 { e }
120 END-IF
121 END-PERFORM.
122 GOUKEI-PRINT.
123 MOVE SPACE TO MEI-R.
124 MOVE G-NISSU TO M-NISSU.
125 MOVE G-GANKIN TO M-GANKIN.
126 MOVE G-RISOKU TO M-RISOKU.
127 MOVE G-HENSAI-GAKU TO M-HENSAI-GAKU.
128 WRITE PRINT-R FROM MEI-R.


設問1 プログラム中の{ }に入れる正しい答えを,解答群の中から選べ。

a に関する解答群

ア CD-KAISU TIMES
イ VARYING W-KAISU FROM 1 BY 1 UNTIL W-KAISU < CD-KAISU
ウ VARYING W-KAISU FROM 1 BY 1 UNTIL W-KAISU = CD-KAISU
エ VARYING W-KAISU FROM 1 BY 1 UNTIL W-KAISU > CD-KAISU

b,c に関する解答群

ア JDATE2 + JDATE1    イ JDATE2 - CD-SHOKAI-YMD
ウ JDATE2 - JDATE1    エ JDATE2 - JDATE1 + 1
オ JDATE2 - W-HENSAI-YMD

d に関する解答群

ア CD-GANKIN * JDATE2 * CD-NENRI / 100 / 365
イ CD-GANKIN * W-NISSU * CD-NENRI / 100 / 365
ウ W-ZANDAKA * JDATE2 * CD-NENRI / 100 / 365
エ W-ZANDAKA * W-NISSU * CD-NENRI / 100 / 365

e に関する解答群

ア ADD   1 TO  W-HENSAI-DD
イ ADD   1 TO  W-HENSAI-YY
ウ SUBTRACT 1 FROM W-HENSAI-DD
エ SUBTRACT 1 FROM W-HENSAI-MM

設問2 このプログラムでは,ローン元金が返済回数で割り切れない場合の端数調整を最終回の返済で行っている。パラメタ指定によって初回の返済でも調整できるようにプログラムを変更したい。行番号50と51の間に次の行を挿入し,ローン条件情報に端数調整方法を追加する。この値が1のときは初回調整,0のときは最終回調整とする。

   03 CD-HASUU     PIC  9.

あわせて,プログラム中の行番号 86を変更すべき内容として正しい答えを,解答群の中から選べ。

初回調整の場合のローン返済計画書の出力例を,次に示す。

借入日=2005/06/01  毎月返済日=31 年利= 5.000% ローン元金= 5,000,000円
回数 返済日 日数 元金部分 利息部分 返済額 残高
1 2005/06/30 30 555,552 20,547 576,099 4,444,448
2 2005/07/31 31 555,556 18,873 574,429 3,888,892
3 2005/08/31 31 555,556 16,514 572,070 3,333,336
4 2005/09/30 30 555,556 13,698 569,254 2,777,780
5 2005/10/31 31 555,556 11,796 567,352 2,222,224
6 2005/11/30 30 555,556 9,132 564,688 1,666,668
7 2005/12/31 31 555,556 7,077 562,633 1,111,112
8 2006/01/31 31 555,556 4,718 560,274 555,556
9 2006/02/28 28 555,556 2,130 557,686 0
    273 5,000,000 104,485 5,104,485

解答群

ア IF CD-HASUU = 0 AND W-KAISU = CD-KAISU THEN
イ IF CD-HASUU = 1 AND W-KAISU = 1 THEN
ウ IF CD-HASUU = 0 AND W-KAISU = CD-KAISU AND
    CD-HASUU = 1 AND W-KAISU = 1 THEN
エ IF CD-HASUU = 0 AND W-KAISU = CD-KAISU OR
    CD-HASUU = 1 AND W-KAISU = 1 THEN
オ IF W-AMARI NOT = 0 OR
    CD-HASUU = 0 AND W-KAISU = CD-KAISU OR
    CD-HASUU = 1 AND W-KAISU = 1 THEN

参考文献
PERFORM TIMES
http://tallercolibri.com/archives/101

SUBTRACT
http://ksprog.okoshi-yasu.com/cobol.html
http://www16.plala.or.jp/hiyokogumi/dic/a_subtract.html

**************************************************
無料から学べる講座
http://ai-light.com/itkeiei/

ニコニコチャンネル
http://ch.nicovideo.jp/ai-light

YouTubeチャンネル
https://www.youtube.com/user/ailightcom

Access・Excel倶楽部
http://ai-light.com/accessclub/

株式会社アイライト公式HP
http://www.ai-light.com/
(Access・Excelでシステム開発会社を探されている法人様はこちら)
**************************************************
********************************************************************************
解答
設問1
答 aエ 答 bエ 答 cウ 答 dエ 答 eウ

設問2
答 エ
********************************************************************************

解説
51行目のPROCEDURE DIVISIONから内容を確認する。
53行目のPERFORM INIT-RTNより、57 行目のINIT-RTNに処理が移動する。
58行目のINITIALIZE GOUKEIで、GOUKEIを初期化する。INITIALIZEは、数値項目を「0」にして、英数字項目をブランクにする。
59・60行目のDIVIDE CD-GANKIN BY CD-KAISU GIVING W-GANKIN-KINTOU
REMAINDER W-AMARI.で
CD-GANKIN÷CD-KAISUの商をW-GANKIN-KINTOUに余りをW-AMARIにセットする。

61 IF W-AMARI > 0 THEN
62 ADD 1 TO W-GANKIN-KINTOU
63 END-IF.
で、上記の割り算の計算で余りがある時は、割り算の商であるW-GANKIN-KINTOUに1を足している。これは、問題文の「②“ローン元金÷返済回数”が割り切れない場合,毎月の元金返済額は小数点以下を切上げとし・・・」の部分に該当する処理を行っている。

64・65行目のCOMPUTE W-GANKIN-HASUU = CD-GANKIN -
  W-GANKIN-KINTOU * (CD-KAISU - 1)
では、端数=ローン元金-毎月元金返済額×(返済回数-1 )の計算を行っている。

{ a }
54行目の{ a }の関して、解答群を確認するとすべて繰返し条件となっているが、
LOAN-RTNの処理内容次第なので、{ a }の解答を考える前に、LOAN-RTNの処理内容を読み進めことにする。

67・68行目のIF W-KAISU = 1 THEN
* 最初の返済時
より、W-KAISUが返済回数を示し、ここではローン返済計画書を作成していると推測できる。* の行はコメント行(プログラムの処理には関係のないプログラムの補足説明)である。

W-KAISUはWORKING-STORAGE SECTION内で与えられる変数であるが、68行目より前の処理ではW-KAISUの値は与えられていない。よって、{ a }の解答はエでとなる。

{ a }の解答群のア CD-KAISU TIMESは、CD-KAISU回数分ループする命令である。詳細は参考文献をご確認ください。ループ回数は正しいが、W-KAISUに値がセットされないため、不適切な解答である。

{ b }
W-NISSUはその後の処理で
96 MOVE W-NISSU TO M-NISSU.
96行目でM-NISSUに値をセットして、
101 WRITE PRINT-R FROM MEI-R.
101行目でローン返済計画書に出力されている。

M-NISSUは16~29行目を確認すると3列目の項目でローン返済計画書の3列目は、日数を示している。

また、問題文より「日数は,最初の返済の場合はローン借入日から初回返済日までの日数」とのことであるから、解答はエとなる。

日数を計算する時に、CD-SHOKAI-YMDからCD-KARIIRE-YMDを直接にマイナスして求めることができないので、問題文にあるように「関数 INTEGER-OF-DATE は,8けたの日付をグレゴリオ暦で1601年1月1日を1とする通算日に変換した整数値を返す。」で示された関数を使用して、一旦、基準日からの通算日の整数日を求めて、そこから引き算をして求める必要がある。それらの計算は、71~75行目で行われている。

79行目のW-HENSAI-YMDに関して、2回目の返済データを求める時、つまりはW-KAISU = 2の場合について検討する。W-KAISU = 1の時、
70行目にて、W-HENSAI-YMDには初回返済日がセットされている。

80行目より、処理が106行目に移る。
107行目のコメントより、NEXT-HENSAIBI-RTNの箇所は、翌月の返済日を求めていることがわかる。

108行目より、CD-MAITSUKI-DDをW-HENSAI-DDにセットしている。
CD-MAITSUKI-DD は43行目以下のLINKAGE SECTIONの項目であり、問題文より、COND-Rの3項目は毎月返済日を表している。

109行目より、W-HENSAI-MMに+1をしている。これは翌月の返済月を求めるためである。従って、100行目でW-HENSAI-MMが12を超えた時は年が変わったことを表しているので、101行目で年に+1をして、102行目で1月になったということで、W-HENSAI-MMに1をセットしている。

{ e }
114行目のコメントより、以降の処理は月末の存在しない日付の調整を行っている。問題文より「毎月返済日は,1~31の値とする。返済日に対応する日が存在しない月は,月末の日を返済日とする。」とあり、例えば、毎月返済日に31と記入されている場合、2月が28日までしかない時は、28を求めなければならない。

117行目は、問題文より「DATECHK は,与えられた日付がカレンダーにある正しい日付かどうかを調べ,正しければ0,正しくなければ1を結果に返す。」である。よって、結果が正しくない場合には、W-RETCDに1がセットされる。

118行目で結果が正しくない場合には、返済日から正しい日付になるまでカウントダウンしていけば、末日を求められる。よって、解答は、ウとなる。
SUBTRACTは引き算を表し、ここでは、W-HENSAI-DDから1を引いた値を
W-HENSAI-DDにセットしている。

{ c }
{ b }と同様に返済の日数の計算である。問題文より、「前回返済日の翌日から当月返済日までの日数とする。」とのことであるから、解答は、ウとなる。

{ d }
85行目でW-RISOKUの値を求めているが、この値は、98行目でM-RISOKUにセットされ、101行目で出力されている。
M-RISOKUは16~29行目のデータ定義でFILLER は空白を意味しているから、M-RISOKUは5列目の項目である。出力結果であるローン返済計画書より5列目は利息を表している。

利息の計算は、問題文より「ローン元金残高×(年利÷100)×日数÷365」で求められる。

さらに、問題文より「元金返済部分を,毎月の返済ごとにローン元金から減算し,ローン元金残高を更新する。」とあり、この計算は92行目で行われている。よって、解答はエとなる。

dの解答群にあるア・イでは、CD-GANKINを用いて計算を行っているが、CD-GANKINは初期の元金であるから、解答して相応しくない。

設問2
86行目では、W-KAISU = CD-KAISUの時に端数の値をセットしている。CD-KAISUは返済回数であり、W-KAISUは現在、プログラムで計算している返済回数である。これが等しい時は、返済が最終回であることを示している。

返済が最終回の時は設問文よりCD-HASUUが0のときである。よって、最終回に端数を出力する条件は、
IF CD-HASUU = 0 AND W-KAISU = CD-KAISU
となる。

同様にして、初回の場合は、W-KAISU が1で、CD-HASUUが1の時である。上記のどちらかが成立する時に、端数の値を使用するので、解答はエとなる。

参考:平成17年春期基本情報技術者試験午後問11

**************************************************
無料から学べる講座
http://ai-light.com/itkeiei/

ニコニコチャンネル
http://ch.nicovideo.jp/ai-light

YouTubeチャンネル
https://www.youtube.com/user/ailightcom

Access・Excel倶楽部
http://ai-light.com/accessclub/

株式会社アイライト公式HP
http://www.ai-light.com/
(Access・Excelでシステム開発会社を探されている法人様はこちら)
**************************************************
関連記事

コメント

コメントの投稿

非公開コメント

adwords

外部リンク

カテゴリーメニュー 改

当社のシステム開発の詳細

当社はaccess-excelでの小規模システム開発を中心に年間に50社以上の開発実績がございます。詳細は06-6599-8890ないしinfo@ai-light.comまで今すぐお問合せください

メールフォーム

こちらからも簡単にメールを送付できます。当社のサービスに関してご質問がございましたら、よろしければ、ご利用ください。直接お電話の場合は06-6599-8890までご連絡ください。

名前:
メール:
件名:
本文:

検索フォーム

広告

最新記事

Lc.ツリーカテゴリー

全記事表示リンク

プロフィール

itkeieinews

Author:itkeieinews
ITと経営ニュースへようこそ!
アイライトIT経営研究会
株式会社アイライト
電話でのお問合せは06-6599-8890
Email:info@ai-light.com

お気に入り

本サイトをそのまま消してしまうと、もう探せなくなってしまうかもしれません。 当社はいずれお役に立てることがあるかと思いますので、よろしければお気に入りにご登録ください。

ブロとも申請フォーム