基本情報技術者試験 令和7年度 科目B 公開問題 問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
選択肢を押すと答え合わせができます。
正解と解説を見る
【正解】ク
dataの要素数は8、keyの要素数は3なので、探索開始位置iは1~8-3+1=6です。βの条件が真になる回数を、内側の繰返しが不一致で終了する点に注意して数えます。
i=1では、「a」「b」まで一致し、3文字目で不一致なので真は2回です。i=2では最初の文字で不一致となり、0回です。i=3では「a」「b」「c」の3文字全てが一致するので3回です。i=4とi=5は最初の文字で不一致となり、それぞれ0回です。i=6では3文字全て一致するので3回です。したがって、真となる回数は2+0+3+0+0+3=8回です。
アの1回は、どの開始位置の真の回数(2、0、3、0、0、3回)を組み合わせても得られない値です。イの2回は、i=1で途中まで一致した2回だけを数えた値なので誤りです。ウの3回は、一つの完全一致だけを数えた値です。エの4回は、条件が偽となる回数であり、真の回数ではありません。オの5回は、途中一致の2回と一つの完全一致の3回しか含めていません。カの6回は、二つの完全一致だけを数え、i=1で途中まで一致する2回を漏らしています。キの7回は正しい合計より1回少なく、各開始位置の集計と一致しません。ケの9回とコの10回は、いずれも正しい合計8回を上回るので誤りです。
【ポイント】 探している並びが完成しなくても、途中で一致した比較は真の回数に含まれます。 不一致になると内側の繰返しを終了するため、それ以降の文字は比較されません。
【参考】擬似言語の記述形式(基本情報技術者試験用)
擬似言語を使用した問題では、各問題文中に注記がない限り、次の記述形式が適用されているものとする。
〔擬似言語の記述形式〕 ・○手続名又は関数名 手続又は関数を宣言する。 ・型名: 変数名 変数を宣言する。 ・/* 注釈 */ 、 // 注釈 注釈を記述する。 ・変数名 ← 式 変数に式の値を代入する。 ・手続名又は関数名(引数, …) 手続又は関数を呼び出し、引数を受け渡す。
・if (条件式1) 処理1 elseif (条件式2) 処理2 elseif (条件式n) 処理n else 処理n + 1 endif 選択処理を示す。条件式を上から評価し、最初に真になった条件式に対応する処理を実行する。以降の条件式は評価せず、対応する処理も実行しない。どの条件式も真にならないときは、処理n + 1を実行する。各処理は、0以上の文の集まりである。elseifと処理の組みは、複数記述することがあり、省略することもある。elseと処理n + 1の組みは一つだけ記述し、省略することもある。
・while (条件式) 処理 endwhile 前判定繰返し処理を示す。条件式が真の間、処理を繰返し実行する。処理は、0以上の文の集まりである。
・do 処理 while (条件式) 後判定繰返し処理を示す。処理を実行し、条件式が真の間、処理を繰返し実行する。処理は、0以上の文の集まりである。
・for (制御記述) 処理 endfor 繰返し処理を示す。制御記述の内容に基づいて、処理を繰返し実行する。処理は、0以上の文の集まりである。
〔演算子と優先順位〕(上ほど優先度が高い) ・式:() . ・単項演算子:not + - ・二項演算子(乗除):mod × ÷ ・二項演算子(加減):+ - ・二項演算子(関係):≠ ≦ ≧ < = > ・二項演算子(論理積):and ・二項演算子(論理和):or 注記 演算子 . は、メンバ変数又はメソッドのアクセスを表す。 演算子 mod は、剰余算を表す。
〔論理型の定数〕 true, false
〔配列〕 配列の要素は、"["と"]"の間にアクセス対象要素の要素番号を指定することでアクセスする。なお、二次元配列の要素番号は、行番号、列番号の順に","で区切って指定する。 "{"は配列の内容の始まりを、"}"は配列の内容の終わりを表す。ただし、二次元配列において、内側の"{"と"}"に囲まれた部分は、1行分の内容を表す。
〔未定義、未定義の値〕 変数に値が格納されていない状態を、"未定義"という。変数に"未定義の値"を代入すると、その変数は未定義になる。
出典:令和7年度 基本情報技術者試験 科目B 公開問題 問4
※ 解説は SkillStack 編集部が作成したものです。Web 表示のため、図表の配置や表記を一部改めています。