配列とwhileを使った2重ループを使って書きたい

このQ&Aのポイント
  • JAVAの勉強中に、int型2次元配列とwhileループを使って特定の画面を表示するコードを作成しています。
  • しかし、コードを実行すると一部の要素が表示されず、ArrayIndexOutOfBoundsExceptionエラーが発生してしまいます。
  • どのようにすれば、すべての要素が正しく表示されるか教えていただけないでしょうか?
回答を見る
  • ベストアンサー

配列とwhileを使った2重ループを使って書きたい

今JAVAの勉強をしているのですが、「以下のような画面を表示するコードをint型2次元配列とwhileを使った2重ループを使って書いてください。」 ======================================= a[0][0]:1 a[0][1]:2 a[1][0]:3 a[1][1]:4 ======================================= の問題をやっているのですが実行してみると a[0][0]:1 a[1][1]:4 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 at exsercise141.java.Exsercise141Java.main(Exsercise141Java.java:32) Java Result: 1 ビルド成功(合計時間: 0秒) と表示されてしまい、a[0][1]:2とa[1][0]:3が表示されません。 コードは以下のとおりです。 public static void main(String[] args) { // TODO code application logic here int i=0; int j=0;//変数を宣言 int B [] [] = new int [2] [2];//2次元配列を宣言 //======================================== B [0] [0] = 1;// B [0] [1] = 2; //========================================== B [1] [0] = 3; B [1] [1] = 4; //========================================== while(i<=3) { while(j<=3) { System.out.println("a["+i+"]["+j+"]:"+B[i][j]); i++; j++; } } } } どのようにすればa[0][1]:2とa[1][0]:3も表示されますか? ご教授願います。 ちなみにNetBeansを使用しております。 よろしくお願いします。

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

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.2

こんな感じで。 i=0 while i が 1以下 // i についてのループ  j=0  while j が 1以下 // j についてのループ   表示   j++  // j についてのループ終わり  i++ // i についてのループ終わり

その他の回答 (2)

  • weavaest
  • ベストアンサー率15% (157/1020)
回答No.3

正解は既に出ているようなので割愛します。 ここで質問する前に、出来ることがあると思います。それが分からないのであれば、回答を求めるより、回答の求め方を質問したほうが良いと思います。

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.1

while(i<=3) { while(j<=3) { これだと、iもjも3までまわりますね。 while(i<=1) { while(j<=1) { になりますが、中のループを抜けたらjを0に戻すのをお忘れなく。

関連するQ&A

  • クイックソートにおける、while文の無限ループの可能性と配列数を越えるケースについて

    以下は河西朝雄氏:著の 「C言語によるはじめてのアルゴリズム入門」 からのコードを、値をアレンジしてみたものです。 #include <stdio.h> void quick(int *,int,int); #define N 5 void main(void) { static int a[] = {5,3,1,4,2}; int k; quick(a,0,N-1); for(k=0;k<N;k++) printf("%4d",a[k]); } void quick(int a[],int left,int right) { int s,t,i,j; if(left<right){ s=a[left]; i=left; j=right+1; while(1){ while(a[++i]<s); while(a[--j]>s); if(i>=j) break; t=a[i];a[i]=a[j];a[j]=t; } a[left]=a[j];a[j]=s; quick(a,left,j-1); quick(a,j+1,right); } } (昇順で並べる場合に)今回のように 「軸として設定する先頭要素が、最大の数値」だった時、インデックスiを用いて軸の要素以上の数値を 探索していくことにした際、While文の「while(a[++i]<s);」のところは「下手をしたら無限ループ的に、延々と走査していくことになる可能性もアリなのでは…?」と思えるのですが…? ボーランド社フリーコンパイラにて 実行し、数値を表示させ確認してみたところ 当方環境下にての最初のiの探索のところは 「a[i]=6566949 iの値=5」となりまして、 この「i=5の箇所はナル文字の箇所のはず…?」と思い、 何故このような扱いとなるのか、わかりません。 ちなみに、配列として渡す引数の中身を 先頭を最小値、降順に並ぶように コードを変えてもやってみましたところ、 最初のiのところは 「a[i]=-2037199742 iの値=7」となりまして、 完全に配列のインデックスとして用意したものを 越えてしまい…何か、釈然としない感じなのです…。 よろしくお願い致します。

  • 2次元配列を引数とする関数について

    2次元配列を引数とする関数について 私は今、2次元配列を引数とする関数の表を作るという課題に取り組んでいます。 条件として、int a[数字][数字]={{1,2,3...}}という配列の宣言と同時の初期化は使わず、 関数内で表の値を代入し、値を表示する関数を作り、事実上二つの関数を作るというものです。 私は以下のようなプログラムを作り、動かしましたが、[数字][数字]=********のような本来 あるべき実行結果とは異なる数字の羅列が出てきてしまいました。 ↓ #include <stdio.h> void func(int a[][6]); void fund(int b[4][6]); void main(void) { int a[4][6]; fund(a); func(a); } void func(int a[][6]) { int i,j,b[4][6]; fund(b); for(i=0;i<4;i++)        { for(j=0;j<6;j++) { printf("a[%d][%d]=%d\n",i,j,a[i][j]); printf("\n"); } } } void fund(int b[4][6]) { int i,j; for(i=0;i<4;i++) { for(j=0;j<6;j++)          { scanf("b[%d]*[%d]=%d\n",&i,j,b[i][j]); } } } 本来の実行結果 1 2 3 4 5 6 2 4 6 8 10 12 3 6 9 12 15 18 4 8 12 16 20 24 紙にも書いて何回も見直しましたが、どこがおかしいのかわかりませんでした。 どうすれば良いのでしょうか? 何か良いアドバイスをよろしくお願いします。

  • 1次元配列と2次元配列のアドレスについて

    2次元a[2][3]と同じ分の1次元配列b[2*3]を確保して、常に a[0][0]=b[0] a[0][1]=b[1] a[0][2]=b[2] a[1][0]=b[3] a[1][1]=b[4] a[1][2]=b[5] となるようにしたいです。 たとえば、a[0][0]=100;としたら一緒にb[0]=100になるような状態です。 自分ではそれぞれ同じアドレスを参照するようにすればできると思ったんですが、その方法がわかりません。 ためしに、 int a[2][3],b[2*3]; を宣言して a=b;としてみたり、 for(i=0;i<2;i++){ for(j=0;j<3;j++){ &a[i][j]=&b[j+i*3]; } } などやってみたのですが、これだとエラーがでてしまいどうしたらいいかわかりません。 どうしたら出来るのかアドバイスお願いします。

  • JAVAのwhileループについての質問です

    こんばんわ。 javaのforループをwhileループ構文に書き換える問題で詰まっています。 僕はプログラミング超初心者なので、いろいろ考えたが、なかなか答えが出ていません。 ぜひ、わかる方に教えていただきたくここで質問させてもらいました。 ソースコードは以下です class S7j4{ public static void main(String args[]){ short a[] = {26,54,39,71,83,100,98,47,82,65}; short work; int i,j,n; n = 10; for (i = 0;i< n; i++) System.out.print(a[i] +" , "); System.out.println(); for(i = 0; i < n; i++) for(j = 0; j < n;j++) if(a[i] < a[j]){ work = a[i]; a[i] = a[j]; a[j] = work; } for(i = 0; i< n;i++) System.out.print(a[i] + " , "); System.out.println(); } } ぜひ一つよろしくお願いしますm(-_-)m

  • 二次元配列に関する質問です。

    一次元配列はわかるのですが二次元配列になると、わからない時があります。 <ソース> #include<stdio.h> int main() { int dat[2][5]={1,2,3,4,5,6,7,8,9,10}; int i; int j; for(i=0;i<2;i++){ for(j=0;j<5;j++){ printf("dat[%d][%d] %d\n",i,j,dat[i][j]); } } return 0; } このプログラムでわからないのは、 int dat[2][5]={1,2,3,4,5,6,7,8,9,10};の部分です。 普段は、int dat[2][5]={{1,2,3,4,5}, {6,7,8,9,10}, }; という使い方をしているのですが・・・。 どうちがうのでしょうか?

  • 配列の要素に同じ値をもたせないプログラムについて

    現在、JAVAの入門書にてプログラムの勉強中です。 その書籍に掲載のプログラムコードがどうしても意図する結果に なりません。入力間違いなどのミスはないか何回も見直しましたが、 どこも入力間違いは見当たりません。 何が原因か教えて頂けますでしょうか。 実行例がこのようになります。 数字は例なのでこの限りではありません。 要素数 : 7 a[0] = 7 a[1] = 5 a[2] = 1 a[3] = 2 a[4] = 9 a[5] = 6 a[6] = 3 プログラムコードが下記になります。 /*配列の全要素を1から10の乱数で埋め尽くす (すべての要素が重複しないようにする*/ 01: import java.util.Random; 02: import java.util.Scanner; 03: 04: class ArrayRandY { 05: 06: public static void main(String[] args) { 07: Random rand = new Random(); 08: Scanner stdIn = new Scanner(System.in); 09: 10: int n; //要素数 11: do { 12: System.out.print("要素数 : "); 13: n = stdIn.nextInt(); //要素数を読み込む 14: } while (n > 10); 15: int[] a = new int[n]; //配列を生成 16: 17: for (int i = 0; i < n; i++) { 18: int j = 0; 19: do { 20: a[i] = 1 + rand.nextInt(10); 21: for ( ; j < i; j++) 22: if (a[j] == a[i]) break; 23: } while (j < i;); 24: } 25: 26: for (int i = 0; i < n; i++) { 27: System.out.println("a[" + i + "] = " + a[i]); 28: } 29: } 30:} 以上です。 これを javac ArrayRandY.java → java ArrayRandY とやると、重複しない結果のときもありますが 重複する値が出てしまうときもあります。 著者のホームページの正誤表を見たのですが情報がありませんでした。 常にこのプログラムの配列の全要素を重複しないようにするには どうしたらよろしいでしょうか。 よろしくお願いいたします。 ちなみに、プログラムコードですが、入力画面ではインデントを 入力しているのですが確認画面ではなぜかインデントが表現 されてません。 大変見苦しいことお詫び申し上げます。

    • ベストアンサー
    • Java
  • jspでの二次元配列

    こんにちは。初めて質問させていただきます。よろしくお願いします。 現在javaで作ったプログラムをjspでも使えるようにしようと考えているのですが、 二次元配列がうまくjspで反映されず困っています。 jspに関してはほとんど無知で一から勉強している次第です。 そのためなるべく簡単に、と思い 以下のプログラムを、<% %>の間に入れるだけで動かせないかと思ったのですが エラーが出てしまいました。一次元の配列ならばできたのですが... ちなみに以下のプログラムはcsvファイルを読み込み、 多次元配列に格納していくというものです。 稚拙なプログラムで申し訳ありません... どなたかご教授いただければ幸いです。 import java.io.*; import java.util.StringTokenizer; import java.util.ArrayList; class Dog{  public static void main(String args[]) throws IOException{      String csv = "dognum.csv";      BufferedReader br = new BufferedReader(new FileReader(csv)); String[][] array = new String[100][]; int i = 0; while (true) { String line = br.readLine(); if(line==null) break; array[i] = line.split(","); i++; } for (i = 0; i < 101; i++) { for (int j = 0; j < array[i].length; j++) { System.out.println("["+i+"]["+j+"] = " + array[i][j]); } } } }

  • [C言語] 配列が添字の意味を失う理由

    はじめまして。こんばんは。 早速ですが、下記のソースコードは、 配列aの各要素の内容を先頭から順に調べ、最初に0であった要素の添字番号を表示する。 という内容の、C言語のプログラムです。(C++でコンパイルするためmain()はint型に指定) そこで、このプログラムを実行していて腑に落ちない点として、 プログラムの挙動を見る限り、 タイトルに書いたとおり、 「配列が添字の意味を失っている」という事なんです。 普通に配列の添字と考えれば、 while文の条件式は、 int i=0; while(a[i]) { i++; } なので、a[0]になるはずなので、 普通に考えれば 条件式の中身としては  配列a[0] が 配列a[0] になるまでi++をするとなるはずです。 しかしながら、このプログラムは、 初期値に「0」が入っている要素まで探し続けます。 なぜ、 「配列が添字の意味を失うのか?」 どなたか、この疑問にお答えしていただけますと幸いです。 「プログラムの内容」 配列aの各要素の内容を先頭から順に調べ、最初に0であった要素の添字番号を表示する。 「表示結果」 a[2]= 0 「ソースコード」 #include<stdio.h> int main() { int a[]={3,0,7,8,5,5,8}; int i=0; while(a[i]) { i++; } printf("a[%2d]=%2d \n",i,a[i]); }

  • 配列のプログラムですが

    #include <iostream> using namespace std; int main() { int a[100],b=-9999; int i=0,j; do { cout << "整数値を入力してください\n"; cin >> a[i]; b += a[i]; i++; }while( a[i-1] != 9999); cout << b << '\n'; for(j=0;j<i-1;j=j+1) cout << a[j] * 3 << '\n'; return 0; } このプログラムってどんな計算をしてるんですか?誰か分かる人いますか 整数値を入れてくださいって出るだけなんですが

  • 【C言語を教えてください!】2次元配列について

    【C言語を教えてください!】2次元配列について 2次元配列を用いて、コンソール画面(ターミナル)の中央付近に*を表示させるプログラムを作りたいのですがさっぱり分かりません。 画面の大きさは半角で横80 縦25です。 25は奇数ですので40×12に表示したいと思います。 2重ループでなら出来たのですが配列でのやり方がわかりません。 #include<stdio.h> main() { int i,j; for(i=0;i<25;i++){ for(j=0;j<80;j++){ if(i==12&j==39){ putchar('*'); }else{ putchar(' '); } } } return 0; } 回答お願いします!

専門家に質問してみよう