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

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

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

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

Q&A

解決済

3回答

1021閲覧

【Ruby】計算結果をタイトルに戻っても反映させたい

tubajuro16

総合スコア12

Ruby

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

1グッド

1クリップ

投稿2020/03/08 09:18

RubyでATMのようなアプリを作っています。
各メソッドで計算はできるのですが、タイトルに戻った後に計算結果の残高が毎回反映されず初期値になってしまいます。
"moneyOut"メソッド、"moneyIn"メソッドで計算した残高をタイトルに戻った時に
残高照会で常に計算後の結果を表示させる為には、どのように修正すればよろしいでしょうか?
returnの値だと思うのですが、これ以外に思いつきませんでした。
よろしくお願いします。

Ruby

1def moneyOut(balance, amount) 2 fee = 110 3 result = balance - (amount + fee) 4 puts "#{amount}円引き落としました。残高は#{result}円です" 5 return balance = result 6end 7 8def moneyIn(balance) 9 puts "ご入金額をご指定ください" 10 newMoney = gets.to_i 11 result = balance + newMoney 12 puts "残高は#{result}円です" 13 return balance = result 14end 15 16def moneyCheck(balance) 17 puts "いくら引き落としますか?(手数料110円かかります)" 18 money = gets.to_i 19 fee = 110 20 21 if money + fee <= balance 22 moneyOut(balance, money) 23 else 24 puts "残高不足です" 25 end 26end 27 28def moneyResult(balance) 29 puts "残高:#{balance}円です" 30end 31 32def goodbye 33 exit 34end 35 36def exception 37 puts "入力された値は無効やで" 38end 39 40balance = 100000 41 42while true 43 puts "[0]:お引落" 44 puts "[1]:ご入金" 45 puts "[2]:残高照会" 46 puts "[3]:アプリ終了" 47 puts "メニューを選択してください" 48 input = gets.to_i 49 50 if input == 0 51 moneyCheck(balance) 52 elsif input == 1 53 moneyIn(balance) 54 elsif input == 2 55 moneyResult(balance) 56 elsif input == 3 57 goodbye 58 else 59 exception 60 end 61end
DrqYuto👍を押しています

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

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

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

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

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

guest

回答3

0

ruby

1class App 2 def initialize(balance) 3 @balance = balance 4 end 5 6 def moneyOut(amount) 7 print_balance 8 ... 9 end 10 11 def moneyIn 12 print_balance 13 ... 14 end 15 16 . 17 . 18 . 19 20 private 21 22 def print_balance 23 puts "現在の残高は#{@balance}円です" 24 end 25end 26 27app = App.new(10000) 28 29while true 30 puts "[0]:お引落" 31 puts "[1]:ご入金" 32 puts "[2]:残高照会" 33 puts "[3]:アプリ終了" 34 puts "メニューを選択してください" 35 input = gets.to_i 36 37 if input == 0 38 app.moneyCheck 39 elsif input == 1 40 app.moneyIn 41 elsif input == 2 42 app.moneyResult 43 elsif input == 3 44 app.goodbye 45 else 46 app.exception 47 end 48end 49

みたいにアプリの中身をクラスにしてインスタンス変数に残高を記録しておくといつでも引き出せてよいのではないでしょうか

投稿2020/03/08 09:27

rnitta

総合スコア62

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

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

0

ベストアンサー

残高を操作するmoneyCheckmoneyInの結果をbalanceに入れ直すとよいのではないでしょうか

def moneyOut(balance, amount) fee = 110 result = balance - (amount + fee) puts "#{amount}円引き落としました。残高は#{result}円です" result end def moneyIn(balance) puts "ご入金額をご指定ください" newMoney = gets.to_i result = balance + newMoney puts "残高は#{result}円です" result end def moneyCheck(balance) puts "いくら引き落としますか?(手数料110円かかります)" money = gets.to_i fee = 110 if money + fee <= balance moneyOut(balance, money) else puts "残高不足です" balance end end def moneyResult(balance) puts "残高:#{balance}円です" end def goodbye exit end def exception puts "入力された値は無効やで" end balance = 100000 while true puts "[0]:お引落" puts "[1]:ご入金" puts "[2]:残高照会" puts "[3]:アプリ終了" puts "メニューを選択してください" input = gets.to_i if input == 0 balance = moneyCheck(balance) elsif input == 1 balance = moneyIn(balance) elsif input == 2 moneyResult(balance) elsif input == 3 goodbye else exception end end

差分は次のような感じです

--- foo2.rb 2020-03-09 01:42:45.223187950 +0900 +++ foo.rb 2020-03-09 01:40:18.700661166 +0900 @@ -2,7 +2,7 @@ fee = 110 result = balance - (amount + fee) puts "#{amount}円引き落としました。残高は#{result}円です" - return balance = result + result end def moneyIn(balance) @@ -10,7 +10,7 @@ newMoney = gets.to_i result = balance + newMoney puts "残高は#{result}円です" - return balance = result + result end def moneyCheck(balance) @@ -22,6 +22,7 @@ moneyOut(balance, money) else puts "残高不足です" + balance end end @@ -48,9 +49,9 @@ input = gets.to_i if input == 0 - moneyCheck(balance) + balance = moneyCheck(balance) elsif input == 1 - moneyIn(balance) + balance = moneyIn(balance) elsif input == 2 moneyResult(balance) elsif input == 3

投稿2020/03/08 16:44

SeieiMiyagi

総合スコア247

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

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

tubajuro16

2020/03/09 00:49

皆さん分かりやすく丁寧で迅速なご対応していただき、ありがとうございます。 無事、解決し値渡しの理解も深まりました。 中でも差分まで用意してくださったSeisiMiyagi様をベストアンサーとさせていただきました。
guest

0

関数、methodにデータを渡すのに 参照渡しと値渡しの2種類があります。

参照渡しは moneyCheck(balance) とした時に、balance がしまわれている場所を教えて、そこの値を使ってね、という方法です。
この場合は method 側で balance = result とするとその場所の値が入れ替わるのでmethodを呼んだ方でbalanceを読むとresultの値になります。

値渡しは、balanceの値をコピーして、 1200だよとわたします。
呼ぶ方のbalanceと呼ばれた方のbalanceは違うものです。
ですのでこの場合は balance = result としても呼んだ方のbalanceは元のままです。

rubyはこの値渡しを使っているので return balance = result では結果を返せません。
rnittaさんの回答のように インスタンス変数に入れるか
呼ばれたほうで retrun result とし、
呼ぶ方で balance = moneyCheck(balance) としてとり込むことで値を手に入れます。

どちらかというと、インスタンス変数を用いるよりはこちらの方を薦めます。

なお、
return 文はrubyではあまり使いません。
methodの最後に実行された文の結果が返ります。

投稿2020/03/08 12:22

winterboum

総合スコア23567

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問