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.Animalクラスの定義
1-1. attr_reader
メソッドで name
と species
を読み取り可能にする
1-2. initialize
メソッドで name
と species
を初期化
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
メソッドを呼び出す
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
# 動物の基本クラス 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
:name
とspecies
という2つのインスタンス変数の読み取り専用のアクセサーメソッドを自動で作成しています。これにより、animal.name
やanimal.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を活用しています。
問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。