LoginSignup
0
1

More than 5 years have passed since last update.

クラスとインスタンスの基礎学習 -簡単なカロリー計算プログラムの実装-

Posted at

目的

カロリー計算のプログラム実装を通じ、クラスとインスタンスについての理解を深める。

ターミナル上での表示の流れ

1,記録か参照かを選択

[0]カロリーを入力する
[1]カロリーの合計を確認する

2,[0]を選択した場合 (カロリー入力画面)

料理名を入力してください:
おにぎり
カロリーを入力してください:
120

3,[1]を選択した場合 (カロリー合計表示画面)

-----------------------------
おにぎり:120kcal
スパゲティ  :720kcal
バナナ  :80kcal
-----------------------------
カロリー合計  :920kcal

実装の流れ

1、まずは定義していくためのクラスの用意と、定義したクラスのメソッドを呼び出す処理の記述を行う

  class Food
    #これからメソッドの定義を行っていく場所
  end

  while true do #while文で繰り返し処理を行う。trueの部分は条件式も入る。trueにすることで条件式が全部真になり処理が無限ループする
    puts "[0]:カロリーを入力する"
    puts "[1]:カロリーの合計を確認する"
    input = gets.to_i

    if input == 0
      Food.input           # カロリーを入力するためのメソッドを呼び出す。
    elsif input == 1
      Food.show_all_calory # カロリーの合計を表示するためのメソッドを呼び出す。
      exit
    end
  end

呼び出しにクラスメソッドを使用。クラスメソッドとインスタンスメソッドの使い分けについては以下を参照しました。今回のようにデータを直で入力するようなケースならクラスメソッドでいいと思う。
※参照 https://blog.mah-lab.com/2014/11/13/instance-method-and-class-method-with-ruby/

2、箱の用意

class Food
    @@food = []
end

データは配列に格納。
クラス変数にしてますが、@food = [] のようにクラスインスタンス変数にしても、今後配列を使っていく場所がクラスメソッドの中なので動作に問題はありません。
インスタンス変数、クラス変数、クラスインスタンス変数の定義については以下の記事がめちゃ参考になりました。
※参照 https://qiita.com/mogulla3/items/cd4d6e188c34c6819709

3,食品名とそのカロリーを記録するための記述を行う

 def self.input 
   puts "料理名を入力してください"
   name = gets.chomp
   puts "カロリーを入力してください"
   calory = gets.to_i
   food = Food.new(name,calory) #initializeメソッドを呼び出し、インスタンスfoodがもつデータを定義。
   @@foods << food #配列オブジェクト@@foodsにインスタンスfoodを追加。@@foodsはクラス変数のため、処理を行うごとにデータが上書きされていく。
 end

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

4,カロリー参照用のメソッドを記述していく


    def self.show_all_calory
      all_calory = 0
      puts "-----------------------------"
      @@foods.each do |food| #each文で繰り返し処理。変数foodのなかに配列@@foodsのデータを全て代入していく。
        puts"#{food.name} : #{food.calory}kcal" 
        all_calory = all_calory + food.calory
      end
      puts "-----------------------------"
      puts "カロリー合計 :#{all_calory}kcal"
    end

ほとんど完成だが、このままではputs"#{food.name} : #{food.calory}kcal"のとこでundifined methodとエラーが出てしまうため、

 def name         # @nameを取得するためのインスタンスメソッド
   return @name
 end

 def calory
   return @calory # @caloryを取得するためのインスタンスメソッド
 end

のように、@name@caloryメソッドとして定義することで配列のデータが代入された変数から値を取り出せるようにする。

完成!

class Food
  @@foods = []

    def self.input
      puts "料理名を入力してください"
      name = gets.chomp
      puts "カロリーを入力してください"
      calory = gets.to_i
      food = Food.new(name,calory)
      @@foods << food 
    end

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

    def self.show_all_calory
      all_calory = 0
      puts "-----------------------------"
      @@foods.each do |food|
        puts"#{food.name} : #{food.calory}kcal"
        all_calory = all_calory + food.calory
      end
      puts "-----------------------------"
      puts "カロリー合計 :#{all_calory}kcal"
    end
  end

  while true do
    puts "[0]:カロリーを入力する"
    puts "[1]:カロリーの合計を見る"
    input = gets.to_i

    if input == 0
      Food.input           # カロリーの入力
    elsif input == 1
      Food.show_all_calory # カロリーの合計を表示
      exit
    end
  end
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1