基本情報【科目B】令和7年度サンプル問題問4(FORネスト):「真の回数」と関係ないトレースは割愛

Uncategorized

基本情報技術者試験 科目Bの「令和7年度 サンプル問題 問4」(FOR のネスト・文字列の並び探索)を、図解トレースで解説します。真になった回数を数える問題なので、関係の無いトレースを割愛するのがポイントです。

動画で見たい方はこちら▼

問題(令和7年度 サンプル問題 問4)

次の記述中の【 】に入れる正しい答えを,解答群の中から選べ。 ここで,配列の要素番号は 1 から始まる。

関数 search は,二つの文字型の配列を,それぞれ引数 data 及び key で受け取り,data から key の要素の並びと同じ並びを全て探し,その先頭の要素番号を全て格納した配列を返す。見つからなければ,要素数 0 の配列を返す。

関数 search を search({"a","b","a","b","c","a","b","c"}, {"a","b","c"}) として呼び出すと,/*** β ***/ の行の条件式が真となる回数は【 】回である。

/* key は,要素数 1 以上の配列である */
○ 整数型の配列: search(文字型の配列: data, 文字型の配列: key)
    整数型: i, j, lenData, lenKey
    整数型の配列: result ← {}   // 要素数0の配列
    lenData ← data の要素数
    lenKey ← key の要素数
    /* (lenData − lenKey + 1) が0以下のときは繰返し処理を実行しない */
    for (i を 1 から (lenData − lenKey + 1) まで 1 ずつ増やす)
        for (j を 1 から lenKey まで 1 ずつ増やす)   // α
            if (data[i + j − 1] が key[j] と等しい)   /*** β ***/
                if (j が lenKey と等しい)
                    result の末尾に i の値を追加する
                endif
            else
                α の行から始まる繰返し処理を終了する
            endif
        endfor
    endfor
    return result

解答群

ア 1 イ 2 ウ 3 エ 4 オ 5 カ 6 キ 7 ク 8 ケ 9 コ 10

本番さながらの環境で解いてみたい方はこちら↓

解説

正解は ク 8 です。

①トレース表の作成

data

1 2 3 4 5 6 7 8
a b a b c a b c

Point: ここで間違えると絶対に正解できない

data の配列表を間違えると、このあとどれだけ頑張っても正解にたどり着けません。焦らず丁寧に、「えー、びー、えー、びー…」と小声で唱えながら書くと間違えにくいです。

key

1 2 3
a b c

トレース表(繰り返し条件は書く時点で計算して具体値を入れます)

i (1~6) j (1~3) lenData lenKey if(data[i + j – 1] = key[j])
8 3
繰り返し条件である `for (i を 1 から (lenData − lenKey + 1) まで 1 ずつ増やす)` `for (j を 1 から lenKey まで 1 ずつ増やす)` は、トレース表を書く時点で計算し、具体的な値を記入しましょう。 (計算の内訳) iの(1~6)の6は、`lenData − lenKey + 1`の計算結果(8 – 3 + 1)です。

②条件判定しながらトレース

if (data[i + j − 1] が key[j] と等しい) が false の場合、elseα の行から始まる内側の繰り返しが終了 します。そのため、都度判定しながら進めます。

`if (data[i + j − 1] が key[j] と等しい)`以降の処理は、判定が真だったとしても `result の末尾に i の値を追加する` だけであり、`if (data[i + j − 1] が key[j] と等しい)` の判定に影響がありません。そのため、`if (j が lenKey と等しい)` 以降のトレースは省略します。
for (j を 1 から lenKey まで 1 ずつ増やす)
  if (data[i + j − 1] が key[j] と等しい)   /*** β ***/
      //(省略可能)
  else
      α の行から始まる繰返し処理を終了する
  endif
endfor

最後までトレースすると次のとおり。

i (1~6) j (1~3) data[i + j – 1] = key[j]
1
1 data[1+1-1] = key[1]
1
a     a
2 data[1+2-1] = key[2]
2
b     b
3 data[1+3-1] = key[3]
3
a     c
×
2
1 data[2+1-1] = key[1]
2
b     a
×
3
1 data[3+1-1] = key[1]
3
a     a
2 data[3+2-1] = key[2]
4
b     b
3 data[3+3-1] = key[3]
5
c     c
4
1 data[4+1-1] = key[1]
4
b     a
×
5
1 data[5+1-1] = key[1]
5
c     a
×
6
1 data[6+1-1] = key[1]
6
a     a
2 data[6+2-1] = key[2]
7
b     b
3 data[6+3-1] = key[3]
8
c     c

data[i + j - 1] = key[j] が真となった回数は 8回(ク)です。

今の時点では、時間がかかってもいいので正確にトレースして正解を出せる状態を目指しましょう。効率的なやり方は、別の問題を解く過程で身につきます。

Point: より効率的にトレースする(やや上級者向け)

data[i + j − 1] = key[j] は、a→b→c の順になっているかを判定し、×になったら再び a から判定しています。 つまり、data 内で a→b→c と頭から連続で一致している文字数(途中まででもOK)が、○となる数です。 i の1周目あたりでそれに気づければ、○になるのは以下のタイミングだとわかります。

data

1 2 3 4 5 6 7 8
a b a b c a b c

よって真となる回数は 8回(上記の○の数)です。

Point: 値を変えてトレースしてみよう

呼び出す際の引数を変えてトレースすると、よい練習になります。 数え方はメインと同じで、data 内で各開始位置から key と頭から連続一致した文字数(途中まででもOK)の合計=○の数です。

A:正解は6回

search({“a”,”c”,“a”,”b”,“a”,”b”,”c”,”c”}, {“a”,”b”,”c”})

B:正解は6回

search({“a”,”b”,“a”,”b”,”c”,“a”,”b”,”c”}, {“a”,”b”})

まとめ

素早く正確にトレースできるか、の集大成となる問題です。トレースがうまくできなかった方は、より簡単な問題で練習しましょう。

関連リンク

基本情報科目B-サンプル問題【全44問をがっつり解説】
※一部、執筆途中です。随時アップしていきます。 ※サンプル問題だけを解くのは,非効率です。詳細は以下の動画をご確認ください。 令和4年度4月) ✓R404-問1(条件分岐) 次のプログラム中の【   】に入れる正しい答えを,解答群の中から選...

関連動画

FORのネストの基礎から学べる、同じ章の動画です。

講座の全動画はこちら(プレイリスト)。

6/30まで限定 無料プレゼント

サンプル問題だけ解いても、
合格できません

サンプル問題は応用ばかり。学習には不向きで、非効率です。段階的に学べるオリジナル問題50問を加えた学習専用サイトを、今だけ無料でプレゼント中

⏱ 2分で終わるアンケートに答えるだけ!

科目B 学習専用サイト ▶ アンケートに答えてサイトを受け取る

※ Googleフォーム(SSL)に移動します

タイトルとURLをコピーしました