Ruby練習問題3-☆4:動物園管理システムを作ろう

記事内に商品プロモーションを含む場合があります

Rubyの初心者向け問題3-☆4:動物園管理システムを作ろう

この問題を解くために必要な知識:
【レベル1~2の知識】
コメントの書き方、変数と定数、基本データ型、四則演算と演算子、入力と出力、文字列操作、分岐処理(if、if~else、elsif、case)、繰り返し処理(for、while、until、each)、範囲(Range)、例外処理(begin-rescue-end)、配列(Array)、ハッシュ(Hash)、コレクション操作(配列、ハッシュの操作)、Enumerableモジュール

【レベル3の知識】
メソッドの定義と呼び出し、メソッドの戻り値、クラスの定義と使用、コンストラクタ、クラスの継承モジュールの定義と使用ミックスイン

<<前の問題 問題集Top 次の問題>>

Ruby練習問題3-☆4:動物園管理システムを作ろう

「動物園管理システム」を作成しましょう。

プレイヤーが動物園の管理者となり、動物を追加したり、動物の一覧を表示したりします。

クラスの継承とコンストラクタを使用して、動物と動物園を管理するシステムを構築します。

この問題の要件

以下の要件に従ってコードを完成させてください。

  • 動物を表すクラスを作成すること。
  • 複数の動物を管理するための動物園クラスを作成すること。
  • プレイヤーが動物を追加したり、動物の一覧を表示したりできるようにすること。
  • クラスの継承とコンストラクタを使用すること。

ただし、以下のような実行結果となること。

----- ↓出力される結果の例↓ -----

動物園管理システム:
1. 動物を追加
2. 動物の一覧を表示
3. 終了
1
動物の名前を入力してください:
ライオン
動物の種類を入力してください:
ライオン
ライオン (ライオン) が動物園に追加されました。
動物園管理システム:
1. 動物を追加
2. 動物の一覧を表示
3. 終了
2
動物園の動物一覧:
ライオン (ライオン)
動物園管理システム:
1. 動物を追加
2. 動物の一覧を表示
3. 終了
3
システムを終了します。

----- ↑出力される結果の例↑ -----

この問題を解くヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。

1.Animalクラスの定義
 1-1. attr_readerメソッドで namespecies を読み取り可能にする
 1-2. initializeメソッドで namespecies を初期化
 1-3. infoメソッドで動物の名前と種類を返す

2.Zooクラスの定義
 2-1. initializeメソッドで空の @animals 配列を初期化
 2-2. add_animalメソッドで動物を追加し、動物の名前と種類を表示
 2-3. show_animalsメソッドで動物園にいる全ての動物の情報を表示

3.ZooManagementSystemクラスの定義
 3-1. initializeメソッドで Zoo クラスのインスタンスを作成
 3-2. startメソッドでシステムを開始し、ユーザーに操作の選択肢を提供
  3-2-1. ユーザーにメニューを表示し、選択肢を入力させる
  3-2-2. case文でユーザーの入力に応じた操作を行う
   3-2-2-1. 1を選択時は add_animal_to_zoo メソッドを呼び出す
   3-2-2-2. 2を選択時は @zoo.show_animals を呼び出す
   3-2-2-3. 3を選択時はシステムを終了し、ループを抜ける
   3-2-2-4. その他の無効な選択時はエラーメッセージを表示
 3-3. add_animal_to_zooメソッドで動物の名前と種類を入力し、Animalクラスのインスタンスを作成、動物園に追加

4.プログラムの開始部分
 4-1. ZooManagementSystemクラスのインスタンスを作成し、startメソッドを呼び出す

ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

# 動物の基本クラス
class Animal
  attr_reader :name, :species

  def initialize(name, species)
    =begin
    【穴埋め問題1】
    ここにnameとspeciesをインスタンス変数に格納するコードを書いてください。
    =end
  end

  def info
    =begin
    【穴埋め問題2】
    ここに名前と種類を含む文字列を返すコードを書いてください。
    =end
  end
end

# 動物園クラス
class Zoo
  def initialize
    =begin
    【穴埋め問題3】
    ここに動物のリストを保持するための配列を初期化するコードを書いてください。
    =end
  end

  # 動物を追加するメソッド
  def add_animal(animal)
    =begin
    【穴埋め問題4】
    ここにanimalを動物リストに追加するコードを書いてください。
    また、追加された動物の名前と種類を出力するコードを書いてください。
    =end
  end

  # 動物の一覧を表示するメソッド
  def show_animals
    =begin
    【穴埋め問題5】
    ここに動物リストをループで回して各動物の情報を表示するコードを書いてください。
    =end
  end
end

# 管理システムクラス
class ZooManagementSystem
  def initialize
    =begin
    【穴埋め問題6】
    ここにZooクラスのインスタンスを作成して@zooに格納するコードを書いてください。
    =end
  end

  # システムを開始するメソッド
  def start
    loop do
      puts "動物園管理システム:"
      puts "1. 動物を追加"
      puts "2. 動物の一覧を表示"
      puts "3. 終了"
      choice = gets.chomp.to_i

      case choice
      when 1
        =begin
        【穴埋め問題7】
        動物を追加するメソッドを呼び出すコードを書いてください。
        =end
      when 2
        =begin
        【穴埋め問題8】
        動物リストを表示するメソッドを呼び出すコードを書いてください。
        =end
      when 3
        puts "システムを終了します。"
        break
      else
        puts "無効な選択です。もう一度選択してください。"
      end
    end
  end

  # 動物を追加するメソッド
  def add_animal_to_zoo
    puts "動物の名前を入力してください:"
    name = gets.chomp
    puts "動物の種類を入力してください:"
    species = gets.chomp
    animal = Animal.new(name, species)
    =begin
    【穴埋め問題9】
    ここに動物を動物園に追加するメソッドを呼び出すコードを書いてください。
    =end
  end
