基本情報技術者試験の科目Bのサンプル問題を題材に,文字の出現割合を求める処理について学習します。この問題では,ある文字の次に特定の文字が出現する割合を,文字列の出現回数から求める処理を確認します。
(令和4年度4月公開) 基本情報技術者試験 サンプル問題 科目B 問5
問 次のプログラム中の に入れる正しい答えを,解答群の中から選べ。
任意の異なる2文字を c1,c2 とするとき,英単語群に含まれる英単語において,c1 の次に c2 が出現する割合を求めるプログラムである。英単語は,英小文字だけから成る。英単語の末尾の文字が c1 である場合,その箇所は割合の計算に含めない。例えば,図に示す4語の英単語 “importance”,“inflation”,“information”,“innovation” から成る英単語群において,c1 を “n” ,c2を “f” とする。英単語の末尾の文字以外に “n” は五つあり,そのうち次の文字が “f” であるものは二つである。したがって,求める割合は,2 ÷ 5 = 0.4 である。c1 と c2 の並びが一度も出現しない場合,c1の出現回数によらず割合を0と定義する。
プログラムにおいて,英単語群は Words 型の大域変数 words に格納されている。クラス Words のメソッドの説明を,表に示す。本問において,文字列に対する演算子 “+” は,文字列の連結を表す。また,整数に対する演算子 “÷” は,実数として計算する。
〔プログラム〕
○大域: Words: words /* 英単語群が格納されている */
/* c1の次にc2が出現する割合を返す */
○実数型: prob(文字型: c1,文字型: c2)
文字列型: s1 ← c1の1文字だけから成る文字列
文字列型: s2 ← c2の1文字だけから成る文字列
if (words.freq(s1 + s2) が 0 より大きい)
return
else
return 0
endif
解答群
ア (words.freq(s1) - words.freqE(s1)) ÷ words.freq(s1 + s2)
イ (words.freq(s2) - words.freqE(s2)) ÷ words.freq(s1 + s2)
ウ words.freq(s1 + s2) ÷ (words.freq(s1) - words.freqE(s1))
エ words.freq(s1 + s2) ÷ (words.freq(s2) - words.freqE(s2))
【解答】ウ
【解説】
このプログラムは,文字 c1 の次に文字 c2 が出現する割合を求める。例えば,c1 が n,c2 が f の場合,nf という並びが出現した回数を調べると,c1 の次に c2 が出現した回数が分かる。したがって,分子には words.freq(s1 + s2) を用いる。一方,分母には,次の文字が存在する c1 の個数を用いる。words.freq(s1) は c1 の出現回数全体を表すが,単語の末尾にある c1 は次の文字がないため,割合の計算に含めない。そのため,words.freq(s1) から words.freqE(s1) を引く。したがって,空欄には
words.freq(s1 + s2) ÷ (words.freq(s1) - words.freqE(s1))
が入る。
【参考】
この問題のポイント
この問題から学べることは,
- 文字列の中から特定の文字の出現回数を求める方法
- 2つの文字を連結して,文字の並びの出現回数を求める方法
- 単語の末尾にある文字を除いて,割合を計算する方法
- 出現回数から,ある文字の次に特定の文字が出現する割合を求める方法
- 条件分岐によって,対象となる文字の並びが存在しない場合に0を返す処理
です。特に,割合を求めるときは,分子にc1の次にc2が出現する回数,分母に次の文字が存在するc1の出現回数を用いることを理解しておきましょう。
基本情報技術者試験の学習におすすめの参考書
基本情報技術者試験の合格を目指す方におすすめの参考書です。
学習のお役に立ちましたら
この記事が少しでも学習のお役に立ちましたら,今後も分かりやすい解説や学習コンテンツを継続してお届けする励みになります。
よろしければ、このサイトを応援いただけますと嬉しいです。
※OFUSEは,クリエイターやコンテンツ制作を直接支援できるサービスです。


