- ベストアンサー
【JAVA】与えられた金額を貨幣にした時の紙幣と硬貨の枚数を算出し、表示するプログラムを作成
今JAVAの勉強中です。 下記の問題が与えられて、うまくできなくて、ソースを教えて頂きたいです。 問題: 与えられた金額を貨幣にした時の紙幣と硬貨の枚数を算出し、表示するプログラムを作成してください。 0枚の紙幣、硬貨に関しては表示されないように。 【ヒント】 今回のプログラムではユーザの操作により金額が与えられます。 その際にすべきエラー処理を忘れずに組み込むこと。 【引数の渡し方】 コマンドプロンプトより下記のようにコマンドを実行することにより金額をプログラム外部から渡すことができる。 java ex 1117823
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>while (yen >= yentype[i]) { > yen -= yentype[i]; > count[i]++; >} 割り算知らないの? count[i] = yen / yentype[i]; //商 yen = yen % yentype[i]; //剰余 普通はこうやるな。 >System.out.println("金額を入力してください"); println の説明を読んだことがありますか? 「改行が付く」とあるはず。printメソッドを使う。 System.out.print("金額を入力してください>_ "); のように・・・ こっちは改行されないから、入力プロンプトが直後に出てくる。 >Integer.parseInt(br.readLine()); 数字でないものが入力される、あるいは桁数が大きすぎると、例外が 発生する。try~catchで防ぎ、catchブロックでエラーメッセージを 出力し、System.exit(1); などで、処理を終了する。因みに、正常に 終わったら System.exit(0); のように終了コードを変えると、少し 気が利いているね。 >java ex 1117823 クラス名が「ex」ということだが、クラス名の先頭は大文字が原則 なので、何かの間違いでは?小文字で作っても動作するけど、気持ち 悪い。尚、実際はclasspathオプションが必要になる。下記参照 java -classpath /home/~/bin Ex 1117823 1117823 これはmainメソッドのargsに渡される引数になる。 すると、(args.length > 0)なら、args[0]を使い、 (args.length == 0)なら、 標準入力から入力しろってことじゃぁないの?
その他の回答 (5)
- nda23
- ベストアンサー率54% (777/1415)
金種を1万円札、5千円札、1千円札、硬貨は500円、100円、50円、 10円、5円、1円とします。 何も工夫しないなら、以下の手順です。 (1)金額を10000で割る。商が1万円札の枚数になり、剰余が次の金額になる。 (2)金額を5000で割る。商が5千円札の枚数になり、剰余が次の金額になる。 (3)金額を1000で割る。商が1千円札の枚数になり、剰余が次の金額になる。 以下省略 人間って、普通は上のように考えてますよね。単に言葉に直し、 プログラムにし易いように計算式を書いただけです。 「教える」なんて程のものじゃないでしょう?プログラムの能力は 人(機械)に理解してもらう説明力のことです。日本語が下手で 説明のマズイ人はプログラムもダメとしたものです。 最初のうちは冗長で「あたりまえだろ」みたいなことも記述するのは しょうがないことですが、「文書化する」を面倒がらずに続ければ この能力は向上しますので、がんばってください。
補足
ありがとうございます。 ソースを書いてみました。 import java.io.*; public class aa { public static final int[] YEN_TYPES = { 10000,5000,1000,500,100,50,10,5,1 }; public static int[] getYenCount(int yen, int[] yentype) { int[] count = new int[yentype.length]; for (int i = 0; i < yentype.length; i++) { while (yen >= yentype[i]) { yen -= yentype[i]; count[i]++; } } return count; } public static void main(String[] args) throws IOException { System.out.println("金額を入力してください"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int yen = Integer.parseInt(br.readLine()); int[] count = getYenCount(yen, YEN_TYPES); for (int i = 0; i < YEN_TYPES.length; i++) { if(count[i] == 0) { i++; } else{ System.out.println(YEN_TYPES[i] + "円\t" + count[i] + "枚"); } } } } このソースを改善したい場所はいくつがあります。 (1)金額を入力の提示のところは画面上に”金額を入力してください>_”のように表示させ、入力した金額は“_”の右にしたいですが、どうすれば可能ですか? (2)エラーメッセージをつくタイミングと条件は何にすればいいですか? (3)与えられた問題で 「【引数の渡し方】 コマンドプロンプトより下記のようにコマンドを実行することにより金額をプログラム外部から渡すことができる。 java ex 1117823」 を書いてあるんですが、java ex 1117823の意味は何ですか?
- buriburi3
- ベストアンサー率44% (353/792)
【ヒント】 それは「金種表」と呼ばれてます。 給与や出張旅費の支払いなどの事務処理に使われるので解説やサンプルは検索すれば大量に見つかります。
お礼
ありがとうございます!ヒントを頂きました。
- nda23
- ベストアンサー率54% (777/1415)
幾つかの要素があります。 アナタに出来ないことは何でしょう? (1)コマンドラインの文字列の取得方法が分からない。 (2)金額として正しいかのチェック方法がわからない。 A.数字以外の文字がないか B.¥とか,(カンマ)は許すか、許さないか (3)金額が確定したあと、金種×数量の組み合わせを求める方法が 分からない。 (3)が分からない場合、金種(例えば10万円金貨や2千円紙幣はOK?) および、数量の限定があるかないかです。 数量に限定が無ければ300円は100円×3ですが、100円が2枚しか ないと、100円×2+50円×2のようにしなければなりません。 数量が限られるのは、けっこう難しいんですよ。制限があるのと ないのでは全然、方法が違いますからね。 どこがどう分からないのか開示してください。
補足
申し訳ありません、初心者なので、上記で書いてある問題は全部わからないです… (3)は数量が限定していません。 まずアルゴリズムから教えていただけますか?よろしくお願いします。
とりあえず、必要な要件をまとめてから質問したほうがいいですよ。 丸投げでは回答がつきにくいと思います。 何がわからないのか詳しく補足ください。
- Tacosan
- ベストアンサー率23% (3656/15482)
「用いる通貨の種類」を決めておかないと問題にならないんだけど.... 「うまくできない」とはどういうことでしょうか? ・アルゴリズムが想像つかない? ・アルゴリズムはわかるけどそれをどうプログラムに書けばいいのかわからない? ・プログラムはかけるけど期待する答えと一致しない? ・その他? とりあえず「できるところ」までは自力でやってみてください.
補足
通貨の種類は日本円で、紙幣は10000、5000、1000(2000ありとなしの二パターンある)、硬貨は500、100、50、10、5、1 になります。 「うまくできない」とは アルゴリズムが想像つかないです。 そしてjava ex 1117823の意味はわからないです。
お礼
ありがとうございました。すごく参考になりました。