プログラミング第13回 アンケート・投票の集計

今回学ぶこと

・ 「区切る」関数

・ アンケートを集計する

 大学入試センターが発表している共通テストの「情報」のサンプル問題は、比例代表選挙において各党の得票数に応じて議席を割り当てる「ドント方式」を題材とした問題でした。

 サンプル問題では「得票数」は与えられていましたが、アンケートや投票の結果から得票数を集計してくれるプログラムから始めてみようと思います。

 選挙をテーマにすると堅苦しいので、「高校生10人に好きなポテトチップスの味を聞いた」という設定にします。集計するプログラミングはやや面倒ですので順を追って説明していきます。


 大量のデータを扱うには「配列変数」や「辞書型変数」が適しているため、配列変数で表してみたところエラーが出て上手く動きません。

 配列変数の要素が数字の場合は、次のように正常に機能します。


 ただ、数字にすると何が何やらわからなくなるので違う方法を考えてみます。なるべく文字のまま集計できた方が見やすいですし。


 次に配列変数ではなく、ただの文字列として記入してみたところ、文字列の羅列を表示することはできましたが、各要素を取り出すことはできませんでした。

 0番目の要素が「う」に、3番目の要素が「,」になっていますね。すべてが別々の文字として認識されています。

 そこで、「区切る」関数というものを使います。


「区切る」関数は、文字列を任意の文字で区切り,配列変数に変換することができます。

 区切る文字は任意に設定できますが、文字列に存在しない文字は当然ながら指定できません(区切られない)。

 例では、「ポテトチップス」という文字列を「,」で区切って「データ」という変数に代入しています。そうすると、「データ」という変数は各要素が「,」によって区切られた配列変数として作用します。

 「区切る」関数は次のような使い方もできます。


 区切る関数で、区切る文字を指定しなければ1文字ずつ「,」で区切られて配列変数に変換されます。

 例のようなアルファベットの羅列の場合、いちいち「,」を打たなくていいので便利です。

 ただ、「1文字ずつ」区切られてしまう点が注意が必要で、場合によっては次のようにわけのわからないことになってしまいます。


区切る文字を指定するかしないかは臨機応変に考えていきましょう。

 無事に配列変数にすることができましたので、集計する準備が整いました。

 まずは「反復」関数の復習です。


 配列変数や辞書型変数は「反復」関数を用いることで、各要素を順に処理することができましたね。

 「対象」という変数に各要素が順に代入されましたね。

 例では、「対象を好み味に代入」「好み味を表示」としていますが、各要素を表示するだけなら「対象を表示」とするだけで十分です。

 集計に備えて「好み味」という変数を使っています。

 次に「辞書型変数」の復習です。


 辞書型変数は任意の文字列(キー)と値を紐づけした変数でしたね。

 これらを踏まえてアンケートを集計します。


 「区切る」関数で作った配列変数と集計(計算)用の辞書型変数を組み合わせて使います。

 配列変数で「反復」関数を使い、「変数=変数+1」の形で票を数え上げていきます。

 「” “」の扱いには注意が必要です。変数の部分には「” “」をつけず、文字列(キー)の部分には「” “」をつけます。

 

 概ね完成しましたが、最後のそれぞれの得票数を表示するところも「反復」関数を使ってまとめられそうですね。


 辞書型変数の方で「反復」関数を使います。

 辞書型変数の反復では、各要素のキーは「対象キー」に、値は「対象」に代入されましたね。

 そのため、例では「{対象キー}:{得票[対象キー]}」としていますが、「{対象キー}:{対象}」でも同じ結果になりますね。

 この例ではデータが10個しかないので人間が数えた方が早いですが、データの数が増えれば増えるほどプログラミングの有用性が明らかになりますね。

 それでは今回の問題です。

問題

 40名のクラスでクラスの委員長を決めることになりました。Aさん、Bさん、Cさん、Dさんが立候補し、40人が投票を行いました。結果は次の通りです。

 結果=「AABBCDADBCBADCDABCCDAAABCDBADBDDACBADBAD」

 下の画像の空欄を埋めて、Aさん、Bさん、Cさん、Dさんの得票数を集計するプログラムを完成してください。