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
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
重複する数字を見つけたら、そこで判定を終了しないと誤動作します。
初心者ということなので、聞き流してもらっても構わないのですが、気になったことをいくつか。
●乱数生成をメインの流れの中で行っていますが、メソッドで独立させるのがいいです。
(プログラムの流れがわかりやすくなります)
●メソッドをすべてstaticにしていますが、インスタンスメソッドにしたほうが、後々のことを考えるといい場合が多いです。
●isTrueメソッドのようにメソッド外の変数を使う構造はやめましょう。メソッドの独立性がなくなりますし、デバッグが困難になりがちです。
●今回のような乱数なら、配列に0から9までを入れ、シャッフルするのが楽です。(標準クラスの何かにメソッドがありました)
以上です。
ありがとうございました。
お教えいただいた通り、配列に0から9までを入れ、シャッフルする方法でやるともっとシンプルにできました><b
ご回答いただきまして本当にありがとうございます^^
また何か質問させていただいたときに、機会があればまたご教授の程よろしくおねがいいたします><
本当にありがとうございました^^
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 引数 戻り値のあるメソッド 3 2023/02/12 06:23
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Java Java 配列<選挙> 4 2023/07/31 15:07
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
onClickで関数呼出し後に、結果...
-
Refreshメソッドの使い方
-
エクセルのマクロでプリンタを...
-
Labelコントロールに数字を代入...
-
エクセルVBAにおけるON TIMEメ...
-
VB.NET/256色でのBMPファイル保存
-
コマンドプロンプト実行後に画...
-
ダブルコロンの役割
-
PropertyGridの中央の縦線
-
for文(拡張)内の変数(ローカ...
-
drawStringで文字間隔の調整
-
ディレクトリの階層構造をツリ...
-
VBA コピーが出来ません…!
-
呼び出し側ってなんですか?
-
boolean型のフィールドとゲッタ...
-
「初心者です」-Xlint: depreca...
-
C#でtrimができません
-
vbaエクセルマクロ RemoveDupli...
-
mainメソッドのthrows節で設定...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
mainメソッドのthrows節で設定...
-
final修飾子を使っているのに、...
-
Labelコントロールに数字を代入...
-
onClickで関数呼出し後に、結果...
-
DataGridViewでセルクリックイ...
-
JSPで<SELECT>の中にDBから持っ...
-
コマンドプロンプト実行後に画...
-
Refreshメソッドの使い方
-
エクセルVBAにおけるON TIMEメ...
-
boolean型のフィールドとゲッタ...
-
javascriptからjavaを呼び出したい
-
VBPをダブルクリックするとたま...
-
配列のメソッド
-
【sendkeysメソッドが動かずに...
-
Excel VBA でExcelを終了したい...
-
VB.netで、シリアル通信のタイ...
-
worksheets & rows メソッドは...
-
Application.Wait の参照設定
-
(String args[])というメッソ...
おすすめ情報