• ベストアンサー

コンパイラ通らない

値により、各種貨幣の最小枚数を計算するソースを書きました。 紙幣の枚数はできましたが、与えられた値から紙幣の分を抜いて、 残りの値はコインの枚数を計算したいですが、下記のソースを コンパイルしたらエラーが出てしまいました。 どうすれば残りの値をコインの枚数を計算するメソッドに渡せるんですか? 教えてください。 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 + "枚"); } }

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

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

  • ベストアンサー
回答No.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)

回答No.3

単純に実行させたいなら、 クラス変数として 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 + "枚"); } }

qiuzhaohua
質問者

補足

ありがとうございました! #1のヒントわかりました。そして、自分が書いたソースより可読性がいいソースでしたね。 入力チェックを入れたいですが、 入力した値は半角数字の場合は実行、違う場合はエラーメッセージの「半角数値を入力してください」を表示させたいです。 メソッドは基本的に下記のメソッドをつかいたいですが、もしもっといいものがあれば、教えてください。メソッドを入れるタイミングと入れた後、今のソースの修正するところを教えていただけますか? public static boolean isHalfNum(String str) { if (str == null || !str.matches("^[0-9]+$")) { // 半角数字正規表現に一致しない場合、エラー return false; } return true; }

  • 20203
  • ベストアンサー率60% (3/5)
回答No.2

mainメソッド中でyen_nokoriが定義されていないので,コンパイルエラーです. yen_nokoriを取得したい場合は,Tacosanさんのいうように紙幣枚数計算後に残り金額を返すメソッドなりを作らなければなりません. もしくは,yen % 1000で下3桁を得られますが.

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

ん~, 課題の内容は「必要な紙幣や硬貨の枚数だけを知りたい」ということなんだろうか... 意味が分からん. 普通は「各金種のそれぞれの枚数が知りたい」となりそうなものなんだが.... さておき, いろいろやり方はあるが例えば ・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つのメソッドを作ってみるとか.

qiuzhaohua
質問者

補足

ありがとうございます。 流れは大体理解したが、具体的にソースのイメージつけないですが…

