質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

2回答

2035閲覧

Ruby商品の合計金額を表示させるプログラム

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2021/01/28 02:28

Rubyの商品注文カリキュラムで詰まってしまい、質問させていただけないでしょうか。

やりたいこと:
出力下記の結果を出力させるための注文プログラムを作成したい

#実行結果 山田は2個の商品を購入し、全部で2500円支払いました。 結果として残りの所持金は7500円です。

わからない部分:
cartメソッドの記述
試したこと:
出力時にcartメソッド内にcountとtotal_priceを定義して購入個数と合計金額を表示させる処理を記述する必要があるということは分かるのですが、処理を行うための考え方がわからず詰まっています・・・

class Product attr_accessor :name, :price def initialize(name, price) @name = name @price = price end end class Book < Product attr_accessor :author, :publisher, :page_count end class CD < Product attr_accessor :artist, :year, :songs end class ShoppingCart attr_accessor :count, :total_price #商品情報と個数 def initialize self.count = 0 self.total_price = 0 end def add_product(product) self.count += 1 self.total_price += product.price end end class User attr_accessor :last_name, :first_name, :gender, :age def initialize(last_name, first_name, gender, age ) self.last_name = last_name self.first_name = first_name self.gender = gender self.age = age end def print_greetings puts "今日は。#{self.last_name} #{self.first_name} です。性別は#{self.gender}です。 歳は#{self.age}です。" end def male? return self.gender == "男" end end class ShoppingUser < User # 実装してください attr_accessor :money #所持金の追加 def initialize(money) @money = money end #カートに入れる def into_cart(product) #ショッピングカートクラスを変数cartに格納 cart = ShoppingCart.new #cart内の商品ごとの追加情報を表示 cart.add_product(product) end def cart #購入する個数(count) count = 1 #合計金額を表示(total_price) end #支払い金額と残り所持金の表示 def checkout cart = ShoppingCart.new #支払い金額 @money -= cart.total_price #残り所持金 end end book1 = Book.new('吾輩は猫である', 1000) book1.author = '夏目漱石' book1.publisher = 'Vitalize出版' book1.page_count = 400 cd1 = CD.new('SMAP', 1500) cd1.artist = 'スマップ' cd1.year = 2018 cd1.songs = ["青い稲妻", "世界に一つだけの花", "オレンジ"] user1 = ShoppingUser.new(10000) user1.last_name = '山田' user1.first_name = '花子' user1.gender = '女' user1.age = 30 user1.into_cart(book1) user1.into_cart(cd1) if user1.checkout puts "#{user1.last_name}は#{user1.cart.count}個の商品を購入し、全部で#{user1.cart.total_price}円支払いました。" puts "結果として残りの所持金は#{user1.money}円です。" else puts "#{user1.last_name}はチェックアウトできませんでした。" puts "なぜなら買い物の合計金額が#{user1.cart.total_price}円なのに対し、所持金は#{user1.money}円しかなかったからです。" end

申し訳ありませんが、助言をいただけないでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

修正しました。
修正個所はdiffの結果を参照してください。
不明点があれば、補足してください。
def cartはコメントアウトしています。

ruby

1class Product 2 attr_accessor :name, :price 3 4 def initialize(name, price) 5 @name = name 6 @price = price 7 end 8end 9 10class Book < Product 11 attr_accessor :author, :publisher, :page_count 12end 13 14class CD < Product 15 attr_accessor :artist, :year, :songs 16end 17 18class ShoppingCart 19 attr_accessor :count, :total_price,:count 20 #商品情報と個数 21 def initialize 22 self.count = 0 23 self.total_price = 0 24 end 25 def add_product(product) 26 self.count += 1 27 self.total_price += product.price 28 end 29end 30 31class User 32 attr_accessor :last_name, :first_name, :gender, :age 33 34 def initialize(last_name, first_name, gender, age ) 35 self.last_name = last_name 36 self.first_name = first_name 37 self.gender = gender 38 self.age = age 39 end 40 41 def print_greetings 42 puts "今日は。#{self.last_name} #{self.first_name} です。性別は#{self.gender}です。 歳は#{self.age}です。" 43 end 44 45 def male? 46 return self.gender == "男" 47 48 end 49end 50 51 52class ShoppingUser < User 53 # 実装してください 54 attr_accessor :money,:cart 55 #所持金の追加 56 def initialize(money) 57 @money = money 58 #ショッピングカートクラスを変数cartに格納 59 @cart = ShoppingCart.new 60 end 61 62 #カートに入れる 63 def into_cart(product) 64 #cart内の商品ごとの追加情報を表示 65 @cart.add_product(product) 66 end 67 68=begin 69 def cart 70 #購入する個数(count) 71 count = 1 72 #合計金額を表示(total_price) 73 end 74=end 75 76 #支払い金額と残り所持金の表示 77 def checkout 78 #支払い金額 79 @money -= cart.total_price 80 #残り所持金 81 if @money >= 0 82 return true 83 else 84 return false 85 end 86 end 87end 88 89book1 = Book.new('吾輩は猫である', 1000) 90book1.author = '夏目漱石' 91book1.publisher = 'Vitalize出版' 92book1.page_count = 400 93 94 95cd1 = CD.new('SMAP', 1500) 96cd1.artist = 'スマップ' 97cd1.year = 2018 98cd1.songs = ["青い稲妻", "世界に一つだけの花", "オレンジ"] 99 100user1 = ShoppingUser.new(10000) 101user1.last_name = '山田' 102user1.first_name = '花子' 103user1.gender = '女' 104user1.age = 30 105 106user1.into_cart(book1) 107user1.into_cart(cd1) 108 109if user1.checkout 110 puts "#{user1.last_name}#{user1.cart.count}個の商品を購入し、全部で#{user1.cart.total_price}円支払いました。" 111 puts "結果として残りの所持金は#{user1.money}円です。" 112else 113 puts "#{user1.last_name}はチェックアウトできませんでした。" 114 puts "なぜなら買い物の合計金額が#{user1.cart.total_price}円なのに対し、所持金は#{user1.money}円しかなかったからです。" 115end 116

