AOBA's Information Processing Education
1998/06/28
注意1:このページは、回線を切断した後でゆっくりご覧になってください(テキストを印刷する場合は、その取り扱いに注意してください)。
注意2:背景が白地の画面を長時間見つめていると頭が痛くなってしまいますので、ここは背景をグレーにしています。
「平成7年第2種 秋期 午後 問2」 問2 次の流れ図の説明及び流れ図を読んで、設問1,2に答えよ。
[流れ図の説明]
ある店舗において、指定された月の休業日の日数を算出する流れ図である。
- この店舗の休業日は、日曜日及び祝日である。ただし、日曜日が祝日に重なった際の振替休日は、休業日としない。
- 指定される項目は次のとおりである。
- 月区分 : 月を1〜12の整数で表す。
- 曜日区分 : 月初めの曜日を、次の整数で表す。
1:月曜,2:火曜,3:水曜,4:木曜,5:金曜,6:土曜,7:日曜 - うるう年区分 : 指定する月が2月の場合、月末が28日であるか29日であるかを、次の整数で表す。
0:28日(平年),1:29日(うるう年) - 祝日を休業日として加算する際に、プログラムの内部テーブルを利用する。
年によって日付の異なる祝日(春分の日及び秋分の日)があるため、年ごとに内部テーブルの見直しを行う。
ある年の内部テーブルは次のとおりである。
月 祝日数 祝 日 1 2 1 15 2 1 11 3 1 21 4 1 29 5 2 3 5 6 0 7 0 8 0 9 2 15 23 10 1 10 11 2 3 23 12 1 23
- 流れ図では、変数としてX,Y及びZを用いる。このうち、Zには算出結果の休業日の日数が格納される。
設問1 次の記述中の( )に入れる正しい答えを、解答群の中から選べ。
流れ図中の(1)の時点で、変数Xの値は、指定された月の( a )を表し、変数Yの値は、指定された月の( b )を表している。
解答群
ア 月初めの曜日区分 イ 月末の曜日区分 ウ 休業日の日数の初期値 エ 日数 オ 最初に日曜日になる日付 カ 最後に日曜日になる日付 設問2 次の記述中の( )に入れる正しい答えを、解答群の中から選べ。
この店舗では、土曜日も休業日とすることになった。このため、流れ図中の(2)の処理を次のように変更した。
Z+2 → Z
ところがこの結果、( c )の場合、( d )の場合及び( e )の場合に休業日の日数が算出できないことが明らかになった。
解答群
ア 月末が28日の イ 月末が29日の ウ 月末が30日の エ 月末が31日の オ 月初めが土曜日の カ 月末が土曜日の キ 月初めが日曜日の ク 月末が日曜日の ケ 土曜日が祝日に重なる コ 日曜日が祝日に重なる
![]()
解説 今週の問題も、流れ図の処理の目的は明確ですね。
まずは以下のカレンダーを見てください。これは、今年の11月のカレンダーです。平成10年11月
日 月 日 水 木 金 土 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 流れ図はある店舗の指定された月の休業日を求めます。つまり、上記のカレンダー(一つの例ですが)の赤色の日をカウントし、それを流れ図中の変数Zに求めるのが処理の目的です(変数Zに7が設定され、これが流れ図で得る最終的な結果)。
上記のような図を書くことは、問題を解答する上でとても重要です。この図は30秒もあれば十分書くことができます。このような図を書かなければ、設問2を解答するのはほぼ不可能でしょう。面倒くさがっていてはダメですよ。
設問1
aについて
解説するまでもなく(だから解説しませんが)、Xは日数(指定された月の最後の日付)です。bについて
日数算出ループを読んでからYの意味を考えてもいいのですが、この問題の場合は、特定のケースにおける(1)時点のYの値を求め、それを解答群に当てはめていった方が簡単でしょう。
そこで、上記のカレンダーで考えてみます。
このカレンダーでは、月初め(1日)の曜日は日曜日ですから、曜日区分が7で流れ図の処理が開始されます。だから(1)時点のYは1(=8−7)です。解答群の中から1になる選択肢を選びましょう。ア 月初め(1日)の曜日区分は日曜日なので7。よって違う。
イ 月末(30日)の曜日区分は月曜日なので1。よって候補として残る。
ウ 休業日の日数の初期値は変数Zで示されるので違う。
エ aの解答だから違う。
オ 最初に日曜日になる日付は1。よって候補として残る。
カ 最後に日曜日になる日付は29。よって違う。次に候補として残ったイとオについて考えます。
問題文にあるように、曜日区分は月初め(の曜日)に関する情報です。月末(近辺)に関する情報を得るには、その月の日数を加味する必要があるはずです(日数が分からなければ何時月末か分からない)。
ところが、Yは単に”8−曜日区分”で求めており、ここには日数に関する情報が考慮されていません。そこで、「イの”月末の曜日区分”はちがうんじゃないか」と考えられます。
実際、11月は30日までしかありませんが、もし仮に31日あったとすれば、月末の曜日区分は2(火曜)になってしまいます。
ということで残りの、”最初に日曜日になる日付”が正解です。1日が日曜日(Y=8−7=1)−>最初に日曜日になる日付は1日
1日が月曜日(Y=8−1=7)−>最初に日曜日になる日付は7日
1日が火曜日(Y=8−2=6)−>最初に日曜日になる日付は6日
以下省略・・・・・・・設問2
まず、(元の)日数算出ループで行っている処理について考えなければなりません。
設問1でYは、”最初に日曜日になる日付”と分かりました。また、日数算出ループ内の最後に、”Y+7→Y”の処理が見えます。
ということは、(2)時点のYは常に”指定月の日曜日の日付”であることが分かります。つまり、休業日である日曜日になったら、休業日の日数を1カウントアップし(Z+1→Z)、日曜日の日付(Y)が月末の日付(X)を超えた時に(X<Y)、休業日の日数の加算を終了するわけです。
以上が元の日数算出ループで行っている処理です。
設問は、土曜日も休業日と変更した場合、”Z+1→Z”を、単に”Z+2→Z”にした時の不具合について問われています。
1つ目の不具合(解答)は、”土曜日が祝日に重なる時”です。日曜日が祝日と重なった場合はこれを考慮して1減算していますが、土曜日でも同じような処理が必要なのは明らかです(抜けています)。
さて次に、”Z+2→Z”という(誤った)処理の発想を考えてみましょう。
”Z+2→Z”としたのは、元は(1週間の内)日曜日の1日だけが休業日だったのに対し、変更後は休業日が土日連続して2日あるので、”2加算すればいいかなー”という(安易な)考えと思われます。
この発想の間違いは、「日曜日の前日が土曜日であり、それは日曜日と同じ月にある」という点です。つまり、土日が月をまたがる点についての考慮が抜けているのです。
ということで、”月初めが日曜日の場合”と”月末が土曜日の場合”は休業日が正しく計算されません。ここで、今年の11月のカレンダーの例で確認しましょう。11月は”月初めが日曜日の場合”に相当します。平成10年11月
日 月 日 水 木 金 土 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 本来、11月の休業日は11日です。ところが変更後の流れ図では、12日となってしまいます。
(流れ図における)11月の休業日=祝日+日曜日の日数*2=2+5*2=12日
もし月末が土曜日ならば、休業日は逆に1日少なく計算されるでしょう(ただし、うるう年でない2月だけは、月初めが日曜日,月末が土曜日になり、うまく相殺されて偶然に正しい結果が得られます)。
今週はこんなところでしょうか。
また来週。
解答
設問1 a−エ b−オ 設問2 c−カ d−キ e−ケ(順不動)