長さm,nの文字列を格納した配列X,Yがある。
図は,長さmの文字列の後ろに長さnの文字列を連結したものを配列Zに格納するアルゴリズムを表す流れ図である。
図中のa,bに入れる処理として,正しいものはどれか。
ここで,1文字が一つの配列要素に格納されるものとする。
正答1
解説
正解は1です。
二つの文字列を連結して配列Zに格納する流れ図の空欄を埋める問題です。
図には、kを1からmまで1ずつ増やすループ1の中に処理a、kを1からnまで1ずつ増やすループ2の中に処理bがあります。
連結後のZは、先頭からm文字がXの内容、その後ろのn文字がYの内容になります。
【処理の流れ】
ループ1では、Xのk番目の文字をZのk番目に格納すればよく、aは「X(k)をZ(k)へ」です。
ループ1が終わると、Z(1)〜Z(m)にXの文字が入っています。
ループ2では、Yの文字をZ(m)の直後から格納する必要があります。
k=1のとき、Y(1)はZ(m+1)に入ります。
k=nのとき、Y(n)はZ(m+n)に入ります。
したがってbは「Y(k)をZ(m+k)へ」です。
【選択肢別解説】
1:○ aでXをZ(1)〜Z(m)に、bでYをZ(m+1)〜Z(m+n)に格納します。
長さmの文字列の後ろに長さnの文字列が続く形になります。
2:× bでYをZ(n+k)に格納すると、ずらす量がnになります。
mとnが異なると、Xの後ろに隙間ができたり、Xの文字を上書きしたりするので誤りです。
3:× aでYを先に格納しているので、XとYの順序が逆です。
また、ループ1はmまでしか回らないので、長さnのYを正しく扱えません。
4:× XとYの役割が逆で、ずらす量もnになっています。
問題の求める「Xの後ろにYを連結する」処理になりません。
【ポイント】
配列の連結では、後ろの文字列の格納先を「前の文字列の長さ+k」とずらすのが基本です。
ループの終値(mかnか)と、扱う配列が対応しているかも確認します。