• ベストアンサー

0が表示されてしまいます

次のようなプログラムを作成し、3つの配列の共通部分を表示したいのですが、うまく表示されず0が何個も表示されました。おかしい部分は/**/で囲みましたので、なぜ0が表示されるのかわかる方いましたら教えてください。お願いします。 import java.util.*; import java.lang.*; public class hairetu { public static void main(String[] args) { Random generator = new Random(); int hairetu[] = new int[90]; for(int i=0; i<90; i++) { hairetu[i] = (int)(Math.random() * 450); } int hairetu2[] = new int[90]; for(int i=0; i<90; i++) { hairetu2[i] = (int)(Math.random() * 450); } int hairetu3[] = new int[90]; int k = 0; for(int i=0; i<90; i++) { for(int j=0; j<90; j++) { if(hairetu[i] == hairetu2[j]) { hairetu3[k] = hairetu[i]; System.out.println(hairetu3[k]); k++; } } } System.out.println("\n---------------------------------\n"); int hairetu4[] = new int[90]; for(int i=0; i<90; i++) { hairetu[i] = (int)(Math.random() * 450); } /* int hairetu5[] = new int[90]; int m = 0; for(int i=0; i<90; i++) { for(int j=0; j<90; j++) { if(hairetu3[i] == hairetu4[j]) { hairetu5[m] = hairetu3[i]; System.out.println(hairetu5[m]); m++; } } }*/ } }

  • mos21
  • お礼率46% (128/273)
  • Java
  • 回答数3
  • ありがとう数2

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

  • ベストアンサー
  • kacchann
  • ベストアンサー率58% (347/594)
回答No.2

//コードの真ん中あたり System.out.println("\n---------------------------------\n"); int hairetu4[] = new int[90]; for(int i=0; i<90; i++) { hairetu[i]=(int)(Math.random()*450);//←おかしいでしょ! } //左辺は、hairetu でなく hairetu4 だよね

mos21
質問者

お礼

