投稿
bigslope bigslope
昨日まで大学入試センター試験を受けていた方、お疲れ様でした。かつてのセンター試験では、数学の試験でプログラミングの問題が出題されていた時期があり、そこでBASICが使われていたのは知る人ぞ知る話。プログラミングを知っている人だったら「余裕!」って人も多かっただろうが、現在は無くなってしまったようでちと残念。かつての『マイコンBASICマガジン』にも、試験問題の解説があったので、その中から1つ出題。
10そうだね
プレイ済み
返信[1]
親投稿
bigslope bigslope
上のプログラムは、自然数Nを入力して、[ア]を小さい順にa(1)=、a(2)=、…と表示し、さらにそれらの和をS=と表示するものである。ただし、このプログラムにおいて、FLOOR(A)はAを超えない最大の整数を表す。[ア]に当てはまるものを、次の0~3のうちから一つ選べ。 0 N以下の正の奇数で3の倍数であるもの 1 N以下の正の奇数で3の倍数でないもの 2 N以下の正の偶数で3の倍数であるもの 3 N以下の正の偶数で3の倍数でないもの
0そうだね
プレイ済み
返信[2]
親投稿
bigslope bigslope
(1)[イ]~[エ]に当てはまるものを、次の0~5のうちから一つずつ選び、プログラムを完成させよ。 0 N 1 K 2 S 3 T 4 S+1 5 S+K (2)このプログラムを実行して、N として10を入力すると、a(1)からa([オ])までとS=[カキ]が表示される。このとき、150行は[ク]回実行され、そのうち[ケ]回は160行の実行に進んだ。 (3)最初のプログラムで140行を IF FLOOR(K/2)<K/2 THEN GOTO @160 と変更したのち、Nとして10を入力するとa (1)からa([コ])までとS=[サシ]が表示される。 (解説は明日辺り投稿します)
0そうだね
プレイ済み
返信[3]
親投稿
bigslope bigslope
とりあえず解答だけ。 [ア]1 [イ]5 [ウ]3 [エ]1 [オ]3 [カキ]13 [ク]5 [ケ]3 [コ]9 [サシ]49 解説がものすごく長くなってしまったんで、一旦推敲してから投稿します。 投稿しようと思ったら、文字数オーバーとかしょっちゅうだからなあ…。
0そうだね
プレイ済み
返信[4]
親投稿
bigslope bigslope
大体推敲が終わったので、解説行きまーす。 ものすごく細かく分解して説明したつもりなので、やたら長くなってしまいましたが、かえって中途半端な説明になってしまったかも知れず。
0そうだね
プレイ済み
返信[5]
親投稿
bigslope bigslope
「命令がいくつも並んでいて、どこから手を付ければ良いか分からない」という人もいると思うけど、この場合、「ここからここまで」と言うような、命令を実行する『くくり』を見つけていくのがポイント。 FOR~NEXTを見つけられたならば、そこがループという形の、1つのくくりとして考える事が出来る。 これは一般的なループの使い方で、120行のINPUT命令で、5を入れれば5回、10を入れれば10回繰り返す事になる。 1回目のループで、変数Kの中には自動的に1が、2回目には2が入るので、ループの中でKの値を調べれば、今何回目のループなのかが分かる。
0そうだね
プレイ済み
返信[6]
親投稿
bigslope bigslope
140行と150行では、このK の値を使って何か判定を行っているっぽいが、まずは変数Nの中に、5みたいな少ない数を入れて、結果を紙か何かに書き出してシミュレートしてみよう。 K/2は、Kを2で割った値なので、Kに1から5までの数字が入った場合というのを考えてみる。 K=1の場合…1/2=0.5 K=2の場合…2/2=1 K=3の場合…3/2=1.5 K=4の場合…4/2=2 K=5の場合…5/2=2.5 このK/2をFLOOR関数でくくると、小数点以下の数が切り捨てられる。 K=1の場合…FLOOR(1/2=0.5)=0 K=2の場合…FLOOR(2/2=1)=1 K=3の場合…FLOOR(3/2=1.5)=1 K=4の場合…FLOOR(4/2=2)=2 K=5の場合…FLOOR(5/2=2.5)=2
0そうだね
プレイ済み
返信[7]
親投稿
bigslope bigslope
これを最初のK/2の結果と比べてみると…。 K=1の場合…0=0.5…× K=2の場合…1=1…○ K=3の場合…1=1.5…× K=4の場合…2=2…○ K=5の場合…2=2.5…× Kが2の時と4の時だけ、小数点以下の数字が出ない(2で割って余りが出ない)為、条件が合致している。2で割って余りが出ないという事は、この数字が奇数か偶数かどうかの判定を行っている事になる。 Kが偶数の時は190行に飛ぶという処理を行っており、その飛び先には『NEXT K』…つまり、ループの末端があり、Kの値を1つ増やした上で、再びループの先頭に戻る。 この事から、『Kが偶数の時は何の処理もしない』、言い換えれば『Kが奇数の時は何らかの処理を行う』という事が推測できる。
0そうだね
プレイ済み
返信[8]
親投稿
bigslope bigslope
K/3の方も、同じようにシミュレートしてみよう。 K=1の場合…1/3=0.333… K=2の場合…2/3=0.666… K=3の場合…3/3=1 K=4の場合…4/3=1.333… K=5の場合…5/3=1.666… これも、同じ計算結果をFLOOR関数でくくったものと比較しているので、Kが3の場合だけ条件が合致するという事は分かると思う。
0そうだね
プレイ済み
返信[9]
親投稿
bigslope bigslope
この時点で、「さっきは2で割り切れる数だったんだから、今度は3で割り切れる数?」って思った人は鋭い。ただ、それでも不安だと思う人の為に、もう少し数を増やしてみようと思う。 K=6の場合…6/3=2 K=7の場合…7/3=2.333… K=8の場合…8/3=2.666… K=9の場合…9/3=3 K=10の場合…10/3=3.333… これだけデータが揃えば、3の倍数であるという事はほぼ間違いないだろう。上と同様に、『Kが3の倍数の時は何の処理もしない』、言い換えれば『Kが3の倍数でない時は何らかの処理を行う』という事が推測できる。
0そうだね
プレイ済み
返信[10]
親投稿
bigslope bigslope
これらを踏まえた上で、この2つを組み合わせた場合、どのような動きをするか考えてみよう。 まず、140行で処理が飛ばされた時点で、150行以降の処理は行われない。つまり、Kが偶数だったら、無条件で処理を行う条件から外される事になる。 K=1の場合…次へ進む K=2の場合…処理を飛ばす K=3の場合…次へ進む K=4の場合…処理を飛ばす K=5の場合…次へ進む K=6の場合…処理を飛ばす K=7の場合…次へ進む K=8の場合…処理を飛ばす K=9の場合…次へ進む K=10の場合…処理を飛ばす
0そうだね
プレイ済み
返信[11]
親投稿
bigslope bigslope
残るは奇数の場合で、そこから更に3の倍数が、処理を行う条件から外される事になる。 K=1の場合…次へ進む K=3の場合…処理を飛ばす K=5の場合…次へ進む K=7の場合…次へ進む K=9の場合…処理を飛ばす この時点で、『奇数、かつ3の倍数でないもの』が残るので、[ア]は1が正解となる。 このような法則性さえつかめれば、たとえその後に大きな数(100みたいな)を入れた場合のケースが出され ても、そこから簡単に処理結果を導き出す事が出来る。
0そうだね
プレイ済み
返信[12]
親投稿
bigslope bigslope
次の160行は…ちょっと何をやっているのか分からないので後回しにして、次の170行を見てみよう。 このSという変数、ここ以外にどこで使われているか見てみると、200行でその中身を表示している。200行は、NEXT Kの次…つまり、ループの外側にあるので、ループを指定した回数だけ繰り返した後に実行される命令だという事になる。 問題文には、『さらにそれらの和をS=と表示するものである。』とあり、そのSを使っているのはここだけなので、その和をここで求めれるのが適当だろう。さっきの条件判定で、K=1、5、7が残ったので、合計13になれば良いはず。 1つ問題なのは、Kの値は毎回変わってしまうのに、それを保存する変数が見当たらない事。どうやってこれを計算すれば良いか?
0そうだね
プレイ済み
返信[13]
親投稿
bigslope bigslope
変数というのは、『常に変わりつつある数』を保存しておくのに便利な物であって、Kが変わる毎に、その値を保存出来れば、最後にまとめて計算が出来る。ただ、ループの回数が分からない以上、Kの中身を保存しておく為の変数を無造作に用意するという訳にも行かない(1個で十分なケースもあれば、100個あっても足りないケースもある)。 問題文を見る限りでは、最終的な和が求められれば良いので、Kの値を個別に保存しなくても、ループの途中で計算していけば良い、という事になる。例えば、最初にSに0が入っている状態で、PRINT S+1と入力すると、(0+1=)1が表示され、5が入っているならば、(5+1=)6が表示される。そして、この計算結果をそのままSに入れ直す事で、Sに計算結果を『足し込んでいく』事が可能になる。 100行にS=0という命令があるのはその前フリで、ここからどんどんKの値を足し込んでいけば良いのだ。
0そうだね
プレイ済み
返信[14]
親投稿
bigslope bigslope
K=1の場合…Sには0が入っているので、それに1を足した結果(1)をSに入れる K=5の場合…Sには1が入っているので、それに5を足した結果(6)をSに入れる K=7の場合…Sには6が入っているので、それに7を足した結果(13)をSに入れる Sに値を入れる為には、まず『S=』と書き、その後に入れたい数字や変数、あるいはそれらを合わせた計算式を書く。 ここではSとKを足した結果を入れたいので、『S=S+K』と書けば、Kをどんどん足し込んでいってくれる。従って、[イ]は5のS+Kが正解となる。
0そうだね
プレイ済み
返信[15]
親投稿
bigslope bigslope
180行で、その『奇数、かつ3の倍数でないもの』を逐次表示していく事になるが、問題文を見ると、『a(1)=、a(2)=、…』というような形式で表示しなければならない事になっている。 この文が実行される条件は、K=1、5、7なので、イコールの右側は、そのままKの値を表示すれば良いが、問題はカッコの中の数字は何を表示すれば良いか。 K=1、5、7なのに対して、こっちは1、2、3…という、Kとはまた別の数字になっている。ここに表示されるべきなのは、何回目の『奇数、かつ3の倍数でないもの』なのかという事になる。 さっきまで放置していた160行目では、この処理を行う毎にTの値が1つずつ加算されている。これを利用すれば、何回目という表示を行う事が出来る。従って、[ウ]は3のT、[エ]は1のKが正解となる。
0そうだね
プレイ済み
返信[16]
親投稿
bigslope bigslope
これで処理の全貌がつかめた上、既に処理結果も出ているので、(2)の問題はすぐに解けるだろう。 [オ]はK=1、5、7の3(回)、[カキ]は1+5+7の13、[ク]はK=1、3、5、7、9の5(回)、[ケ]はK=1、5、7の3(回)が正解となる。
0そうだね
プレイ済み
返信[17]
親投稿
bigslope bigslope
これまで140行は、『Kが偶数だったら処理を飛ばす』という処理を行っていたのだが、(3)の問題でちょっと処理条件が変更になる。 K/2を計算するのと、それをFLOOR関数でくくる所までは同じなのだが、それを比較する時の条件が、イコールではなく、『<』に変わっている。なので、この条件判定からシミュレートしてみよう。 K=1の場合…0<0.5…○ K=2の場合…1<1…× K=3の場合…1<1.5…○ K=4の場合…2<2…× K=5の場合…2<2.5…○ K=6の場合…3<3…× K=7の場合…3<3.5…○ K=8の場合…4<4…× K=9の場合…4<4.5…○ K=10の場合…5<5…×
0そうだね
プレイ済み
返信[18]
親投稿
bigslope bigslope
さっきまでは偶数だったら処理を飛ばす対象になっていたのに対し、今度は奇数が処理を飛ばす対象になっている。 そしてもう1つ注目すべきなのは、その飛ばす先が、190行ではなく、160行に書き換えられているという点。160行から先は、処理を行う対象だった場合に進むべき所なので、つまり、『Kが奇数だったら、後は無条件で処理を行う』という風に処理が変更された事になる。 さっきまでは、『Kが奇数だったら、その次の3の倍数の判定処理に進む』だったのが、3の倍数の判定を行わなくなった事により、『奇数、かつ3の倍数』も処理の対象になった事がポイント。
0そうだね
プレイ済み
返信[19]
親投稿
bigslope bigslope
残った偶数は、140行の条件が変わってしまったので、150行をシミュレートしなおす必要がある。 K=2の場合…次へ進む K=4の場合…次へ進む K=6の場合…処理を飛ばす K=8の場合…次へ進む K=10の場合…次へ進む この2つの条件を組み合わせると、『Kが奇数の場合、または3の倍数でない場合』が、処理が行われる新しい条件となる。 ここで、この条件に合う値を見てみると、K=1、3、5、7、9と、2、4、8、10の9個が対象となるので、[コ]は9、[サシ]はこれらを合計した49が正解となる。
1そうだね
プレイ済み