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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

Q&A

解決済

3回答

4935閲覧

自動販売機のお釣りプログラム

mayupaca

総合スコア3

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

0グッド

0クリップ

投稿2021/04/16 19:12

編集2021/04/16 20:00

前提・実現したいこと

Java学習初心者です。
自動販売機のお釣りのプログラムを作っています。
コマンドライン引数に "1 5 10 50 100 500 777 580" と記入したときに、

警告:1円は使えません。
警告:5円は使えません。
777は硬貨として適切な値ではありません。
80円のお釣りです。ありがとうございました。

と表示させたいです。
コマンドライン引数の一番最後(580)が購入したものの値段、
1 5 10 50 100 500 777 が投入した金額です。

発生している問題・エラーメッセージ

コマンドプロンプトに、

警告:1円玉は使えません
警告:5円玉は使えません
777は硬貨として適切な値ではありません
580は硬貨として適切な値ではありません
1130円のお釣りです。ありがとうございました

と出てきてしまします。

アドバイス、ヒントなど頂きたいです。
よろしくお願いします。

該当のソースコード

Java

1class Jihan2 { 2 public static void main(String[] args) { 3 4 int total = 0; 5 int change = Integer.parseInt(args[7]); 6 7 8 for (int i = 0; i < args.length; i++) { 9 10 int coins = Integer.parseInt(args[i]); 11 12 if (coins == 1 || coins == 5) { 13 14 System.out.println("警告:" + coins + "円玉は使えません"); 15 16 } else if (coins == 10 || coins == 50 || coins == 100 || coins == 500) { 17 18 total += coins; 19 change = total - change ; 20 21 22 } else { 23 24 System.out.println(coins + "は硬貨として適切な値ではありません"); 25 26 } 27 } 28 29 System.out.println(change + "円のお釣りです。ありがとうございました"); 30 31 } 32} 33

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/04/16 23:42

仕様定義をちゃんと日本語で記述すると良いですよ。 *現状では緩すぎます。ごく一部の仕様しか定義されていません。 それが出来ればあとは条件分岐としてコードに落とすだけの作業になります。
mayupaca

2021/04/17 15:15

アドバイスありがとうございます!! 仕様定義をちゃんと日本語で記述するとはどういうことでしょうか? "前提・実現したいこと" をもっと詳細にしたほうがいいということですか?
YT0014

2021/04/18 11:11

硬貨として有効な数値を全部挙げる、うち使用可能な効果を全部挙げる、引数の数は固定or可変、など、箇条書きで構わないので、できる限り矛盾なく、明確な文言で作成し、質問に追記してください。
guest

回答3

0

ベストアンサー

totalが10+50+100+500 = 660 、changeが580で、
total-changが、80になると想像しているかもしれませんが。

java

1} else if (coins == 10 || coins == 50 || coins == 100 || coins == 500) { 2 total += coins; 3 change = total - change ;

をcoinsが10のときに通ると、

total = 10、change = -570
になります。

つぎのループでは、

total = 30、change = 30 - (-570)
となります。

というわけで、

totalが10+50+100+500 = 660 、changeが580

には、なりません。(totalの方は660ですが、changeの方が580でない)

対応は、changeをつどつど変更せずにループを抜けてtotalが決まったあとに

java

1System.out.println((total - change)+ "円のお釣りです。ありがとうございました");

と、するか

changeの計算にchange自身を使わないようにする。
※そもそも、お釣り(change)に対して、商品金額を設定することに違和感がある

int change = 0; int price = Integer.parseInt(args[args.length -1]); 中略 } else if (coins == 10 || coins == 50 || coins == 100 || coins == 500) { change = total - price;

みたいな感じで、変数を別に用意すれば、

java

1System.out.println("総額" + price + "円です。" + total + "円うけとりましたので、"); 2System.out.println(change + "円のお釣りです。ありがとうございました");

※これも最初の対応のように、chageの計算をループの中でせずに以下のように書くことはできます。

java

1System.out.println("総額" + change + "円です。" + total + "円うけとりましたので、"); 2System.out.println((total - change) + "円のお釣りです。ありがとうございました");

投稿2021/04/17 14:42

momon-ga

総合スコア4820

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

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

mayupaca

2021/04/17 15:35

"※そもそも、お釣り(change)に対して、商品金額を設定することに違和感がある" 確かに。。。と思いました。 "1130円" もどうして、この数字が出てきたのかわからなかったので教えていただいて助かりました。 とても分かりやすく教えていただきありがとうございます!
guest

0

アドバイス、ヒントなど頂きたいです。

と言うことですので。まず、main(String[] args)args.lengthは、コマンドライン引数の数を表します。これは良いですね。コマンドライン引数に1 5 10 50 100 500 777 580と指定したら、8が得られる、と言うことです。で、 Javaでの配列の添え字は0始まりですから、int change = Integer.parseInt(args[7])は一番最後の580、購入金額が得られます。これも良いですね。

で、コマンドライン引数のargs[0]からargs[7]の一つ前、06間をループさせたいのでしょうが、以下のfor文の条件式で正しいでしょうか。よく考えましょう。

Java

1for (int i = 0; i < args.length; i++) {

更に、正当な硬貨と判断した時の処理で、

Java

1} else if (coins == 10 || coins == 50 || coins == 100 || coins == 500) { 2 3 total += coins; 4 change = total - change ;

となっていますが、change = total - change;とは? 硬貨を投入総額totalに加算するたびにこの処理をするとどういう意味になるか考えてみましょう。あと少しだと思いますので、がんばってください。

投稿2021/04/16 23:50

編集2021/04/17 00:01
dodox86

総合スコア9183

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

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

mayupaca

2021/04/17 15:22

ご指摘いただいたところ再度、考えてみます! ありがとうございます!
guest

0

int change = Integer.parseInt(args[7]);

配列の添字は0から始まります。
args配列の最初の要素はargs[0]、2番目の要素はargs[1]……といった感じです。ということは7番目の要素はargs[6]です。

投稿2021/04/16 23:29

ku__ra__ge

総合スコア4524

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問