平成11年春2
問12 次のCOBOLプログラムの説明及びプログラムを読んで、設問 1、2に答えよ。
〔プログラムの説明〕
ある国の累積輸出記録ファイルを読み込んで、輸出年月から3年以上経過したレコードを削除して、新累積輸出記録ファイルを作成するプログラムである。
(1) 累積輸出記録ファイル、新累積輸出記録ファイルのレコード様式は、次のとおりである。
輸出年月は、西暦の下2けたの年と2けたの月からなる。
例:1999年 4月ならば“9904”となる。
(2) このプログラムを実行した時点で、輸出年月から3年以上経過したレコードを削除する。
例:プログラム実行年月が99年4月のとき、輸出年月が96年4月以前のレコードを削除する。
〔プログラム〕←クリック
設問1 次の記述中のに入れる正しい答えを、解答群の中から選べ。 このプログラムは、年が西暦の下2けたで表現されているので、西暦2000年以降では正しく動作しない。つまり、年を西暦の下2けたで表現すると1999年は“99”、2000年は“00”となり、日付の大小の逆転や期間計算の誤処理などが発生する。この“2000年問題”の対処方法として、“4けた拡張法”と“ウィンドウ法”がある。 “4けた拡張法”とは、プログラムとファイルの中の年をすべて4けたに変更する方法である。正攻法と言えるが、既存のファイルをすべて作り直す必要があるので、関連するすべてのプログラムと同期をとって一括移行しなければならない。 “ウィンドウ法”とは、ファイル中の年は2けたのままにしておき、プログラム中の比較処理などを4けたの年に変換して行う方法である。変換は、境界年と呼ばれる値を設定して、境界年未満の値には2000を、境界年以上の値には1900を加えて4けたの年とする。例えば、境界年を60とすれば、00〜59は2000〜2059に、60〜99は1960〜1999に変換する。この方法では、処理する範囲が100年を超えるデータは処理できない。 @累積輸出記録ファイルの輸出年月の年を2けたから4けたに変更する。6行目と11行目をそれぞれ次のとおりに変える。
06 05 Y-NEN PIC 9(4). 11 01 N-YUSYUTU-REC PIC X(). A16行目の年を格納する作業領域の長さを、4けたに変える。
16 05 M-NEN PIC 9(4). B21行目のACCEPT文では2けたの年しか取得できない。この行を4けたの年、2けたの月、2けたの日を取得できる関数“CURRENT-DATE”を使用するように変更する。
21 MOVE FUNCTION CURRENT-DATE TO SYORI-BI. (2) このプログラムを“ウィンドウ法”で修正するには、次の変更が必要である。 @境界年を 60として格納した領域を 18行目と 19行目の間に追加する。
01 KYOKAI PIC 9(2) VALUE 60. A2けたの年を含む Y-HIZUKEと MUKO-HIZUKEを4けたの年に変換したY-HIZUKE-Y2KとMUKO-HIZUKE-Y2Kを
@ に続けて追加する。
01 Y-HIZUKE-Y2K. 03 Y-NEN-Y2K PIC 9(4). 03 Y-TUKI-Y2K PIC 9(2). 01 MUKO-HIZUKE-Y2K. 03 M-NEN-Y2K PIC 9(4). 03 M-TUKI-Y2K PIC 9(2). B年の変換処理で使用する変換前後の年を入れる領域を A に続けて追加する。
01 W-NEN2-Y2K PIC 9(2). 01 W-NEN4-Y2K PIC 9(4). C22行目の処理を4けたの年で行うように変更する。
MOVE M-NEN TO W-NEN2-Y2K. PERFORM CONVERT-DATE-RTN. MOVE W-NEN4-Y2K TO M-NEN-Y2K. MOVE M-TUKI TO M-TUKI-Y2K. COMPUTE M-NEN-Y2K = M-NEN-Y2K - 3. D次の処理を行目の直後に追加する。
MOVE Y-NEN TO W-NEN2-Y2K PERFORM CONVERT-DATE-RTN MOVE W-NEN4-Y2K TO Y-NEN-Y2K MOVE Y-TUKI TO Y-TUKI-Y2K E30行目の処理を4けたの年で行うように変更する。
IF F38行目の後に年の変換処理を追加する。
CONVERT-DATE-RTN. IF COMPUTE W-NEN4-Y2K = 2000 + W-NEN2-Y2K ELSE COMPUTE W-NEN4-Y2K = 1900 + W-NEN2-Y2K END-IF. aに関する解答群 bに関する解答群
c、dに関する解答群 ア KYOKAI < W-NEN2-Y2K イ KYOKAI < W-NEN4-Y2K ウ MUKO-HIZUKE > Y-HIZUKE エ MUKO-HIZUKE-Y2K > Y-HIZUKE-Y2K オ M-NEN-Y2K > Y-NEN-Y2K カ Y-HIZUKE > MUKO-HIZUKE キ Y-HIZUKE-Y2K > MUKO-HIZUKE-Y2K ク Y-NEN-Y2K > M-NEN-Y2K ケ W-NEN2-Y2K < KYOKAI コ W-NEN4-Y2K < KYOKAI 設問2 次の記述中のに入れる正しい答えを、解答群の中から選べ。 このプログラムを設問1で説明した“ウィンドウ法”で修正した。次に示す 20レコードからなる累積輸出記録ファイルを指定して、プログラムを西暦2000年4月18日に実行したとすると、年の変換処理(CONVERT-DATE-RTN)は回呼び出され、 累積輸出記録ファイル 9703A1234001345 9703B1234002567 9706A1234001823 9706B1234002600 9712A1234002543 9712B1234002578 9803A1234002832 9803B1234002345 9806A1234003223 9806B1234002243 9812A1234003667 9812B1234001823 9903A1234003800 9903B1234002321 9912A1234004278 9912B1234002532 0002A1234004345 0002B1234002223 0003A1234004832 0003B1234002340 解答群 ア 4 イ 5 ウ 6 エ 7 オ 16 カ 17 キ 18 ク 19 ケ 20 コ 21 |
2000年対応の問題です。当時のソフト会社は、コボルプログラムの2000年対応でガッツリ儲けたんじゃないでしょうかね。私の会社もウハウハでしたから。じゃあ見ていきましょう。
設問1。”4けた拡張法”の問題です。まず4桁拡張法とは何でしょうか?設問1に詳しく書かれていますが、「年」の項目を全て2桁→4桁へ変更する手法です。一番確実な方法ですが全ての入力、出力ファイルの拡張が必要になるため、システム規模によっては、かなり大掛かりな変更作業になります。
んで、まず6行目のY-NENを9(2)から9(4)に変更します。これでたとえば2000年だったらY-NEN=00からY-NEN=2000になるわけです。
11行目も同様に考えればいい。N-YUSYU-REC、つまり出力レコードなんですけど、プログラムのソース内でWRITE命令(31行目)を見れば一目瞭然。入力レコードをそのまま出力しています。入力ファイルであるYUSYUTU-RECを2バイト増やしたのであれば、同様にN-YUSYUTU-RECも15+2=17バイトにすればOk。
よってaには、「カ」の17が正解になります。余裕ですよね。
後はAに書いてあるように作業領域も2バイト→4バイトへ変更し、ACCEPT命令からMOVE FUNCTION命令に変更します。MOVE FUNCTION CURRENT-DATEで、年月日を8桁で取得が可能になります。
さて次にいきましょうか。今度は”ウィンドウ法”での修正方法です。この方法は、従来のレコードデザイン(入力、出力ファイルのレコード様式)には一切手を加えず、プログラム内で無理矢理4桁で計算させる方法です。こういう突貫工事をやると大概あとで泣きをみるんですけどね。まあそれはこの際おいておきましょう。
さてさて、この方法の場合は、まず境界年を設定してあげる必要があります。境界年とは、データの発生年月をある程度考慮し、1900年代のどこかに設定をする年のことを指します。例を挙げて説明した方がわかるかな。
1996年は2桁の項目上、「96」になるわけです。んで2000年は「00」、2004年は「04」になります。ここで境界年を「60」に設定してあげる、と。つまり境界年「60」を基準に「60」より大きければ1990年代、「60」以下なら2000年代というルールを設定するわけです。勿論、これは2060年になれば動作が保証されませんが、その前にCOBOLプログラム自体が残っていないだろう、そんないい加減な手法なんですよ。
設問に戻ります。まず境界年KYOKAIを「60」に設定していますね。
次に入力された年月Y-HIZUKE(年2桁、月2桁)を、4桁変換して利用する年月Y-HIZUKE-Y2K(年4桁、月2桁)を準備します。要するに入力用の年月です。
同様に無効日付MUKO-HIZUKE(年2桁、月2桁)を4桁変換して利用する年月MUKO-HIZUKE-Y2K(年4桁、月2桁)を準備していますね。全くアホらしいですけど。
最後に共通で2桁→4桁の変換用の作業用にW-NEN2-Y2K(2桁)、W-NEN4-Y2K(4桁)の項目を準備しています。ウンコですよ。こんなプログラムは。
Cで何をやってるのか、はたしてわかりますか?ここで無効日付を4桁変換して格納しているのがわかるでしょうか?この一連の処理で年(2桁)→年(4桁)を行ない、結果をMUKO-HIZUKE-Y2Kに格納しています。実際には、「PERFORM CONVERT-DATE-RTN」という共通処理で自動的に2桁→4桁の変換をしてくれます。
Dで問題が出てますね。説明するのもバカらしいんですけど、よく考えればわかるでしょう?無効日付は4桁になったけど、入力日付(輸出年月)はまだ2桁のままです。IF文で条件を訊く前にやらなきゃいけませんよね。従って解答は「オ」の29行目の直後ということになります。
Eは30行目の処理を4桁で行なうように変更ということですが、説明する必要すらないでしょう。ここは解答群の中から選ぶだけです。元々「IF Y-HIZUKE > MUKO-HIZUKE」であることから推理してみれば済む問題です。
そう、「キ」の「Y-HIZUKE-Y2K > MUKO-HIZUKE-Y2K」ですよね。
さて最後のFですけど、この処理が2000年対応のキモになります。ようやく先ほどの境界年(KYOKAI)の出番。ん?おやおや?解答群を見て下さい。「ケ」と「コ」。うーん、どっちにしよっかなぁとか思ってるアナタ!そう、アナタです!これ、どっちだかわかりますか?ヒントはKYOKAIの桁数です。
これは2000年を超えているか否かの判定ですので、当然利用するのは2桁のW-NEN2-Y2Kしかありません。第一、まだW-NEN4-Y2Kには値が入っていないんですから!よって答えは「ケ」になります。
ふー、やっと設問2かぁ…。ちょっと疲れたよ…
じゃあ残り少しですから、ふんばって行きましょう。さてさて”ウィンドウ法”で修正したプログラムで実際にプログラムを起動した結果を求める問題ですか。ふーん、楽勝ですね。
データ件数は20件ということで、「CONVERT-DATE-RTN」が何回処理されるか、という問題。うん、これ引っ掛けですね。
解答欄に「20」とかモロ正解っぽいエサがありますが、ちょっと待ちなさい。私が”ウィンドウ法”で表記し直したソースを用意しておきました。これを見てみましょう。
〔ウィンドウ法修正後プログラム〕←クリック
よく考えればわかりますが、初回(22行目)に無効日付の初回で処理してるんですよ。忘れたとは言わせねえ。だ・か・ら・20回じゃなく21回が正解☆ドッキュン! 解答群では、「コ」
さてやっと最後の問題だ…、もう書くの飽きてきた。
最後は変換処理で演算命令(COMPUTE W-NEN4-Y2K = 2000 + W-NEN2-Y2K)の実行回数を答えろというやつですが。要するに21回処理(上の問題より)する中で、2000年を超える回数を数えればいいだけです。
これは累積輸出記録ファイルを実際に見なければわかりません。どれどれ…
えっとね、頭の2バイトだけ見ればいいんです。そこが「60」以下のレコードが何件ありますか?
そうです、最後の4件だけ。だから答えは「ア」の4ということで。
嘘です。まだある。よく問題を見て考えて下さい。こんな文章があるでしょう。”プログラムを西暦2000年4月18日に実行したとすると〜”
そう、初回の無効日付の処理時にも実はこのロジックを通過してるんですねー。ホント、出題者は豆腐の角に頭でもぶつければいいと思います。なので正解は「イ」の5回となります。
イヤー、冗談抜きで解説は大変面倒くさい。よく解説サイトとかやる気になりますよね。ああ、あっちは広告収入とかで金取ってるんだっけ。あーご褒美が欲しいですなぁ…(独り言)