• 締切済み

Java初心者です。どうか教えてください><

1週間ほど前からJavaの勉強を始めたものです。初歩的な質問で申し訳ないのですが、是非おしえていただきたくて投稿いたしました。 秀和システムからでている「わかりやすいJava入門編」を使って勉強しているのですが、課題の1つでつまづいてしまい、解決法がわからないので質問させていただきました。 課題の内容は以下です。 1、10本のうち3本が当たりで、最大10回引ける。あたりが出たら取り出す。3つ全てあたりが出たら終了。 2、eclipseのコンソール画面上から「キーをタイプすればくじが引けます」と表示、キーを入力すればくじ引き開始。 3、キー入力後0.1秒ごとに ■ が表示され、1秒後10個になった時点でくじ引き結果表示。 そこで、わたしは、まずint[ ]の配列を10個用意し、ループ分で[0]~[9]まで順にランダムに0~9の数字を入力し、 i番目の[i]に入っている数字が、それより以前の配列に入っている場合、[i]配列の抽選をやりなおす、というやり方でやろうと思って以下のような書き方をしたのですが、どうやら間違っているようで重複の場合のやり直しをしてくれません;; 初心者なので、見づらい書き方をしているかもしれませんがお許しください>< package exercise; import lib.Input; public class Lot_6 { static int[] lot = new int[10]; static int i; public static void main(String args[]){ int a = 0; for(int i=0; i < lot.length ;i++){ if (a < 3){ Input.getString("キーをタイプするくじが引けます"); animation(); do{ lot[i]=(int)(10*Math.random()); } while(isTrue()); if((lot[i] == 0) ^ (lot[i] == 1) ^ (lot[i] == 2)){ System.out.println("あたり"); a++; } else { System.out.println("はずれ"); } } else { break; } } } public static void animation() { for(int m = 0;m < 10;m++){ System.out.print("■ "); delay(100); } } public static void delay(int t) { try { Thread.sleep(t); } catch (InterruptedException e) { e.printStackTrace(); } } public static boolean isTrue(){ boolean is = false; for(int n=0;n <= i-1;n++){ if(lot[i] == lot[n]) is = true; else { continue; } } return is; } } そこで、間違っている箇所を調べるために do{ } while();ループの中にSystem.out.println(isTrue());を加え、if(a < 3) { }の内の最後にSystm.out.println(lot[i]);を加えました。 ちゃんと重複した場合isTrue()にTrueを返しているか、重複した場合やりなおしをしてくれているか、を調べるためです。 そしてコンソール画面の実行結果が以下です。 [キーをタイプするくじが引けます] > ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ false はずれ 6 [キーをタイプするくじが引けます] > ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ false はずれ 3 [キーをタイプするくじが引けます] > ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ false あたり 1 [キーをタイプするくじが引けます] > ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ false はずれ 4 [キーをタイプするくじが引けます] > ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ false あたり 0 [キーをタイプするくじが引けます] > ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ false はずれ 4 [キーをタイプするくじが引けます] > ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ false はずれ 4 [キーをタイプするくじが引けます] > ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ false はずれ 5 [キーをタイプするくじが引けます] > ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ false はずれ 9 [キーをタイプするくじが引けます] > ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ false あたり 2 数字が重複していますし、trueが一個もありません。 ということはisTrue()メソッドの部分で誤りがあるんでしょうか? public static boolean isTrue(){ boolean is = false; for(int n=0;n <= i-1;n++){ if(lot[i] == lot[n]) is = true; else { continue; } } return is; } こう書けば、lot[i]がlot[0]~lot[i-1]の間でいつでも重複しているものがあれば boolean is = true;により上書きされて、isTrue()はtrueが返されると思ったのですがそうはならないのでしょうか。 すいません。いろいろ手は尽くしたのですがどうしても分からなくて質問させていただきました。 ご回答いただけますとうれしいです><b

  • Java
  • 回答数1
  • ありがとう数1

みんなの回答

  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.1

重複する数字を見つけたら、そこで判定を終了しないと誤動作します。 初心者ということなので、聞き流してもらっても構わないのですが、気になったことをいくつか。 ●乱数生成をメインの流れの中で行っていますが、メソッドで独立させるのがいいです。 (プログラムの流れがわかりやすくなります) ●メソッドをすべてstaticにしていますが、インスタンスメソッドにしたほうが、後々のことを考えるといい場合が多いです。 ●isTrueメソッドのようにメソッド外の変数を使う構造はやめましょう。メソッドの独立性がなくなりますし、デバッグが困難になりがちです。 ●今回のような乱数なら、配列に0から9までを入れ、シャッフルするのが楽です。(標準クラスの何かにメソッドがありました) 以上です。

tarotaro--
質問者

お礼

ありがとうございました。 お教えいただいた通り、配列に0から9までを入れ、シャッフルする方法でやるともっとシンプルにできました><b ご回答いただきまして本当にありがとうございます^^ また何か質問させていただいたときに、機会があればまたご教授の程よろしくおねがいいたします>< 本当にありがとうございました^^