end

# システムの開始
system = ZooManagementSystem.new
system.start

 

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。



解答例と解説

この問題の一つの正解例とそのコードの解説を以下に示します。

正解コードの例

例えば以下のようなプログラムが考えられます。

********************

# 動物園管理システムの実装

# 動物の基本クラス
class Animal
  attr_reader :name, :species

  def initialize(name, species)
    @name = name
    @species = species
  end

  def info
    "#{@name} (#{@species})"
  end
end

# 動物園クラス
class Zoo
  def initialize
    @animals = []
  end

  # 動物を追加するメソッド
  def add_animal(animal)
    @animals << animal
    puts "#{animal.name} (#{animal.species}) が動物園に追加されました。"
  end

  # 動物の一覧を表示するメソッド
  def show_animals
    puts "動物園の動物一覧:"
    @animals.each do |animal|
      puts animal.info
    end
  end
end

# 管理システムクラス
class ZooManagementSystem
  def initialize
    @zoo = Zoo.new
  end

  # システムを開始するメソッド
  def start
    loop do
      puts "動物園管理システム:"
      puts "1. 動物を追加"
      puts "2. 動物の一覧を表示"
      puts "3. 終了"
      choice = gets.chomp.to_i

      case choice
      when 1
        add_animal_to_zoo
      when 2
        @zoo.show_animals
      when 3
        puts "システムを終了します。"
        break
      else
        puts "無効な選択です。もう一度選択してください。"
      end
    end
  end

  # 動物を追加するメソッド
  def add_animal_to_zoo
    puts "動物の名前を入力してください:"
    name = gets.chomp
    puts "動物の種類を入力してください:"
    species = gets.chomp
    animal = Animal.new(name, species)
    @zoo.add_animal(animal)
  end
end

# システムの開始
system = ZooManagementSystem.new
system.start

********************

正解コードの解説

このコードは動物園管理システムをシミュレーションするプログラムです。基本的なRubyのクラス、メソッド、ループ、条件分岐の使い方が学べます。

コードをブロックごとに分けて、どのように動作するか説明します。

Animalクラスの定義

class Animal
  attr_reader :name, :species

  def initialize(name, species)
    @name = name
    @species = species
  end

  def info
    "#{@name} (#{@species})"
  end
end
  • attr_reader: namespeciesという2つのインスタンス変数の読み取り専用のアクセサーメソッドを自動で作成しています。これにより、animal.nameanimal.speciesのようにして外部から名前や種類を取得できます。
  • initializeメソッド: このメソッドは新しいAnimalオブジェクトが作成されるときに呼ばれ、動物の名前と種類をセットします。
  • infoメソッド: このメソッドは動物の名前と種類を文字列として返します。

Zooクラスの定義

class Zoo
  def initialize
    @animals = []
  end

  def add_animal(animal)
    @animals << animal
    puts "#{animal.name} (#{animal.species}) が動物園に追加されました。"
  end

  def show_animals
    @animals.each do |animal|
      puts animal.info
    end
  end
end
  • initializeメソッド: @animalsという空の配列を作成し、ここに動物を追加していきます。
  • add_animalメソッド: 動物を@animals配列に追加します。追加された動物の名前と種類を表示するため、putsを使っています。
  • show_animalsメソッド: eachメソッドで動物リストを順に取り出し、各動物のinfoメソッドを使って情報を表示します。

ZooManagementSystemクラスの定義

class ZooManagementSystem
  def initialize
    @zoo = Zoo.new
  end

  def start
    loop do
      puts "動物園管理システム:"
      puts "1. 動物を追加"
      puts "2. 動物の一覧を表示"
      puts "3. 終了"
      choice = gets.chomp.to_i

      case choice
      when 1
        add_animal_to_zoo
      when 2
        @zoo.show_animals
      when 3
        puts "システムを終了します。"
        break
      else
        puts "無効な選択です。もう一度選択してください。"
      end
    end
  end
  • initializeメソッド: 新しいZooオブジェクトを作成し、それを@zooというインスタンス変数に保存します。
  • startメソッド: ユーザーインターフェースを提供し、ユーザーが1〜3の選択肢から操作を選べるようにします。loopを使って無限ループし、ユーザーが「終了」を選択するまで繰り返します。

動物の追加とリスト表示の処理

def add_animal_to_zoo
  puts "動物の名前を入力してください:"
  name = gets.chomp
  puts "動物の種類を入力してください:"
  species = gets.chomp
  animal = Animal.new(name, species)
  @zoo.add_animal(animal)
end

add_animal_to_zooメソッド: ユーザーから動物の名前と種類を入力し、新しいAnimalオブジェクトを作成して動物園に追加します。

プログラムの開始部分

system = ZooManagementSystem.new
system.start

ここで、ZooManagementSystemのインスタンスを作成し、startメソッドを呼び出してプログラムが開始されます。

<<前の問題 問題集Top 次の問題>>

この問題への質問・コメント

この問題を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    Ruby練習問題集へ戻る
    トップページへ戻る