変更箇所

diff

119c19 2< attr_accessor :count, :total_price 3--- 4> attr_accessor :count, :total_price,:count 554c54 6< attr_accessor :money 7--- 8> attr_accessor :money,:cart 957a58,59 10> #ショッピングカートクラスを変数cartに格納 11> @cart = ShoppingCart.new 1262,63d63 13< #ショッピングカートクラスを変数cartに格納 14< cart = ShoppingCart.new 1565c65 16< cart.add_product(product) 17--- 18> @cart.add_product(product) 1968c68 20< 21--- 22> =begin 2374c74 24< 25--- 26> =end 2778d77 28< cart = ShoppingCart.new 2981a81,85 30> if @money >= 0 31> return true 32> else 33> return false 34> end

投稿2021/01/28 04:13

tatsu99

総合スコア5493

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

わからない部分:
cartメソッドの記述

色々な考え方があると思いますが、cartはカートを表している訳で、ShoppingUser、すなわち買い物客が実施するメソッドとしては若干不適切です。買い物をしている客自身が、「カート!」と叫んで何かするようなもので、違和感があります。実際に買い物をする客は、買い物を始めるときに買い物カートをまず用意するでしょうから、ShoppingUserクラスがインスタンス化したときにcartを持つようにするのがより適切に思います。

Ruby

1class ShoppingUser < User 2 # 実装してください 3 attr_accessor :money 4 attr_accessor :cart 5 #所持金の追加 6 def initialize(money) 7 @money = money 8 9 # 最初に買い物カートを用意 10 @cart = ShoppingCart.new 11 end 12...

カートに商品を入れる処理、into_cartもちょっとおかしいですね。これではカートに入れるたびに商品が消えてしまいます。

Ruby

1 #カートに入れる 2 def into_cart(product) 3 #ショッピングカートクラスを変数cartに格納 4 cart = ShoppingCart.new 5 #cart内の商品ごとの追加情報を表示 6 cart.add_product(product) 7 end

それらを考慮して修正してみたのが以下です。元のコードと見比べてみてください。

Ruby