関連するQ&A

  • 【Java】ある数列から、素数を探すプログラムについて

    Java初心者です。独学なので質問できる環境が無く、 こちらで質問致します。回答をお願い致します。 以下のプログラムについて質問です。 class Prime { public static void main(String[] args) { int max = 100; // 素数を探す数の最大値 boolean[] a = new boolean[max]; // 素数かどうか判定する配列 // 配列の初期化 for(int i = 0; i < max; i++) a[i] = true; // 素数かどうか判定 for(int i = 2; i < max; i++) { if(a[i-1]) { for(int j = 2; i*j <= max; j++) a[i * j - 1] = false; } else continue; } // 結果を表示 for(int i = 1; i < max; i++) { if(a[i]) System.out.print((i + 1) + " "); } System.out.println(); } } 上記の「配列の初期化」の個所、 for(int i = 0; i < max; i++) a[i] = true; ここでなぜ、a[i] = true;となるかわかりません。 0と1はどちらも素数ではないと思うので、 私はtrueではないと思うのですが・・・。 ぜひとも教えて頂きたいと思います。

    • ベストアンサー
    • Java
  • 前回の質問のプログラムの応用 Java言語

    MAX_QUESTION の部分を指定できるようにしたいのです! たとえば、20と入力したら、20問、問題が生成されるようなプログラムです。 教えてください。よろしくお願いします。 import java.io.*; public class Java05 { /** 表示する問題の個数 */ public static final int MAX_QUESTION=10; /** * 足し算の問題をMAX_QUESTION回繰り返して出題する。 * 最後に正答率を表示する。 */ public static void main(String[] args){ int goodAnswer=0; //正答の個数 System.out.println("これから足し算の問題を"+MAX_QUESTION+"問出します。"); /* * 以下、問題を繰り返し表示し、ユーザからの解答を判断する。 * その後、正答の数を数える。 */ for(int i=0;i<MAX_QUESTION;i++){ boolean ok=showQuestion(i+1); if(ok){ goodAnswer++; } } double rate=goodAnswer*100.0/MAX_QUESTION; System.out.println(""); System.out.println("問題は"+MAX_QUESTION+"問"); System.out.println("正答数は"+goodAnswer+"問"); System.out.println("不正解数"+(MAX_QUESTION-goodAnswer)+"問"); System.out.println("正答率は"+rate+"%"); } /** * showQuestionは足し算の問題を1問出し、答えを待つ。 * 正答、誤答の別を表示する。 * 正答の場合は ture を返す。 */ public static boolean showQuestion(int questno){ double dblA=Math.random()*1000; double dblB=Math.random()*1000; int intA=(int)dblA; int intB=(int)dblB; BufferedReader reader=new BufferedReader(new InputStreamReader(System.in)); try{ System.out.println("[第"+questno+"問] "+intA+"+"+intB+"="); String line=reader.readLine(); int result=Integer.parseInt(line); if(intA+intB==result){ System.out.println("正解!"); return true; }else{ System.out.println("不正解!"); return false; } }catch(IOException e){ System.out.println(e); }catch(NumberFormatException e){ System.out.println("入力が正しくありません。"); } return false; } }

  • JAVA初心者です。

    以下の文法でコンパイルエラーが出ます。 添削をお願いします。 import java.util.Random; public class Test{ public static void main(String[] args){ int n; for (n = 0; n < 200; n++){ int i; for (i = 0; i < 38; i++) { Random rnd = new Random(); int ran = rnd.nextInt(10); System.out.print(ran); System.out.print(" "); for (t = 0; t < 200; t++) } System.out.println(); } } }

    • ベストアンサー
    • Java
  • for文

    質問お願い致します。 これのソースのfor文を一つの文にするにはどのように書いたらよいでしょうか? お願い致します。 //指定された文字列が"a"と"b"の両方を含む場合はtrue、なければfalseを返す public class Mondai { public static void main(String[] args) { System.out.println("解答 :" + charBothContain("Habllow")); } public static boolean charBothContain(String str) { boolean answer1 = false; boolean answer2 = false; for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); if (c == 'a') { answer1 = true; break; } } for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); if (c == 'b') { answer2 = true; break; } } return answer1 && answer2; } }

    • ベストアンサー
    • Java
  • booleanの戻り値について

    配列の等価判定をしたいのですが思うように動かないです。 助けてください import java.io.*; class Kadai4 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int[] TBL1; int[] TBL2; TBL1 = new int[5]; TBL2 = new int[5]; boolean flg=true; System.out.println("配列1を入力"); for (int i = 0; i <= 4; i++) { String s1 = br.readLine(); int t1 = Integer.parseInt(s1); TBL1[i] = t1; } System.out.println("配列2を入力"); for (int i = 0; i <= 4; i++) { String s1 = br.readLine(); int t1 = Integer.parseInt(s1); TBL2[i] = t1; } // 配列表示 System.out.println("配列表示"); for (int i = 0; i < TBL1.length; i++) { System.out.print(" TBL1[" + i + "]=" + TBL1[i]); } System.out.println(""); for (int i = 0; i < TBL2.length; i++) { System.out.print(" TBL2[" + i + "]=" + TBL2[i]); } toka(TBL1, TBL2); System.out.println(""); if (flg == true) { System.out.println("配列は等価"); } else { System.out.println("配列は非等価"); } } private static boolean toka(int[] ss1, int[] ss2) { boolean flg = true; for (int i = 0; i < ss1.length; i++) { if (ss1[i] != ss2[i] || ss1.length != ss2.length) { flg=false } } return flg; } }

  • java初心者なのですが

    java初心者なのですが クラスの配列を使用して配列の配列を作りたいのですが class B { double a[]; } class A{ public static void main(String[] args){ B[] a =new B[3]; for(int i=0;i<3;i++){ a[i]=new B(); } a[0].a[0]=3;         ・・ここでエラー a[0].a[50]=9; a[0].a[100]=100; a[1].a[200]=150; a[2].a[300]=250; System.out.println("a[0].a[0]="+a[0].a[0]); System.out.println("a[0].a[50]="+a[0].a[50]); System.out.println("a[0].a[100]="+a[0].a[100]); System.out.println("a[1].a[200]="+a[0].a[200]); System.out.println("a[2].a[300]="+a[1].a[300]); } } ここでエラーと書いたところでjava.lang.NullPointerExceptionというエラーが出ます。 何が間違えているのでしょうか?どうのようにすればエラーがなくなるのか教えてください。

    • ベストアンサー
    • Java
  • プログラミング(Java)について

    学校の課題で考えても、分からなかったので質問させてください。 下のプログラムを以下のように変更したいのです。 (1)正解の数から±20以下まで接近した時は「小さすぎます、でもあと少しです!!」または「大きすぎます、でもあと少しです!!」というメッセージを表示する。 (2)正解が出るまでに何回数字を入力したか数えて、正解が出た後で「正解が出るまで○○回かかりました」というメッセージを表示する。 (3)さらにその回数が5回以下だったら「すばらしい!」、その回数が10回以上だったら「間が鈍いですね」、5回と10回の間だったら「普通です」というメッセージを表示する。 import java.util.Scanner; public class kazuate{ public static void main(String args[]){ Scanner kbd = new Scanner(System.in); int x; boolean flag = true; int seikai = (int)(Math.random() * 1000); System.out.println("数当てゲームを始めます"); System.out.println("0~999の数字を入力してください"); while(flag){ x = kbd.nextInt(); if (x >= 0 && x < seikai){ System.out.println("小さすぎます、もう1回!"); }else if(x > seikai && x <= 999){ System.out.println("大きすぎます、もう1回!"); }else if(x == seikai){ System.out.println("正解です!"); flag = false; }else{ System.out.println("入力するのは0~999です。やり直してください"); } } } よろしくお願いします。

  • 【java 初心者】きれいな書き方 空白の使い方

    public static void main(1)(String(2)[] args)(3){... Sytem.out.println(4)(age +(5)"歳です"); for(6)(int i = 0(7);(7)i < 10(7);(7)i++)(3){... ソースコード書くとき、見やすくするために、空白を入れる時と入れない時がありますが、上記のような(数字)の空白はどうなりますか?また、きれいな書き方のルールが載っているサイトはありますか?教えていただけると幸いです。回答お願いします。

    • ベストアンサー
    • Java
  • Java初心者です

    次のようなプログラムを作りました interface Vehicle{ void drive(); } abstract class Animal{ abstract void show(); } class Lion extends Animal{ public void show(){ System.out.println("ライオンです"); } } class Horse extends Animal implements Vehicle{ public void show(){ System.out.println("馬です"); } public void drive(){ System.out.println("乗り物として使えます"); } } class Elephant extends Animal implements Vehicle{ public void show(){ System.out.println("象です"); } public void drive(){ System.out.println("乗り物として使えます"); } } class Bear extends Animal{ public void show(){ System.out.println("熊です"); } } class twentyeight{ public static void main(String args[]){ Animal an[]; an = new Animal[4]; an[0] = new Lion(); an[1] = new Horse(); an[2] = new Elephant(); an[3] = new Bear(); for(int i = 0;i < an.length;i++){ if(an[i] instanceof Vehicle){ an[i].drive();//ここにエラーが出る } else{ an[i].show(); } } } } インターフェイスを実装しているオブジェクトを判別し、そのdriveメソッドの呼び出しをしたいのですができません、どなたか教えてください。

    • ベストアンサー
    • Java
  • java 素数判定

    入力した数字が整数か否かを判定するjavaプログラムを作っています。 以下の通りコンパイルして実行しました。これだと実行したときに どんな数字を数字を入力しても「31は素数です。 」となります。 入力した数字を判定させるにはどのようにしたらいいのでしょうか? class Sosuu { public static void main (String[] args) { int n = 31; boolean isPrime = true; for (int i = 2; i <= n - 1; i++) if (n % i == 0) { isPrime = false; break; } if (isPrime) System.out.println(n + " は素数です。"); else System.out.println(n + " は素数ではありません。"); } }

    • ベストアンサー
    • Java

専門家に質問してみよう