基本情報技術者試験 令和6年度 科目B 公開問題 問5
次のプログラム中の「a」~「c」に入れる正しい答えの組合せを、解答群の中から選べ。ここで、配列の要素番号は1 から始まる。
【プログラム】 // 注文データ(ここでは表の例を与えている) 大域: 文字列型配列の配列: orders ← {{"A", "B", "D"}, {"A", "D"}, {"A"}, {"A", "B", "E"}, {"B"}, {"C", "E"}}
○putRelatedItem(文字列型: item) 文字列型の配列: allItems ← ordersに含まれる文字列を 重複なく辞書順に格納した配列 // 表の例では {"A", "B", "C", "D", "E"}
文字列型の配列: otherItems ← allItemsの複製から値がitemである 要素を除いた配列
整数型: i, itemCount ← 0 整数型の配列: arrayK ← {otherItemsの要素数個の0} 整数型の配列: arrayM ← {otherItemsの要素数個の0} 実数型: valueL, maxL ← -∞ 文字列型の配列: order 文字列型: relatedItem
for (orderにordersの要素を順に代入する) if (orderのいずれかの要素の値がitemの値と等しい) itemCountの値を1増やす endif for (iを1からotherItemsの要素数まで1ずつ増やす) if (orderのいずれかの要素の値がotherItems[i]の値と等しい) if (orderのいずれかの要素の値がitemの値と等しい) 「a」の値を1増やす endif 「b」の値を1増やす endif endfor endfor for (iを1からotherItemsの要素数まで1ずつ増やす) valueL ← (arrayM[i] ×「c」) ÷ (itemCount × arrayK[i]) /* 実数として計算する */ if (valueLがmaxLより大きい) maxL ← valueL relatedItem ← otherItems[i] endif endfor relatedItemの値とmaxLの値をこの順にコンマ区切りで出力する
選択肢を押すと答え合わせができます。
正解と解説を見る
【正解】オ
arrayM[i]には、itemとotherItems[i]が同じ注文に含まれる回数Mxyを記録します。そのため、両方が含まれることを確認した内側のifでは「arrayM[i]」を1増やします。一方、arrayK[i]にはotherItems[i]自体が購入された注文数Kyを記録するので、itemの有無にかかわらずotherItems[i]が含まれていれば「arrayK[i]」を1増やします。また、式の「全注文数」は注文データの件数なので、「ordersの要素数」です。よってa、b、cの組合せはオです。
表の例でitemをAとすると、itemCount=KA=4です。BについてはarrayM=MAB=2、arrayK=KB=3、全注文数=6なので、LAB=2×6÷(4×3)=1.0です。同様にCは0、Dは2×6÷(4×2)=1.5、Eは1×6÷(4×2)=0.75となり、Dの関連度が最大です。
アは、MxyとKyの格納先が逆であり、全注文数も商品種類数としているため誤りです。 イは、cは正しいものの、aとbが逆なので誤りです。 ウは、aとbが逆で、cも比較対象商品の種類数なので誤りです。 エは、aとbは正しいものの、cが全商品の種類数なので誤りです。 カは、aとbは正しいものの、cがitemを除いた商品種類数なので誤りです。
【ポイント】 Mxyは二つの商品が同じ注文に含まれる注文数、KxとKyはそれぞれの商品を含む注文数です(その商品だけを購入した注文数ではありません)。 全注文数と商品種類数を混同せず、各配列が式のどの変数に対応するかを確認します。
【参考】擬似言語の記述形式(基本情報技術者試験用)
擬似言語を使用した問題では、各問題文中に注記がない限り、次の記述形式が適用されているものとする。
〔擬似言語の記述形式〕 ・○手続名又は関数名 手続又は関数を宣言する。 ・型名: 変数名 変数を宣言する。 ・/* 注釈 */ 、 // 注釈 注釈を記述する。 ・変数名 ← 式 変数に式の値を代入する。 ・手続名又は関数名(引数, …) 手続又は関数を呼び出し、引数を受け渡す。
・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行分の内容を表す。
〔未定義、未定義の値〕 変数に値が格納されていない状態を、"未定義"という。変数に"未定義の値"を代入すると、その変数は未定義になる。
出典:令和6年度 基本情報技術者試験 科目B 公開問題 問5
※ 解説は SkillStack 編集部が作成したものです。Web 表示のため、図表の配置や表記を一部改めています。