• ベストアンサー

【JAVA】与えられた金額を貨幣にした時の紙幣と硬貨の枚数を算出し、表示するプログラムを作成

今JAVAの勉強中です。 下記の問題が与えられて、うまくできなくて、ソースを教えて頂きたいです。 問題: 与えられた金額を貨幣にした時の紙幣と硬貨の枚数を算出し、表示するプログラムを作成してください。 0枚の紙幣、硬貨に関しては表示されないように。 【ヒント】 今回のプログラムではユーザの操作により金額が与えられます。 その際にすべきエラー処理を忘れずに組み込むこと。 【引数の渡し方】 コマンドプロンプトより下記のようにコマンドを実行することにより金額をプログラム外部から渡すことができる。 java ex 1117823

  • Java
  • 回答数6
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.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)なら、 標準入力から入力しろってことじゃぁないの?

qiuzhaohua
質問者

お礼

ありがとうございました。すごく参考になりました。

その他の回答 (5)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.5

金種を1万円札、5千円札、1千円札、硬貨は500円、100円、50円、 10円、5円、1円とします。 何も工夫しないなら、以下の手順です。 (1)金額を10000で割る。商が1万円札の枚数になり、剰余が次の金額になる。 (2)金額を5000で割る。商が5千円札の枚数になり、剰余が次の金額になる。 (3)金額を1000で割る。商が1千円札の枚数になり、剰余が次の金額になる。 以下省略 人間って、普通は上のように考えてますよね。単に言葉に直し、 プログラムにし易いように計算式を書いただけです。 「教える」なんて程のものじゃないでしょう?プログラムの能力は 人(機械)に理解してもらう説明力のことです。日本語が下手で 説明のマズイ人はプログラムもダメとしたものです。 最初のうちは冗長で「あたりまえだろ」みたいなことも記述するのは しょうがないことですが、「文書化する」を面倒がらずに続ければ この能力は向上しますので、がんばってください。

qiuzhaohua
質問者

補足

ありがとうございます。 ソースを書いてみました。 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)
回答No.4

【ヒント】 それは「金種表」と呼ばれてます。 給与や出張旅費の支払いなどの事務処理に使われるので解説やサンプルは検索すれば大量に見つかります。

qiuzhaohua
質問者

お礼

ありがとうございます!ヒントを頂きました。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

幾つかの要素があります。 アナタに出来ないことは何でしょう? (1)コマンドラインの文字列の取得方法が分からない。 (2)金額として正しいかのチェック方法がわからない。  A.数字以外の文字がないか  B.¥とか,(カンマ)は許すか、許さないか (3)金額が確定したあと、金種×数量の組み合わせを求める方法が  分からない。 (3)が分からない場合、金種(例えば10万円金貨や2千円紙幣はOK?) および、数量の限定があるかないかです。 数量に限定が無ければ300円は100円×3ですが、100円が2枚しか ないと、100円×2+50円×2のようにしなければなりません。 数量が限られるのは、けっこう難しいんですよ。制限があるのと ないのでは全然、方法が違いますからね。 どこがどう分からないのか開示してください。

qiuzhaohua
質問者

補足

申し訳ありません、初心者なので、上記で書いてある問題は全部わからないです… (3)は数量が限定していません。 まずアルゴリズムから教えていただけますか?よろしくお願いします。

noname#99579
noname#99579
回答No.2

とりあえず、必要な要件をまとめてから質問したほうがいいですよ。 丸投げでは回答がつきにくいと思います。 何がわからないのか詳しく補足ください。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「用いる通貨の種類」を決めておかないと問題にならないんだけど.... 「うまくできない」とはどういうことでしょうか? ・アルゴリズムが想像つかない? ・アルゴリズムはわかるけどそれをどうプログラムに書けばいいのかわからない? ・プログラムはかけるけど期待する答えと一致しない? ・その他? とりあえず「できるところ」までは自力でやってみてください.

qiuzhaohua
質問者

補足

通貨の種類は日本円で、紙幣は10000、5000、1000(2000ありとなしの二パターンある)、硬貨は500、100、50、10、5、1 になります。 「うまくできない」とは アルゴリズムが想像つかないです。 そしてjava ex 1117823の意味はわからないです。

