Rubyの初心者向け問題2-2:ハッシュを使って学生の成績を集計するプログラムを作ろう
この問題を解くために必要な知識:
【レベル1の知識】
コメントの書き方、変数と定数、基本データ型、四則演算と演算子、入力と出力、文字列操作、分岐処理(if、if~else、elsif、case)、繰り返し処理(for、while、until、each)、範囲(Range)、例外処理(begin-rescue-end)
【レベル2の知識】
配列(Array)、ハッシュ(Hash)、コレクション操作(配列、ハッシュの操作)、Enumerableモジュール
<<前の問題 | 問題集Top |
次の問題>> |
Rubyの文法「ハッシュ」とは
ここではハッシュの意味や使い方を復習します。必要ない方はここをクリックして練習問題へ飛びましょう。
ハッシュは、キーと値のペアでデータを管理するためのデータ構造です。
Rubyにおけるハッシュは、他のプログラミング言語でいう「連想配列」や「辞書」に相当します。
キーを使って値を効率よく検索することができ、データの格納や操作に非常に便利です。
ハッシュの使用例
以下は、ハッシュを定義し、その要素を一つずつ取り出して表示する例です。
# ハッシュを定義する hash = {a: 1, b: 2, c: 3} # ハッシュの各要素を表示する hash.each do |key, value| puts "キー: #{key}, 値: #{value}" end
このコードでは、hash
というハッシュにキー a
, b
, c
と、それぞれに対応する値 1
, 2
, 3
が格納されています。
each
メソッドを使うことで、キーと値を順番に取り出し、puts
メソッドで表示しています。
ハッシュの操作
要素の追加: ハッシュに新しいキーと値を追加するには、以下のようにします。
hash[:d] = 4 # キー :d に値 4 を追加
要素の削除: キーを指定して要素を削除するには、delete
メソッドを使います。
hash.delete(:a) # キー :a の要素を削除
要素の取得: キーを指定して値を取得できます。
puts hash[:b] # キー :b に対応する値を取得
ハッシュのメリット
ハッシュを使うことで、キーを使ってデータを効率よく検索したり、特定の値を簡単に操作することができます。
特に、大量のデータを管理する際や、データに名前やラベルを付けて管理したいときに便利です。
Ruby練習問題2-2:ハッシュを使って学生の成績を集計するプログラムを作ろう
学生の成績データをハッシュを使って管理し、それぞれの成績ごとに何人の学生がいるかをカウントするプログラムを作成しましょう。
このプログラムでは、複数の学生の成績を集計し、結果を表示します。
成績データはハッシュとして以下のように与えられます。
students = { "田中" => "A", "佐藤" => "B", "鈴木" => "A", "高橋" => "C", "伊藤" => "B", "渡辺" => "A" }
この問題の要件
以下の要件に従ってコードを完成させてください。
- 学生の名前と成績を管理するハッシュ
students
を定義し、複数の学生の名前と成績を格納すること。 - ハッシュ
students
を使って、それぞれの成績をカウントし、grade_count
ハッシュに格納すること。 each
メソッドを使って、students
ハッシュの各要素を繰り返し処理すること。- 最後に、
grade_count
ハッシュに基づいて、それぞれの成績の学生数を表示すること。
ただし、以下のような実行結果となること。
----- ↓出力される結果の例↓ -----
成績A: 3人 成績B: 2人 成績C: 1人
----- ↑出力される結果の例↑ -----
この問題を解くヒント
1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。
正解のコードは上から順に以下のような構成となっています。
1.students
ハッシュの定義
1-1. 学生の名前と成績を格納したハッシュを作成
2.空のハッシュ grade_count
の定義
2-1. 各成績のカウントを格納するための空のハッシュを作成
3.each
メソッドによるハッシュの繰り返し処理
3-1. students
ハッシュの各要素を繰り返し処理する
3-1-1. 成績が grade_count
に既に存在するか確認
3-1-1-1. 存在する場合はカウントを1増やす
3-1-1-2. 存在しない場合はカウントを1に設定
4.each
メソッドによるカウント結果の表示
4-1. grade_count
ハッシュのキーと値を順に表示
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
# 学生の成績データ students = { "田中" => "A", "佐藤" => "B", "鈴木" => "A", "高橋" => "C", "伊藤" => "B", "渡辺" => "A" } # 各成績のカウントを格納するためのハッシュ grade_count = {} # ハッシュ内の各成績をカウント students.each do |name, grade| =begin 【穴埋め問題1】 ここに、すでにその成績がカウントされているかを確認し、カウントを増やすか新しいカウントを開始するコードを書いてください。 =end end # 各成績の学生の数を表示 grade_count.each do |grade, count| =begin 【穴埋め問題2】 ここに、成績とそれに対応する学生の人数を表示するコードを書いてください。 =end end
このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。
解答例と解説
この問題の一つの正解例とそのコードの解説を以下に示します。
正解コードの例
例えば以下のようなプログラムが考えられます。
********************
# 学生の成績データ students = { "田中" => "A", "佐藤" => "B", "鈴木" => "A", "高橋" => "C", "伊藤" => "B", "渡辺" => "A" } # 各成績のカウントを格納するためのハッシュ grade_count = {} # ハッシュ内の各成績をカウント students.each do |name, grade| if grade_count[grade] # すでにその成績がカウントされている場合は、カウントを増やす grade_count[grade] += 1 else # 初めて出現した成績の場合は、カウントを1にする grade_count[grade] = 1 end end # 各成績の学生の数を表示 grade_count.each do |grade, count| puts "成績#{grade}: #{count}人" end
********************
コードの解説
このRubyコードでは、ハッシュ(Hash) を使って学生の成績を集計しています。
ハッシュは、キーと値のペアでデータを管理するための便利なデータ構造です。
ここでは、コードを順に解説しながら、ハッシュの使い方を学んでいきましょう。
ハッシュの定義
students = { "田中" => "A", "佐藤" => "B", "鈴木" => "A", "高橋" => "C", "伊藤" => "B", "渡辺" => "A" }
ここでは、students
という名前のハッシュを定義しています。ハッシュでは、キーと値をセットで管理します。
この場合、キーは学生の名前で、値はその学生の成績です。
空のハッシュの作成
grade_count = {}
grade_count
という空のハッシュを定義しています。
このハッシュは、各成績(A, B, Cなど)が何回出現したかをカウントするために使います。
ハッシュの要素を繰り返し処理
students.each do |name, grade| if grade_count[grade] grade_count[grade] += 1 else grade_count[grade] = 1 end end
この部分では、students
ハッシュを each
メソッドで繰り返し処理しています。
name
には学生の名前、grade
には成績が格納され、それぞれの成績を grade_count
ハッシュでカウントします。
if
文: ここで、すでに grade_count
にその成績が登録されているかをチェックしています。もし成績がすでに存在していればカウントを1増やし、存在しない場合は初めてその成績が出現したとしてカウントを1に設定します。
結果の表示
grade_count.each do |grade, count| puts "成績#{grade}: #{count}人" end
最後に、grade_count
ハッシュを使って、それぞれの成績の学生数を表示しています。
each
メソッドを使って、キー(成績)と値(人数)を一つずつ取り出し、puts
で表示しています。
まとめ
このプログラムでは、ハッシュ を使って成績データを効率的に集計しています。
ハッシュは、複数のデータをキーと値で管理し、特定のキーに関連する値を簡単に操作することができる非常に便利なデータ構造です。
<<前の問題 |
問題集Top |
次の問題>> |
この問題への質問・コメント
この問題を作成するにあたりAIを活用しています。
問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。