2018年03月02日

(H29A-FE-PM9)平成29年秋基本情報午後(問9)ソフトウェア開発(C)

目次・平成29年秋基本情報の解答解説

公式サイト
午後問題PDF
午後解答PDF

問1は必須問題。全員が解答する。
問2〜問7は選択問題、6問中4問を選択して解答する。
問9〜問13は選択問題、5問中1問を選択して解答する。

問9:ソフトウェア開発(C):回分の探索と表示

ありきたりの文字列操作関数のみしか使っていない。ロジックもシンプル。ただ文字列長など境界値を問う問題が多いので慎重な解答が必要。同様に手動で数える必要がある部分もあり慌てず丁寧に解答する必要がある。

難易度:やや難


設問1)a.

psize は、is_palindrome() の第二引数すなわち、文字列の並びの長さを示す。文字列の先頭は ith 、末尾は hit であるので、

psize = hit - ith + 1

ここで hit - ith だと、ith と hit の差分が示されるだけで両端の文字を含むには +1 する必要があることに注意。

    b.

l …… 文字列を左(先頭)から順にたどる指標
r …… 文字列を右(末尾)から順にたどる指標

条件文の結果が真となったときに、回文ではないと判定して関数を脱出する。条件は

tolower( chars[ l ] ) != tolower( chars[ r ] )

小文字に揃えるのを忘れない。

    c.

条件が成立した場合に、文字を見つけたとして関数から戻るので、

tolower( ch ) == tolower( str[ i ] )


設問2)d.
行番号27は、ith〜hitまでの文字列が回文でなかった場合に、より短い文字列の回文候補を見つけるための探索である。ith + 1 から hitより1つ手前の文字までが探索範囲となる。

探索範囲の文字列長は

hit - ( ith + 1 )

だが候補になかった。失敗した回文候補文字列の長さ psize を使うようだ。候補より2文字短い(先頭文字および末尾文字を除く)ので、

psize - 2

    e.

文字列の末尾から検索を開始して、先頭まで検索するのだから、

for ( i = count - 1; i >= 0; i-- ) { }

文字列=文字配列の指標は 0〜文字サイズ-1 であることに注意


設問3)f.
    g.

"No! Madam, I'm Adam Graham. This is my gym."

において、条件にあう回文は

"Madam, I'm Adam"

である。

find_last_charは、
まず N に対して1回呼び出されるが、1度も発見できない。
次に o に対して1回呼び出されるが、1度も発見できない。
次に M に対しては、4回呼び出されて、Adamの末尾のmを見つける。
この時のcountは、その直前のGrahamの末尾mより1文字短いものを示している。先頭の文字はMadamのa。よって 20 文字である。

find_last_charが呼び出される合計回数は 1 + 1 + 4 = 6回。

設問1用(最短):H29A_FE_PM9.c
設問2、3用(最長):H29A_FE_PM9a.c


posted by eienlearner at 00:06| 大阪 ☀| Comment(0) | 情報処理技術者試験 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。