関連するQ&A

  • 本当に分からないので教えてください4

    問題6 金額と枚数を入力する. 硬貨,紙幣の合計が入力金額,合計枚数が入力枚数になる 場合を1つ見つけるプログラムを作成せよ. 使える硬貨,紙幣は 一万円,五千円,千円,五百円,百円,五十円,十円,五円,一円 とする. また,各硬貨,紙幣の枚数が求められたら,合計枚数と合計金額が 間違いないか確かめを行うプログラムを追加し,結果を表示せよ. <実行結果> 金額:1234 枚数:999 10000 : 0 5000 : 0 1000 : 0 500 : 0 100 : 0 50 : 0 10 : 0 5 : 55 1 : 944 金額 : 1219 枚数 : 999 <実行結果> 金額:1234567890 枚数:99999 存在しない <実行例3> 金額:1234567890 枚数:999999 10000 : 123357 5000 : 11 1000 : 2 500 : 21 100 : 3 50 : 601 10 : 4 5 : 6000 1 : 870000 金額 : 1234567890 枚数 : 999999

  • Eclipseでプログラム実行時に引数を渡す方法を知りたい!

    EclipseでJavaのプログラミングをしているのですが、実行時に引数を渡す方法が分かりません。 プログラムの内容としては、テキストファイルの中身を表示するプログラムなんですが、コマンドプロンプト上で実行する場合には、 C:\Java> java Test < Test.txt という風に実行すればよいのですが、Eclipseではどのように引数を渡して実行すればよいのか分かりません。 誰か助けてください!

    • ベストアンサー
    • Java
  • 選択により違う動作を実行する方法

    与えられた値により、下記のように貨幣の枚数を求めるソースを書きました。 /** * 与えられた金額を貨幣にした時の紙幣と硬貨の枚数を算出し、表示する。 * @author zhaohua.qiu * */ public class Ex1 { /** 貨幣タイプの定義 */ /* 紙幣の金種 */ private static final int[] NOTE_TYPES = {10000,5000,1000}; /* 硬貨の金種 */ private static final int[] COIN_TYPES = {500,100,50,10,5,1}; /** * 入力を確認し、結果を表示する * @param arg * @param i 入力したパラメータを格納する変数 */ public static void main(String[] args) { /* コマンドラインパラメータを指定したかのチェック */ if ( ! checkNyuryoku(args) ) { System.out.println("コマンドで金額を入力してください"); System.exit(1); //ここでプログラムは終了する } /* 入力した金額は半角数字かのチェック */ if ( ! isHalfNum(args[0]) ) { System.out.println("半角数値ではありません"); System.exit(2); //ここでプログラムは終了する } /* 入力した数値範囲のチェック */ int yen = 0; try { yen = Integer.parseInt(args[0]);//入力した値をint型に変換 }catch ( NumberFormatException e ) { System.out.println("数値が範囲外です"); System.exit(3); //ここでプログラムは終了する } int sumNote = getMoneyCountByType(yen, NOTE_TYPES); int sumCoin = getMoneyCountByType(yen - getAmountByType(yen, NOTE_TYPES), COIN_TYPES); System.out.println("紙幣:\t" + sumNote + "枚"); System.out.println("硬貨:\t" + sumCoin + "枚"); } /** * コマンドラインパラメータをチェックするメソッド * @param args 判定対象 * @return 結果(true:入力した/false:未入力) */ private static boolean checkNyuryoku(String[] args) { if ( args.length > 0 ) { return true; } return false; } /** * 半角数字正規表現のチェックするメソッド * @param str 判定対象 * @return 結果(true:正常/false:異常) */ public static boolean isHalfNum(String str) { if (str == null || !str.matches("^[0-9]+$")) { return false; } return true; } /** * タイプ別の総金額を取得するメソッド * @param yen 計算する値 * @param types 貨幣のタイプ * @return タイプ別の総金額 */ private static int getAmountByType(int yen, int[] types) { int amount = 0; for (int i : types) { amount += i * Math.floor(yen / i); yen = yen % i; } return amount; } /** * タイプ別の総枚数を取得するメソッド * @param yen 計算する値 * @param types 貨幣のタイプ * @return タイプ別の総枚数 */ private static int getMoneyCountByType(int yen, int[] types) { int countMoney = 0; for (int i : types) { countMoney += Math.floor(yen / i); yen = yen % i; } return countMoney; } } 実行して、枚数を表示した後、続いて「具体的紙幣と硬貨の枚数を表示しますか?_(Y/N)」のように使用者に聞いて、Nを選択した場合プログラムを終了させ、Yを選択した場合は下記のソースを実行し、結果を表示したいです。 public class Ex2 { public static final int[] YEN_TYPES = {10000,5000,1000,500,100,50,10,5,1}; public static int[] getYenCount(int yen) { int[] count = new int[YEN_TYPES.length]; for (int i = 0; i < YEN_TYPES.length; i++) { count[i] = yen / YEN_TYPES[i]; //商 yen = yen % YEN_TYPES[i]; //剰余 } return count; } public static void main(String args[]) { int yen = Integer.parseInt(args[0]); int[] count = getYenCount(yen); for (int i = 0; i < YEN_TYPES.length; i++) { if(count[i] != 0) { System.out.println(YEN_TYPES[i] + "円\t" + count[i] + "枚"); } } } } どうすれば、使用者に入力させ、その入力した値により上記の命令を実行させられますか? 教えてください。

  • 硬貨を溶かしたり傷つける事は、なぜ違法なのですか

    硬貨を溶かしたり傷つける事は、なぜ違法なのですか 発行した枚数が減ると貨幣供給量が減り、インフレを起こすからですか?、それならもっと高額な紙幣を燃やしたり(成金が明り代わりに紙幣を燃やしたらしいです)する方が問題です。 そもそも、個人の所有物である金属の塊を削ろうが溶かそうが勝手だと思います、500円に穴をあけて手品コインを作り逮捕されていましたが、なぜ貨幣だけ特別扱いされるのですか?、例えば銅を目的に業者が10円玉を何十トンも溶かして国自体が10円玉不足になり、生活が不便になる事態などを想定しているのでしょうか? 小銭のために金属を使うのは資源の無駄だと思います、クレジットカードや電子マネーを増やせば現金目的の強盗も泥棒も減ると思います、貨幣を溶かしてまでもの金属需要があるなら、金属硬貨を減らすべきではありませんか?

  • javaプログラムを動かす時のコマンドプロンプトについて。

    プログラムに関しては、htmlを少しかじった程度の素人です。暇な時間を利用して、プログラムを学んでみようと思っています。 java開発ツールの Java(TM) 2 SDK, Standard Edition 1.4.2_04 をインストールしてプログラムを動かしてみようとしたのですが、コマンドプロンプトでパスを入力すると 「内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。」と表示されてしまい動きません。 環境引数、環境変数 PATH CLASSPATH 等の設定が必要だという事まではわかったのですが、具体的にどこをどういじれば良いのかが分かりません。 また、コマンドプロンプトではデフォルトでC:\Windowsと出るようなのですが、私のものは C:\Documents and Settings\ユーザー名>と表示されます。 どなたか詳しい方がいらっしゃいましたら、解決法をご指導下さい。 ちなみにOSはWinXPを使用しております。 宜しくお願いします。

    • ベストアンサー
    • Java
  • javaって意味不明

    javaって意味不明 javaっていったいなにができるんですかね? javaのサーブレットやアプレットなどではWebアプリケーションなどを作れるらいいですけど、javaとコマンドプロンプトを使ってプログラムする文字の表示とか、計算とか何の意味があるんですか? コマンドプロンプト内でただ表示されるだけじゃないですか、全然いみないとおもうんですよ 入門書とか買うとコマンドプロンプトの中だけの表示とかだけじゃないですか。あれに一体何の意味があるんですか?本を買う人はソフトとかアプリとかを作りたいのにそんなことしたって何にもならないじゃないですか。無意味! つまり教えていただきたいことというのは、そんなことをして何になるのか?ということです。

  • javaのプログラム作成

    javaでコマンドプロンプト(下図)のように表示される プログラムを作成するにはどのようにすればいいでしょうか? 引数を3つとろうとおもいます。 testはファイル名です goodは表示する文字で 2番目は横方向に何回表示するか(3) 3番目は縦方向に何回表示するか(3) まわりも-と|で囲むプログラムです 詳しいお方ご教授願います。 c:\>java test good 3 3 -------------- |goodgoodgood| |goodgoodgood| |goodgoodgood| --------------

  • 以下の言語の初心者用のページとかありませんか?

    現在以下の言語で共通プログラムを作成中です BASIC VisualBASIC C Pascal Fortran Java Perl で価格,預り金を入力するとそのおつりと紙幣・硬貨の各枚数を表示するプログラムを作成中です。 BASICは簡単だしVB,Cは多少やっていたのでわかるんですが、他の言語がさっぱりです・・・ 参考になるページがありましたら教えてください。 また上のプログラムのサンプルなどがありましたらかなりうれしいです・・・ ちなみに配列・SelectCaseを使って作成しています。

  • JBuilderでの実行

    JBuilderでコマンドライン引数を使う実行の仕方を教えてください。 例えばTest.javaというファイルをプロンプトで実行するには、 java Test html としますが、JBuilderではどう引数をつければいいのかがわからなくて困っています。 どうかよろしくお願いします。

    • ベストアンサー
    • Java
  • プログラムの考え方。

    コマンドラインから引数を入力してお金の種別に分類せよ。(2000円札は考えない) main関数ではコマンドラインからの引数を判断し、引数の数や値がおかしいときにはエラーメッセージを表示する。正しいときはsyubetu関数にデータを渡してその結果を表示する。 syubetu関数は以下のとおりである。 ・関数名 syubetu ・引数 金額 money(int) 金種格納 kinsyu(int*) ・戻り値 なし ・機能 金額、金種格納用ポインタを引数とし、金種ごとの枚数を計算する関数 こういう問題があって、 コマンドラインの引数に数字を入力したら 一万円札から順番に何枚あるかの種別に分けるプログラムなんですが、 その分類をどうやってさせていいのかがわかりません。 例えば13531とかいれたら 一万円 一枚 5千円 0枚 千円 3枚 5百円 1枚 百円 0枚 50円 0枚 10円 3枚 5円 0枚 1円 1枚 っと表示させます。 この分類のところはどのように考えたらプログラムできるでしょうか? フローチャートを考えている途中なのですが、いまいち考え方がわかりません。 よろしくおねがいします。