アルゴリズム基礎解説(平成18年秋期問4)
| 解説 |
|---|
|
タブをスペース変換するプログラムである。 決められた文字間隔を設定し、タブがあればその文字間隔までスペースで埋めるというもの ちょっと難しいかもしれないが、プログラムをトレースしていけば比較的簡単に解答は得られるだろう。 また、プログラムは必ずしも上から1行ずつ解読していく必要は無い 今回の問題は、[c][b][a]の順に解答している。 なぜならば、この問題は[a]を解くのが一番難しいからだ。(解く側にすれば嫌な問題の1つだろう)あくまでも解きやすい順であり、時間節約のための解答例としてこういうやり方もある。 設問2は設問1をしっかりと理解できていれサービス問題であり、難易度は難しくはないだろう。また、解答欄からプログラムを推測できるので、設問2はミスしないようにしたい。 設問1 プログラム中にある[a][b][c]に当てはまる答えを探すもの 表1より変数のSidxが対象となる文字列位置 Didxが出力される文字列位置であることがわかる。 次にプログラムをトレースしていく、Src[Sidx] = TAB の条件文より、タブがある 場合と無い場合に分けられる 無い場合を先に見て欲しいのだが、無い場合は [c]を実行し、Didx を1だけ加算し ている。 [c]の内容は、タブが無い場合にどういう動作をするか。ということであり、図1よ り推測すれば、 a,bの文字列がそのまま出力されていることにより、対象文字列の内容をそのまま出 力していることがわかる。 Src[]の内容をそのままDst[]に格納する内容の解答は「イ Dst[Didx] ← Src[Sidx] 」である。 またタブがあった場合だが、[a]を飛ばして見てみると出力文字位置のDidx とタブ位 置(TabGap)を比較している Didx > TabGap が成立している間だけ、スペースを出力している。 スペースを出力する。ということは、同じ数だけ、Didxも増やさなければならない それに気がつけば[b]は、「ア Didx ← Didx + 1」であることがわかる さて、問題の[a]だが、これは問題文より推測するのはかなり難しいだろう そのため、解答群を実際にプログラムにいれてトレースし、内容が合っているかを検 討していく方法が良い。 [b][c]を先に求めたことで、Didxの値がどのように変動するかが理解できたと思う。 対象文字列の最初にタブがあるとき、Didxの値は「3」である。タブ位置は5である ものを選択すればよい (タブ位置は図1から判定する) 図1よりタブ間隔は4である。N(整数なので小数点切捨て)の式を代入して考える と 「ア」 4(タブ間隔) × [ (Didx(3) + 1) / 4] +1 = 5 「イ」 4(タブ間隔) × [ (Didx(3) - 1 ) / 4] +1 = 1 「ウ」 4(タブ間隔) × [ (Didx(3) + 4 + 1 ) / 4] +1 = 9 「エ」 4(タブ間隔) × [ (Didx(3) + 4 - 1 ) / 4] +1 = 5 アとエが残ってたので、次の値で判定する。Didxの値が「5」そのときのタブ位置は 9 「ア」 4(タブ間隔) × [ (Didx(5) + 1) / 4] +1 = 5 「エ」 4(タブ間隔) × [ (Didx(5) + 4 - 1 ) / 4] +1 = 9 よって正解は「エ Didx + TabGap - 1」となる 設問2 プログラムを変更した時の内容を聞いている。 設問1でプログラムの内容を熟知していればさほど難しいとは思わないだろう。 修正された内容は、「タブ位置を任意の文字位置に指定できる」ことになった部分だ けである そしてTabPosの変数はTabSet[]の配列に変更されているので、TabPosを計算して求め るのではなく TabSet[]の配列の値をTabPosに入れるのだろうと推測される。 プログラムをトレースしてみる。 問題内容の[d][e]の内容だが (TabSet[Tidx] ≠ -1) and (Loop = True)である間処理は繰り返される 次の判定で Didx < TabSet[Tidx] を聞いている。 説明文より TabSet[Tidx] ≠ -1 というのはタブ位置を格納した配列の最後を表 している Loopは Didx < TabSet[Tidx] が正のときにFalseに設定されている。 [e]について先に考えると、値の内容が Tidx < TabSet[Tidx] が負の場合だと無限 ループになってしまう。 LoopをFalseに変えるために、条件を正にするにはDidxの値を減らす場合と Tidxを増やす場合が考えられる。 が、Didxは出力文字列の位置情報のため 減らすことは考えられないのでTidxを増やしていくことがわかる。 (解答欄を見ても、加算しかされてないので、そこから判別しても可) Tidxは指定したタブ情報を格納している配列の要素番号のため 1ずつ加算することしか考えられない よって[e]は、「カ Tidx ← Tidx + 1 」となる [d]Loopを抜ける前に行う処理である。 プログラムをトレースすると このLoopを抜けたあと、Didx < TabPos の条件があるのがわかる つまりTabPosにタブ位置の情報を入れていることが推測されるだろう。 (解答欄を見ても、TabPosに値を格納している内容しかないので、そこから判別して も可) TabSet[]には位置情報が格納されているので、Didxを加算、減算する必要などないこ とが すぐに理解できるだろう。 よって解答は「ア TabPos ← TabSet[Tidx] 」になる 設問2は、内容を読まなくとも、解答欄だけで答えが推測できてしまう。 いわばサービス問題である。 |
まっち~様 ご投稿
メニューへ戻る