あ、そうです(^^;ありがとうございます。

その他の回答 (2)

  • Sephy
  • ベストアンサー率35% (7/20)
回答No.3

 眠い目擦りながらの回答なので期待しないでください。。。  40行目(int m = 0;の直後)の for(int i=0; i<90; i++)  を for(int i=0; i<k; i++)  に書き換えました。 <根拠>  hairetu3の有効な要素数を変数kが保持しているので、その範囲だけ調べればいいのでは?と思ったので。

  • wogota
  • ベストアンサー率42% (66/154)
回答No.1

hairetuとhairetu2で同じ値のものをhairetu3に代入する ものですが、入れることの出来た値の回数が90より少ないからでしょうか、 javaではint型を定義したとき0が初期値となりますので。 そして、hairetu4に設定した乱数の中に0が含まれている場合に 結構多数の0が表示されることになると思われます。 というより、このプログラムでは、hairetu3に入る個数が 90を超えることは十分に考えられ、超えた場合は例外が 発生してしまいます。 hairetu3[ 90* 90]と宣言し、後のhairetu3とhairetu4の 比較ではhairetu3についてfor( i=0; i<k; i++)とするなどの 対処が必要になると思います。 (その場合、先と同じ理由でhairetu5[90*90*90]にする等の 対処が必要になると思います。90*90*90(=729000)は 結構大きい数なのでVectorなど動的に確保する方法も いいのかもしれません)

mos21
質問者

お礼

回答ありがとうございます。同じ値は90よりはどうしても少なくなりますよね(^^;hairetu3には0から90個の値ではないですか?ではintの初期値を1に設定すればいいですかね?

関連するQ&A

  • 配列を使用して

    試しに1から150までの中から数字を1つ10回取得しコマンドプロンプト上に表示するというプログラムを作成しました。しかし、コンパイルはできたのですが、変な文字が表示されてしまいます。このプログラムではだめでしょうか? import java.util.*; import java.lang.*; public class hairetu { public static void main(String[] args) { Random generator = new Random(); int hairetu[] = new int[10]; for(int i=0; i<10; i++){ int ran = (int)(Math.random() * 150); hairetu[0]=ran; hairetu[1]=ran; hairetu[2]=ran; hairetu[3]=ran; hairetu[4]=ran; hairetu[5]=ran; hairetu[6]=ran; hairetu[7]=ran; hairetu[8]=ran; hairetu[9]=ran; } System.out.println(hairetu); } }

    • ベストアンサー
    • Java
  • 九九のプログラム

    public class kuku{ public static void main(String[] args){ int[][] hyou=new int[10][10]; System.out.print(" "); int i; int yoko; for(i=1;i<hyou.length;i++){ yoko=(int)(Math.random()*10); hyou[i][0]=yoko; System.out.print(" "+hyou[i][0]); } System.out.println(); int j; int tate; for(j=1;j<hyou[0].length;j++){ tate=(int)(Math.random()*10); masu[0][j]=tate; System.out.println(hyou[0][j]); }}} これを実行すると乱数がダブって表示されてしまうのですが、ダブらないようにし、appletで実行できるようにしたいのですがどのように直したらいいのでしょうか。どなたかアドバイスください。

  • コンパイルできません

    2から150の中から数字を30個取得する。というのを2回繰り返します。そして、その2回とも両方に現れた数字だけを表示させたいのですが、自分が作成したプログラムではうまくコンパイルできませんでした。シンボルを解釈処理できません。互換性のない型。というエラーが出てしまいます。ここが間違っているなどアドバイス等お願いしますm(_ _)m import java.util.*; public class RandomTest { public static void main(String[] args) { Random generator = new Random(); //2から150の中から値が30個表示される for(int i=0; i<30; i++){ int ran = (int)(Math.random() * 148)+2; } for(int j=0; j<30; j++){ int ran2 = (int)(Math.random() * 148)+2; } int ran3 = ran && ran2; System.out.println(ran3); } }

    • ベストアンサー
    • Java
  • JAVAで配列を使って * を縦向きのグラフで表示したいです。

    JAVAの勉強をしています。 このプログラムは配列に乱数を生成して * を 横向きにするプログラムです。 練習問題で、以下のプログラムを書き換えて、* を縦向きのグラフで表示する問題なのですが、解く方法がわかりません。 どなたか答えもしくはヒントを下さい。 よろしくお願いします。 import java.util.Random; import java.util.Scanner; public class Test06_04 { public static void main (String[] args) { Random rand = new Random(); Scanner stdIn = new Scanner(System.in); System.out.print("要素数 : "); int n = stdIn.nextInt(); //要素数を読み込む int[] a = new int[n]; //配列を生成 for (int i = 0; i < n; i++) { a[i] = 1+ rand.nextInt(10); } for (int i = 0; i < n; i++) { System.out.print("a[" + i + "] : "); for (int j = 0; j < a[i]; j++) System.out.print('*'); System.out.println(); } } }

    • ベストアンサー
    • Java
  • コンパイルできません。

    コマンドプロンプト上で、乱数をいくつか取得するというプログラムを作成したいのですが、コンパイル出来なくて困っています。発生させる乱数を0~900までの数字の中から0~9個のうちのいずれかの個数だけ取得するようにしたいです。j< の所に変数を記述するのはダメなのでしょうか?わかる方いましたらお願いします。 import java.util.*; public class RandomTest{ int rand; public static void main(String[] args){    Random generator = new Random();    for(int i=0; i<1; i++){     int rand = (int)(Math.random() * 10);    }    for(int j=0; j<rand; j++){     int ran = (int)(Math.random() * 1000);       System.out.println(ran);    } } }

    • ベストアンサー
    • Java
  • ループが無駄に複雑な気が…

    以下は私が作成したプログラムで、 1.form[4][4][4]の三次元配列に0~32のランダムな正の整数を入れる 2.このランダムな数値の同じものは2つまで 3.form[i][j][0]~form[i][j][3]には同じ数値が入ってはいけない という条件を考えて作成したのですが、無駄に複雑になった気がします。 このプログラムはform[i][j][0]~form[i][j][3]が入らないように、数値が被ったら最初からやり直しにしています。 この作り方だと、これ入れないと最後の1個が被ってしまうものだったら無限ループが起きてしまうので…。 この無駄に複雑になってしまった気がするプログラムを、もっとシンプルに出来ないでしょうか? import java.util.Random; public class Loop { public static void main(String[] args){ int num; int[] check=new int [32]; int[][][] form=new int[4][4][4]; Random rand=new Random(); int i=0,j=0,k=0; for(i=0;i<32;i++) check[i]=0; i=-1; while(true){ while(true){ while(i<3){ num=rand.nextInt(32); if(check[num]!=2){ i++; form[i][j][k]=num; System.out.println(i+" "+j+" "+k+" "+form[i][j][k]); check[num]++; if(0<k){ for(int l=0;l<k;l++){ if(form[i][j][k]==form[i][j][l]){//同じだったらループのやり直し for(int m=0;m<32;m++) check[m]=0; i=-1; j=0; k=0; } } } } } if(j==3) break; num=rand.nextInt(32); if(check[num]!=2){ i=0; j++; form[i][j][k]=num; System.out.println(i+" "+j+" "+k+" "+form[i][j][k]); check[num]++; } } if(k==3) break; num=rand.nextInt(32); if(check[num]!=2){ i=0; j=0; k++; form[i][j][k]=num; System.out.println(i+" "+j+" "+k+" "+form[i][j][k]); check[num]++; } } for(i=0;i<4;i++){ for(j=0;j<4;j++){ for(k=0;k<4;k++){ System.out.println(k+" "+j+" "+i+" "+form[k][j][i]); } } } System.out.println("end"); System.exit(0); } }

    • ベストアンサー
    • Java
  • 意味がわかりません

    1から10のうちで乱数を1から10個のうちいずれかの個数を表示する。というプログラムを作成したく、次のようなプログラムを作成したのですが、表示結果に0(何も表示されない)が出てしまい意味がわからなくて困っています。1以上としたのになぜ何も表示されない結果が出るのでしょうか? import java.util.*; public class RandomTest{ public static void main(String[] args){ int rand; Random generator = new Random(); //1以上10以下のintの値をrandに rand = (int)(Math.random()*10)+1; for(int j=1; j<rand; j++){ int ran = (int)(Math.random() * 10)+1; System.out.println(ran); } } } お願いします。

    • ベストアンサー
    • Java
  • JAVAの質問です。

    JAVAの質問です。 javaでスロットを作りたいのですが…。 3行3列で縦と横同じ数字の場合”おめでとう”と表示されるプログラムを作りたいのですがわからないです。 助けてください(>_<) public class surotto { public static void main(String args[]) { int hako[][]; int i,j; hako = new int[3][3]; System.out.println("スロットスタート。"); for(i=; i<3; i++){ for(j=0; j<3; j++){ hako[i][j] = (int)(Math.random()*10); } } for(i=0; i<3; i++){ for(j=0;j<3;j++){ System.out.println([i][j]); } System.out.println("\r\n"); } for(i=0; i<3 ; i++){ if((hako[i][0] == hako[i][1]) && (hako[i][1] == hako[i][2])){ System.out.println("横がそろいました、おめでとう\n"); } } for(j=0; j<3 ; j++){ if((hako[0][j] == hako[1][j]) && (hako[1][j] == hako[2][j])){ System.out.println("縦がそろいました、おめでとう\n"); } }

    • ベストアンサー
    • Java
  • 連立方程式を解くプログラムの後退代入の所

    連立方程式を解くプログラムで前進消去の部分はできたのですが、後退代入の所がうまくいきません。教えて!gooを通して皆さまの力をお借りできればと思います。よろしくお願いいたします。 import java.io.*; import java.util.*; import java.math.*; //連立方程式を解くプログラム class krm3{ public static void main(String args[]){ System.out.println("連立方程式を求めます。"); //declaring and allocating2> double[][] A = null; try{ BufferedReader br = new BufferedReader (new FileReader("renritu.txt")); String s; String[] vals; int rows = 0,cols = 0; while((s = br.readLine()) !=null){ vals = s.split(" ");//split the line with space cols = Math.max(cols,vals.length); rows++; } System.out.println(rows+"×"+cols+" array found"); A = new double[rows][cols]; br.close(); br = new BufferedReader(new FileReader("renritu.txt")); rows = cols = 0; while((s = br.readLine()) !=null){ vals =s.split(" ");//split the line with space cols = vals.length; for(int i=0; i<cols;i++) A[rows][i]=Double.parseDouble(vals[i]); rows++; } }catch (IOException e){ System.out.println(e); } for(int i = 0;i<A.length;i++){ for(int j=0;j<A[i].length;j++){ System.out.print(A[i][j]+" "); } System.out.println(); } System.out.println(); //掃き出し法 //前進消去 //行i=0~n-2に対してi+1行目以降のi列目を消去する(ただしnは行の数) // //i行目をピポッド(i,i)で正規化(割る) // 1行目に(j,i)要素をかけてj行目から引く for(int i = 0;i<A.length-1;i++){ double P = A[i][i];//pivot for(int j=0;j<A[i].length;j++) A[i][j]/= P; for(int k=i+1;k<A.length;k++){ double v = A[k][i]; for(int j=0;j<A[i].length;j++){ A[k][j]-= A[i][j]*v; } } } for(int i = 0;i<A.length;i++){ for(int j=0;j<A[i].length;j++){ System.out.print(A[i][j]+" "); } System.out.println(); } System.out.println(); // eqs= // 1 2 3 4 // 0 1 7 8 // 0 0 1 2 //後退代入 //行i=n-1~1に対してi-1行目以前のi列目を消去する for(int i = A.length;2<i;i--){ double P2 = A[i-1][i-1] ;//pivot for(int j=A[i-1].length;j>2;j--) A[i-1][j-1]/= P2; for( int k=i-1;k>2;k--){ double v2 = A[k-1][i-1]; for(int j=A[i].length;j>2;j--){ A[k][j]-= A[i][j]*v2; } } } for(int i = 0;i<A.length;i++){ for(int j=0;j<A[i].length;j++){ System.out.print(A[i][j]+" "); } System.out.println(); } System.out.println(); } }

  • javaのプログラム

    int型の配列の各要素に1~10の乱数を代入し、各要素の値を縦向きの*のグラフで表示するプログラムを作っているのですが、結果がランダムででるので、自分の書いたプログラムが正しいのかわかりません。ソースを載せますので合っているのか間違っているか教えて下さい。もし間違っているならどこが間違いなのか教えていただけると嬉しいです。よろしくお願いします。 ●ソース import java.util.Random; import java.util.Scanner; class Graph { public static void main(String[] args){ Random rand = new Random(); Scanner stdIn = new Scanner(System.in); System.out.print("要素数:"); int n = stdIn.nextInt(); int a[] = new int[n]; for (int i = 0; i < n; i++) a[i] = 1 + rand.nextInt(10); for (int i = 1; i <= 10; i++){ for (int j = 0; j < n; j++) if (a[j] <= i) System.out.print("* "); else System.out.print(" "); System.out.println(); } } } ●実行例 要素数:12 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

    • ベストアンサー
    • Java

専門家に質問してみよう