1class Product 2 attr_accessor :name, :price 3 4 def initialize(name, price) 5 @name = name 6 @price = price 7 end 8end 9 10class Book < Product 11 attr_accessor :author, :publisher, :page_count 12end 13 14class CD < Product 15 attr_accessor :artist, :year, :songs 16end 17 18class ShoppingCart 19 attr_accessor :count, :total_price 20 #商品情報と個数 21 def initialize 22 self.count = 0 23 self.total_price = 0 24 end 25 26 def add_product(product) 27 self.count += 1 28 self.total_price += product.price 29 end 30end 31 32class User 33 attr_accessor :last_name, :first_name, :gender, :age 34 35 def initialize(last_name, first_name, gender, age ) 36 self.last_name = last_name 37 self.first_name = first_name 38 self.gender = gender 39 self.age = age 40 end 41 42 def print_greetings 43 puts "今日は。#{self.last_name} #{self.first_name} です。性別は#{self.gender}です。 歳は#{self.age}です。" 44 end 45 46 def male? 47 return self.gender == "男" 48 49 end 50end 51 52 53class ShoppingUser < User 54 # 実装してください 55 attr_accessor :money 56 attr_accessor :cart 57 #所持金の追加 58 def initialize(money) 59 @money = money 60 61 # 最初に買い物カートを用意 62 @cart = ShoppingCart.new 63 end 64 65 #カートに入れる 66 def into_cart(product) 67 #ショッピングカートクラスを変数cartに格納 68 # cart = ShoppingCart.new 69 #cart内の商品ごとの追加情報を表示 70 @cart.add_product(product) 71 end 72 73# 不要です。ShoppingUserクラスはcartインスタンスフィールドを持っているので、 74# ややこしいことになっています。 75# def cart 76# #購入する個数(count) 77# count = 1 78# #合計金額を表示(total_price) 79# end 80 81 #支払い金額と残り所持金の表示 82 def checkout 83 # 支払うときに買い物カートをまた用意しちゃダメです。 84 # cart = ShoppingCart.new 85 #支払い金額 86 @money -= @cart.total_price 87 #残り所持金 88 end 89end 90 91book1 = Book.new('吾輩は猫である', 1000) 92book1.author = '夏目漱石' 93book1.publisher = 'Vitalize出版' 94book1.page_count = 400 95 96 97cd1 = CD.new('SMAP', 1500) 98cd1.artist = 'スマップ' 99cd1.year = 2018 100cd1.songs = ["青い稲妻", "世界に一つだけの花", "オレンジ"] 101 102user1 = ShoppingUser.new(1000) 103user1.last_name = '山田' 104user1.first_name = '花子' 105user1.gender = '女' 106user1.age = 30 107 108user1.into_cart(book1) 109user1.into_cart(cd1) 110 111if user1.checkout 112 puts "#{user1.last_name}#{user1.cart.count}個の商品を購入し、全部で#{user1.cart.total_price}円支払いました。" 113 puts "結果として残りの所持金は#{user1.money}円です。" 114else 115 puts "#{user1.last_name}はチェックアウトできませんでした。" 116 puts "なぜなら買い物の合計金額が#{user1.cart.total_price}円なのに対し、所持金は#{user1.money}円しかなかったからです。" 117end

実行してみます。意図通り動いているようです。

terminal

1$ ruby -v 2ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux-gnu] 3 4$ ruby t2.rb 5山田は2個の商品を購入し、全部で2500円支払いました。 6結果として残りの所持金は7500円です。 7$

ちなみに所持金を少なくするとダメですね。1000円に修正して実行してみます。

terminal

1$ ruby t2.rb 2山田は2個の商品を購入し、全部で2500円支払いました。 3結果として残りの所持金は-1500円です。 4$

ShoppingUser#checkoutメソッドの実装が不充分なように思いますが、色んな解決策があるはずですので、質問者さんご自身で解決してみてください。

投稿2021/01/28 03:30

dodox86

総合スコア9256

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/01/28 03:36 編集

ご回答ありがとうございます。 すでに自身で解決するために解決策を探して2日間悩んでおり、自己解決が難しいと判断してこちらで質問しました。 ご回答いただくことが難しいようでしたら、参考になる考え方でも構いませんのでご教授いただけないでしょうか。 すでに自分でググって見つかる情報から考えてここまで辿り着きました。
dodox86

2021/01/28 03:38 編集

> すでに自身で解決するために解決策を探して2日間悩んでします。 どの部分を言っていますか? そもそも、探すというより、本来は自分で考え、コードにする部分なのですが。
dodox86

2021/01/28 03:40

私の回答の部分、 > ShoppingUser#checkoutメソッドの実装が不充分なように思いますが、色んな解決策があるはずですので、質問者さんご自身で解決してみてください。 の解決策が分からないということでしょうか。
hentaiman

2021/01/28 03:43

過去質問から考えて就職先の課題ですよね?現在の進捗を職場の人に相談した方が良くないですか?理路整然と質問するのも仕事する上では重要ですよ
dodox86

2021/01/28 03:56

> ShoppingUser#checkoutメソッドの実装が不充分なように思いますが、色んな解決策があるはずですので、質問者さんご自身で解決してみてください。 についてだったら、そんなに難しい話をしているつもりはなくて、もともとある以下のコードに適合するようにShoppingUser#checkoutメソッドの返り値をセットすれば良いだけなのですが。 if user1.checkout # 買える場合 else # 買えない場合 end 買えるならtrue, 買えないならfalse、ということで成立しますね。もし本当に課題なのであれば、出題者に相談しましょう。cartメソッドは私の回答で削除しましたが、あらかじめある程度コードが用意されていて、cartメソッドは無理やりにでも使え、という課題であったのかもしれませんし。
退会済みユーザー

退会済みユーザー

2021/01/28 04:05

ご回答ありがとうございます! 見返してみるとShopping_user.newを無駄に二回記述してました・・・ initializeで定義しておいくべきでした。 また、cartも無駄にメソッドを作成していました。attr_accessorで最初から使えるようにしておけばよかったんですね・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問