- ベストアンサー
コンパイラ通らない
値により、各種貨幣の最小枚数を計算するソースを書きました。 紙幣の枚数はできましたが、与えられた値から紙幣の分を抜いて、 残りの値はコインの枚数を計算したいですが、下記のソースを コンパイルしたらエラーが出てしまいました。 どうすれば残りの値をコインの枚数を計算するメソッドに渡せるんですか? 教えてください。 public class Ex { public static final int[] NOTE_TYPES = {10000,5000,1000}; public static final int[] COIN_TYPES = {500,100,50,10,5,1}; public static int getNoteCount(int yen) { int[] countNote = new int[NOTE_TYPES.length]; for (int i = 0; i < NOTE_TYPES.length; i++) { countNote[i] = yen / NOTE_TYPES[i]; //商 yen = yen % NOTE_TYPES[i]; //剰余 if(yen < 1000){ int yen_nokori = yen; } } int samNote = 0 ; for(int i:countNote) samNote +=i; return samNote; } public static int getCoinCount(int yen_nokori) { int[] countCoin = new int[COIN_TYPES.length]; for (int i = 0; i < COIN_TYPES.length; i++) { countCoin[i] = yen_nokori / COIN_TYPES[i]; //商 yen_nokori = yen_nokori % COIN_TYPES[i]; //剰余 } int samCoin = 0 ; for(int i:countCoin) samCoin +=i; return samCoin; } public static void main(String args[]) { int yen = Integer.parseInt(args[0]); int samNote = getNoteCount(yen); int samCoin = getCoinCount(yen_nokori); System.out.println("紙幣:\t" + samNote + "枚"); System.out.println("硬貨:\t" + samCoin + "枚"); } }
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
なんか久しぶりすぎてパッと思いつきませんでしたが、 前ゼロを許可しないならば正規表現は"^0|[1-9]{1}\\d*$"とか のがいいのでは。 組み込むとこんな感じですか? //整数チェック(0-9のみ許可) private static boolean isHalfNum(String str) { if (!str.matches("^0|[1-9]{1}\\d*$")) return false; return true; } //パラメータ入力チェック private static boolean checkInputArgument(String args[]) { if (args.length == 0) return false; if (!isHalfNum(args[0])) return false; return true; } //メイン public static void main(String args[]) { if (!checkInputArgument(args)) { System.out.println("半角数値を入力してください"); return; } int yen = Integer.parseInt(args[0]); int samNote = getMoneyCountByType(yen, NOTE_TYPES); int samCoin = getMoneyCountByType(yen - getAmountByType(yen, NOTE_TYPES), COIN_TYPES); System.out.println("紙幣:\t" + samNote + "枚"); System.out.println("硬貨:\t" + samCoin + "枚"); }
その他の回答 (3)
- めとろいと(@naktak)
- ベストアンサー率36% (785/2139)
単純に実行させたいなら、 クラス変数として private static int yen_nokori = 0; を定義させて、 getNoteCount()内での int yen_nokori = yen; を yen_nokori = yen; にすれば動きます。 色々気になるところは出ますが。 #1の回答については、イメージ的にこういうことだと思います。 public class Ex { private static int[] NOTE_TYPES = {10000,5000,1000}; private static int[] COIN_TYPES = {500,100,50,10,5,1}; //タイプ別の金額を取得 private static int getAmountByType(int yen, int[] types) { int amount = 0; for (int i : types) { amount += i * (int)Math.floor(yen / i); yen = yen % i; } return amount; } //タイプ別の枚数を取得 private static int getMoneyCountByType(int yen, int[] types) { int countMoney = 0; for (int i : types) { countMoney += (int)Math.floor(yen / i); yen = yen % i; } return countMoney; } //メイン public static void main(String args[]) { int yen = Integer.parseInt(args[0]); int samNote = getMoneyCountByType(yen, NOTE_TYPES); int samCoin = getMoneyCountByType(yen - getAmountByType(yen, NOTE_TYPES), COIN_TYPES); System.out.println("紙幣:\t" + samNote + "枚"); System.out.println("硬貨:\t" + samCoin + "枚"); } }
- 20203
- ベストアンサー率60% (3/5)
mainメソッド中でyen_nokoriが定義されていないので,コンパイルエラーです. yen_nokoriを取得したい場合は,Tacosanさんのいうように紙幣枚数計算後に残り金額を返すメソッドなりを作らなければなりません. もしくは,yen % 1000で下3桁を得られますが.
- Tacosan
- ベストアンサー率23% (3656/15482)
ん~, 課題の内容は「必要な紙幣や硬貨の枚数だけを知りたい」ということなんだろうか... 意味が分からん. 普通は「各金種のそれぞれの枚数が知りたい」となりそうなものなんだが.... さておき, いろいろやり方はあるが例えば ・bool getCount(int amount, int[] types, int[] count): 金額 amonut に対して金種 type で払うときの各金種の枚数を count に入れる. types.length > count.length なら false, そうでなければ true を返す ・int getRestAmount(int amount, int[] types, int[] count): 金額 amonut に対して金種を type, 各金種の枚数を count とした時の残り金額を返す という 2つのメソッドを作ってみるとか.
補足
ありがとうございます。 流れは大体理解したが、具体的にソースのイメージつけないですが…
補足
ありがとうございました! #1のヒントわかりました。そして、自分が書いたソースより可読性がいいソースでしたね。 入力チェックを入れたいですが、 入力した値は半角数字の場合は実行、違う場合はエラーメッセージの「半角数値を入力してください」を表示させたいです。 メソッドは基本的に下記のメソッドをつかいたいですが、もしもっといいものがあれば、教えてください。メソッドを入れるタイミングと入れた後、今のソースの修正するところを教えていただけますか? public static boolean isHalfNum(String str) { if (str == null || !str.matches("^[0-9]+$")) { // 半角数字正規表現に一致しない場合、エラー return false; } return true; }