質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

2434閲覧

JAVAの配列がよくわかりません

ain4425

総合スコア19

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/07/21 16:57

3桁の数字を入力して、数も場所もあっている(ヒット)のは何個で、数だけあっている(ブロー)は何個かを随時教えてくれるプログラムを書いています。
正解の数字は乱数で出しています。また、何回もできるようにループさせています。
答え合わせのしやすいように、初めに正解の数字は表示させています。
解答者が入力した数字をi[a]という配列(?)に代入したところくらいからよくわからなくなってしまいました。
現在何を入力しても0個と0個が表示されてしまいます。
java初心者のため、どこがどう違うのか分かりやすく教えていただけると幸いです。

java

1import java.io.BufferedReader; 2import java.io.IOException; 3import java.io.InputStreamReader; 4import java.util.ArrayList; 5 6public class Main { 7 public static void main(String[] args) { 8 int[] answerNumList = new int[3]; 9 System.out.println("3桁の数字を当ててください"); 10 System.out.println("3桁の数字は重複しません"); 11 System.out.println("0から始まる数字も可能です(例 012)"); 12 System.out.println("数字と場所が合っている場合はヒット、数字だけが合っていたらブローとしてその数が表示されます"); 13 System.out.print("正解 "); 14 //0~9が入ったList を生成 15 ArrayList<Integer> tempNumList = new ArrayList<Integer>(); 16 for(int i = 0; i < 10; i++){ 17 tempNumList.add(i); 18 } 19 //Listからランダムに数字を取り出して3桁の数を生成 20 for(int i = 0; i <answerNumList.length; i++){ 21 int selectNum = (int)(Math.random() * tempNumList.size()); 22 answerNumList[i] = tempNumList.remove(selectNum); 23 } 24 for(int i=0; i < answerNumList.length; i++){ 25 System.out.print(answerNumList[i]); 26 if(i != answerNumList.length -1) 27 System.out.print( " "); 28 } 29 //入力後のステップ 30 while(true){ 31 try{ 32 System.out.println(); 33 System.out.println("3桁の数字を入力してください。"); 34 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 35 String str = br.readLine(); 36 37 int num = Integer.parseInt(str); 38 int a[]=new int[num]; 39 40 //エラーの初期化、エラーをfalseにしておく 41 boolean error = false; 42 int length = str.length(); 43 //3桁でない数が入力されたときエラーをtrueにする 44 if (length != 3) 45 error = true; 46 //同じ数が入力されたときエラーをtrueにする 47 for(int i = 0 ; i < length; i++) { 48 for(int j =i +1; j < length; j++) { 49 if(str.charAt(i) == str.charAt(j)) 50 error = true; 51 } 52 } 53 //エラーの時の画面表示 54 if(error == true){ 55 System.out.println("入力エラーです。"); 56 System.out.println("0~9までの数値を3桁で重複しないように入力してください。"); 57 } 58 59 if(error == false){ 60 //hitの初期化 61 int hit = 0; 62 for(int i = 0; i < answerNumList.length; i++) 63 { 64 if ( a[i] == answerNumList[i]) 65 { 66 hit++; 67 } 68 } 69 //blowの初期化 70 int blow = 0; 71 for(int i = 0; i < 3; i++) 72 { 73 for(int j = 0; j <answerNumList.length; j++) 74 { 75 if( a[i] == answerNumList[j]) 76 { 77 blow++; 78 } 79 } 80 } 81 if(hit == answerNumList.length) 82 { 83 System.out.println("正解です."); 84 } 85 else 86 { 87 System.out.println("ヒット" + hit + "個," + "ブロー" + (blow - hit)+ "個"); 88 } 89 } 90 91 92 } 93 catch(IOException e){ 94 e.printStackTrace(); 95 } 96 } 97 98 } 99} 100

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

java

1String str = br.readLine(); 2int num = Integer.parseInt(str); 3int a[]=new int[num];

これは、例えば"123"と入力した際、長さ123の配列を作成している事になります。どんな数を入れようともこの配列の中身はすべて0なので、答えの数値に0が入っていないかぎりヒットもブローもしないことになります。

###ではどうするか?

  • 文字列の各文字を取り出して、'0'との差で数値にする(数値であることのチェックなどが事前に必要)

java

1String str = br.readLine(); 2int[] a = new int[answerNumList.length]; 3 4for (int i = 0; i < answerNumList.length; i++) { 5 a[i] = str.charAt(i) - '0'; 6}
  • 文字列を分解し、各文字をparseInt

java

1String str = br.readLine(); 2int[] a = new int[answerNumList.length]; 3String[] split = str.split(""); 4 5for (int i = 0; i < answerNumList.length; i++) { 6 a[i] = Integer.parseInt(split[i]); 7}
  • 数値変換し、剰余算で各桁を取り出す(コード略)

など、やりようはいくらかあります。


なお、他にも

  • 正解の数設定が各桁ランダムになる保証がないので、shuffleなどを使って並べ替えてから取り出すべき
  • ヒット、ブローの判定が二度手間。
  • メソッドに切り分けて処理するべき(入力が適正かどうかの判定など)

など、いくつか問題を抱えているようです。

投稿2016/07/21 17:05

編集2016/07/21 17:36
swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ain4425

2016/07/21 17:09

回答ありがとうございます。では、配列そのものの中身に数を入れたければどう表記すればいいのでしょうか
ain4425

2016/07/21 17:50

各文字の分解が自分なりに分かりやすいのでそれでやっていこうと思います。いろいろなやり方を提示していただきありがとうございました。 その他の問題点も含め、勉強していこうと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問