関連するQ&A

  • 入力値のチェック

    値により、各種貨幣の最小枚数を計算するソースを書きました。 入力チェックのメソッド(下記のisHalfNum)をいれたいですが、 タイミングと修正するべきところがわからないです。 教えて頂きたいです。 public static boolean isHalfNum(String str) { if (str == null || !str.matches("^[0-9]+$")) { // 半角数字正規表現に一致しない場合、エラー return false; } return true; } ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 自分が書いたソース: 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 + "枚"); } }

    • ベストアンサー
    • 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] + "枚"); } } } } どうすれば、使用者に入力させ、その入力した値により上記の命令を実行させられますか? 教えてください。

  • ループの正誤

    金種表のソースを書きました。 表示ループのif文(枚数0枚の場合表示しない)を実行しない場合は 正確の結果が出てくれるんですが、 このまま実行したら、たとえば引数は222の場合は 実行した結果は 「100円 2枚」、10円と1円の枚数を表示してくれなっかです。 原因を教えて頂けますか? ループのどこが間違えたのがわかりません… import java.io.*; public class ex1 { 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++) { count[i] = yen / yentype[i]; //商 yen = yen % yentype[i]; //剰余 } return count; } public static void main(String args[]) throws IOException { int yen = Integer.parseInt(args[0]); 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] + "枚"); } } } }

    • ベストアンサー
    • Java
  • javaのlengthに対して質問です

    javaのlengthに対して質問です public class Gauss { public static void main(String[] args){ int[] ia = new int[101]; for (int i = 0 ; i<ia.length;i++); } } 今の場合 ia.lengthはどれくらいの長さですか? ia だから2?

    • ベストアンサー
    • Java
  • プログラムの平均値の出し方。

    プログラムの平均値の出し方。 public class pazu{ public static void main(String[] args){ int sum =0,saidai; System.out.println("コマンドラインパラメータは"+args.length+"個です"); for(int i=0;i<args.length;i++){ int x=Integer.parseInt(args[i]); if(pazu.is_even(x)) System.out.println(args[i]+"は偶数です"); else System.out.println(args[i]+"は奇数です"); sum+=x; } saidai=pazu.max(args); System.out.println("合計:"+sum); System.out.println("最大:"+saidai); } static boolean is_even(int number){ return number%2==0; } static int max(String[] number){ int max =0; for(int i=0;i<number.length;i++){ if(max<Integer.parseInt(number[i])){ max=Integer.parseInt(number[i]); } } return max; } } このプログラムで数値の奇遇、合計値、最大値までは出せたのですが平均値の出し方がわかりません。 どこに何を入れればいいかを教えてください。お願いします。

  • javaプログラミングの質問です。

    プログラムで数値の奇遇、合計値、最大値までは出せたのですが平均値の出し方がわかりません。 どこに何を入れればいいかを教えてください。お願いします。 public class pazu{ public static void main(String[] args){ int sum =0,saidai; System.out.println("コマンドラインパラメータは"+args.length+"個です"); for(int i=0;i<args.length;i++){ int x=Integer.parseInt(args[i]); if(pazu.is_even(x)) System.out.println(args[i]+"は偶数です"); else System.out.println(args[i]+"は奇数です"); sum+=x; } saidai=pazu.max(args); System.out.println("合計:"+sum); System.out.println("最大:"+saidai); } static boolean is_even(int number){ return number%2==0; } static int max(String[] number){ int max =0; for(int i=0;i<number.length;i++){ if(max<Integer.parseInt(number[i])){ max=Integer.parseInt(number[i]); } } return max; } }

    • ベストアンサー
    • Java
  • 文字列を整数に型変換してソート

    コマンドライン入力で文字列を入力してそれを整数型に変換。そして、それをソートするプログラムを作ってるんですが、なぜかうまくいかず、出力される数字がすべて0になります。 どなたかヘルプおねがいします>< class sort32 { public static void main(String[] args) { System.out.println("------------------------"); int i=0; int j=i+1; int vals[]; vals = new int[args.length]; for(i=0;i>args.length ;i++) { vals[i] = Integer.parseInt(args[i]); } java.util.Arrays.sort(vals); for(int k=0; k<vals.length; k++) System.out.println("<"+vals[k]+">"); } }

  • Double.parseDoubleの使い方

    Java初心者です。 以下のブログラムをコマンドライン引数が実数の場合に処理できるよう にしたいのですが、うまくいきません。どうしたらいいでしょうか? 申し訳ありませんが、ご回答、よろしくお願いいたします。 public class Narabikae { public static void main(String[] args) { int i = 0, j = 0, k = 0; double[] num = new int[args.length]; for(i = 0; i < args.length; i++) { double num[i] = Double.parseDouble(args[i]); } if (0 < args.length) { for(j = 0; j < args.length-1; j++) { for(i = j + 1; i < args.length; i++ ) { if(num[j] > num[i]) { k = num[j]; num[j] = num[i]; num[i] = k; } } } for(i = 0; i < args.length; i++) { System.out.print(num[i]); if (i != args.length-1) { System.out.print(" ⇒ "); } } } else { System.out.println("並び替えできません。"); } } }

    • ベストアンサー
    • Java
  • 配列について

      class Array01{ public static void main(String[] args){ int[][] ia = {{11,12},{21},{41,42,44}}; for(int i = 0; i < ia.length; i++){ for(int j = 0; j < ia[i].length; j++ ){ System.out.print(ia[i][j] + " "); } System.out.println(); } } } } (i < ia.length) と (j < ia[i].length)のとこの意味が分かりません。特にiaとia[i]の違いなんか教えてもらえると助かります。for文については理解してるんですが・・・

    • ベストアンサー
    • Java
  • 配列のコピーをして値を返したいが

    //配列のコピーをして値を返したい import java.util.*; public class Test7_22 { static int[] arrayClone(int[] a){ int[] b = new int[a.length]; for(int i =0;i>a.length;i++) b[i] = a[i];//ここで代入されるはず return b; } public static void main(String[]args){ Scanner std = new Scanner(System.in); System.out.print("要素数:"); int n = std.nextInt(); int[] a = new int[n]; for(int i=0;i<n;i++){ System.out.print("a["+i+"]="); a[i] = std.nextInt(); } int[] x = arrayClone(a); for(int i=0;i<a.length;i++) System.out.println("x["+i+"]="+x[i]); } } //コンパイルするとb[0] = 0になる

    • ベストアンサー
    • Java

専門家に質問してみよう