• ベストアンサー

これは試験にでるといわれたのでどなたおしえてもらえませんか

このソースファイル(Ex2DTest.java)は2次元の参照型配列を用いるプログラムである。3×3の2次元の参照型配列を用いることができるように完成しなさい class SamData{ int x,y,z; void print(){ System.out.println(x+y+z); } } class Ex2DTest{ public static void main (String[] args){ //配列の宣言とインスタンス化   for(int i=0; i<array2d.length;i++){ for(int i=0;i<array2d[i].length;i++){ array2d[i][j].x=i*j; array2d[i][j].y=i+j; array2d[i][j].z=i-j; array2d[i][j].print(); } } } } 分かる方いらっしゃれば是非教えてください! よろしくおねがいします。

  • Java
  • 回答数4
  • ありがとう数76

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

  • ベストアンサー
  • tom11
  • ベストアンサー率53% (134/251)
回答No.3

こんにちは、 一応、以下のようにすると、コンパイルと実行は出来ますが。 class SamData{ int x,y,z; void print(){ System.out.println(x+y+z); } } public class Ex2DTest { public static void main(String[] args) { SamData[][] array2d = new SamData[3][3]; for (int i = 0; i < array2d.length; ++i) { for (int j = 0; j < array2d[0].length; ++j) { array2d[i][j] = new SamData(); array2d[i][j].x = i * j; array2d[i][j].y = i + j; array2d[i][j].z = i - j; array2d[i][j].print(); } } } } 一応自分なりに、入力実行させて理解してください。 もともと出題コードにも間違いが これって、写し間違い??? それとも、もともとの問題の間違い。??? >for(int i=0; i<array2d.length;i++){ >for(int i=0;i<array2d[i].length;i++){ iを二度使っている。 配列は、array2d[0]にしたほうがいいです。

mars2608
質問者

お礼

tom11さん 教えてくださってありがとうございます. 家ではコンパイルできる環境がないので明日学校に行って実行してみます. もうちょっと理解してみます.本当にありがとうございます。

その他の回答 (3)

  • tom11
  • ベストアンサー率53% (134/251)
回答No.4

追伸 >for (int j = 0; j < array2d[i].length; ++j) { でも、間違いにはならないと思います。 array2d[0]の方が私的には、いいと思うのですが、 出題者の考え方や問題の出し方により、 array2d[i]の方が正解になる可能性もあります。

  • kakuritsu
  • ベストアンサー率23% (62/261)
回答No.2

>分かる方いらっしゃれば是非教えてください! 教えてください…ではなくて、やってくださいでしょうか? >int x,y,z; これを外部からアクセスできるように変更してください。 変数のスコープを考慮すれば、宣言方法を修正しないとならないことがわかるでしょう。 >//配列の宣言とインスタンス化 文字通り、配列の宣言とインスタンス化を行ってください。 array2d という変数を宣言しないとならない事ぐらい わかりますよね? >array2d[i][j].x=i*j; こんな感じで2次元で使われているのだから 2次元で宣言してやればOKです。

mars2608
質問者

お礼

kakuritsuさん 参考になりましたのでありがとうございます. 下のように >int x,y,z; これを外部からアクセスできるように変更してください。 これは int x,y,z; をどう宣言を変えればいいのでしょうか >//配列の宣言とインスタンス化 文字通り、配列の宣言とインスタンス化を行ってください。 int [ ][ ] array2d; array2d = new int[3][3]; 以上の2箇所修正すればおkなんでしょうか よろしくおねがいします.

  • aigaion
  • ベストアンサー率47% (287/608)
回答No.1

問題だけを書いて,自分がどこまで考えたかを全く書かずに解いてください というのは,ここでは「丸投げ」と言われていて禁止事項になります. せめて,ここまでは考えたがここから先がわからないということを書いてください. ちなみに,それがそのファイルに書いてあるソースコードの全てだとすれば 「コンパイルエラがでて実行不可能なので何も表示されない.」が答えです. 書いてある内容の意図を汲めばもう少し違う内容になるかもしれませんが・・・

関連するQ&A

  • このプログラミングって正しい?

    与えられた実行列X,Y,Z(配列名x、y、z)から、X-YZを計算して、行列W(配列名w)に格納するメソッドを完成する。 Public static void XminusXY( double[][] x,double[][] y,double[][] z, double[][] w){ double wij; int el=z[0].length, m=y.length, n=z.length; for(int i = 0; i<m; i++){ for(int j = 0; j<n-1; j++){ wij=xij for(int k=0; k<el; k++) wij += -y[i][k]*z[k][j]; w[i][j]=wij; } } }

  • 多次元配列のソートがうまくいかない

    多次元配列のソートがうまくいかない 質問失礼します. 以下のような,String型,int型,double型の混在した多次元配列([3][3]の配列)をソートするプログラムを作成しました. このプログラムでは3番目の項目でソートを行っています. 問題点なのですが, 3番目の項目がdouble型の一桁(例えばarray[1][2]が2.0)ならばうまくソートできるのですが, 一つを2桁(例えばarray[1][2]を10.0)にすると何故か先頭の数(10.0の場合1)を基準にソートされてしまっているようです・・・ 配列へのデータの入れ方が間違っているのでしょうか? 原因がはっきりわからず困っているのですが, わかる方いましたらよろしくお願いします. public class Sort_test { /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ String[][] array = new String[3][3]; array[ 0 ][ 0 ] = "A"; array[ 0 ][ 1 ] = 2001+""; array[ 0 ][ 2 ] = 9.0+""; array[ 1 ][ 0 ] = "B"; array[ 1 ][ 1 ] = 1001+""; array[ 1 ][ 2 ] = 2.0+""; array[ 2 ][ 0 ] = "C"; array[ 2 ][ 1 ] = 3001+""; array[ 2 ][ 2 ] = 6.0+""; TheComparator comparator = new TheComparator(); // 3番目の項目でソートするように設定 comparator.setIndex( 2 ); // ソート実施 Arrays.sort( array, comparator ); dump(array); } public static void dump( String[][] array ) { for ( int i = 0;i < array.length;i++ ) { for ( int j = 0; j < array[ i ].length;j++ ) { System.out.print( "\t" + array[ i ][ j ] ); } System.out.println(); } } } //多次元配列ソート用クラス class TheComparator implements Comparator { /** ソート対象のカラムの位置 */ private int index = 0; /** ソートするためのカラム位置をセット */ public void setIndex( int index ) { this.index = index; } public int compare( Object a, Object b ) { String[] strA = ( String[] ) a; String[] strB = ( String[] ) b; return ( strA[ index ].compareTo( strB[ index ] ) ); } }

    • ベストアンサー
    • Java
  • 2次元配列のポインタ

    整数型行2列2の2次元配列の[1][0]は、ポインタでは3になるとおもっているのですが、ちがったでしょうか? 下記のソースでエラーが出ていて困っています。 void main() { int array[2][2] = { { 9, 9 }, { 9, 9 } }; int num=2, j,i; *(array + 3) = 0; for (i = 0; i < num; i++) { for (j = 0; j < num; j++) { printf("%d", array[i][j]); } puts(""); } } 99 09 と表示させたいのですが、どこに間違いがあるのでしょうか?

  • 並べ替え

    次のようなプログラムを作れ。 1.数値を次々に読み込んで配列に1番目から順に格納する。 2.配列に格納されている数値を逆の順番に並べ換える (最後に読み込んだ数値が配列の1番目に入る)。 3.その配列の内容を1番目から順番に画面に出力する。読み込み、逆転、出力の部分はそれぞれ関数にすること。 という課題をやっています。下のように作ってみたんですが 上手くいかなくて・・・ 何処が悪いか教えて下さい。 #include <stdio.h> #define MAX 100 void reve(int *, int *); void read(int *, int *); void write(int *,int *); int main () { int x[MAX]; int n=0; read(&n, x); reve(&n, x); write(&n, x); return; } void read(int *n, int x[]) { while(scanf("%d", &x[n]) == 1 ) { n += 1; } return; } void reve(int *n, int x[]) { int i, j, y; for(i = 0, j = n-1; i <j; i++, j--) { y = x[j]; x[j] = x[i]; x[i] = y; } return; } void write(int *n, int x) { int i; for(i = n; i = 0; i--) { printf("x[%d] = %d\n", i, x[i]); } return; }

  • java(バブルソート/単純挿入ソート)

    以下のプログラムを「バブルソートもしくは単純挿入ソートのプログラムに変更しなさい」という課題が出ました。 どのようにすればよろしいでしょうか? import java.util.*; public class SelectSort { //プログラムクラス名 //整列プログラム public static void main(String[] args){ //整列用 int 型配列 int[] target; int elems = KeyboardInput.askInt("要素数? "); //配列を乱数で初期化する target = setArray(elems); //初期状態を表示 display(target); //整列メソッドの呼び出し sortArray(target); //整列結果の表示 display(target); } //配列を乱数で初期化するメソッド static int[] setArray(int elems){ // 要素数個の int 型変数の確保 int[] array = new int[elems]; //乱数利用ための宣言 Random generator = new Random(); //乱数の最大値・最小値 int max = 100; int min = 0; //generator.nextDouble() で 0から1までのdouble型乱数発生 for(int i=0 ; i<array.length ; i++) { array[i] = (int)((max-min)*(generator.nextDouble())+min); } return array; } //配列の状態を表示 static void display(int[] array){ for(int i=0 ; i<array.length ; i++) { System.out.print(array[i]+" "); } System.out.println(""); } static void sortArray(int[] array){ //配列のはじめから最後まで繰り返す for( int i = 0; i < array.length-1 ; i++){ int min_id = i; int min = array[i]; //範囲中でもっとも小さい要素を探す for( int j=i+1 ; j< array.length ; j++ ) { if( array[j] < min ){ min = array[j]; min_id = j ; } } //範囲の始めと置き換える int tmp = array[i]; array[i] = array[min_id]; array[min_id] = tmp; //display(array); } } }

  • callocで二次元配列を作成するには?

    今、動的オブジェクトの勉強をしております。 動的の一次元配列の作り方として #include <stdio.h> #include <stdlib.h> int main(void) {    int *a;    int x;    printf("配列の大きさX入力>");    scanf("%d",&x);    a=calloc(x,sizeof(int));    return (0); } これでいいと思うんですが動的な2次元配列を 作りたいときはどのようにすればよろしいのでしょうか? (↓作りたい二次元配列の例(1)↓) int main(void) {    int *a;    int x , y;    printf("配列の大きさX入力>");    scanf("%d",&x);         //5と入力    printf("配列の大きさY入力>");    scanf("%d",&y);         //10と入力    上のように入力するとa[5][10]という配列が完成する } よろしくお願いします

  • n個の要素を持つ配列xをシェルソートで昇順に整列

    穴埋め問題ですが、for文の j -= k の考えで立ち止まります。 #include <stdio.h> #define swap(X, Y) 【 1 】 ← X ^= Y, Y ^= X, X ^= Y void shell(int x[ ], int n); void main() {     int x[12] = {23, 67, 54, 82, 13, 28, 55, 61, 50, 32, 29, 44};     int n = 12, i ;     printf("配列(整列前)x => ");     for( i = 0; i < n - 1; i++ )         printf("%d, ",x[ i ]);     printf("%d\n",x[ i ]);       shell(x, n);     printf("配列(整列後)x => ");     for( i = 0; i < n - 1; i++ )         printf("%d, ",x[ i ]);     printf("%d\n",x[ i ]); } void shell(int x[ ], int n) {     int i, j, k = n ;     while( 【 2 】 ){ ← k > 0         【 3 】 ← k /= 2;         for( i = 0; 【 4 】; i++)             for( j = i; 【 5 】; j -= k)               swap(x[j], x[j + k]);     } } 【 1 】【 2 】は自信があるのですが【 3 】はあまり自信がないです。 【 4 】と【 5 】はどうすれば出来ますか教えてください。お願いします。

  • 並び替え

    次のプログラムを使い配列:{4, 2, 9, 8, 11}を並べ替え表示するには、mainメソッドをどのように書けばいいのでしょうか。 public class InsertSort { public static void sort(int a[]) { for (int i = 1; i < a.length; i++) { int j, x = a[i]; for (j = i-1; j >= 0 && a[j] > x; j--) a[j + 1] = a[j]; a[j + 1] = x; } } }

  • 2次元配列とポインタの引数受け渡しについて

    2次元配列を関数に渡すときは、引数に渡す2次元配列と同じサイズを指定、もしくは2次元目のサイズのみ合わせて渡す方法がありますが、両方とも違うサイズで同じ関数を使いたいです。 最初は中身が同じで引数で受け取る2次元配列のサイズだけ、それぞれに合わせた引数を持つ関数を2つ作っていたのですが、なんだか冗長な気がしました。 そこで、2次元配列の先頭ポインタとサイズを受け取るようにすればいいのかと思い、テストとして次のプログラムを作成してみました。 #include <stdio.h> void func(unsigned char *a, int y, int x); int main(void) { unsigned char a[10][10]; func(a, 10, 10); printf("%d\n", a[7][4]); return 0; } void func(unsigned char *a, int y, int x) { int i, j; for (i = 0; i < y; i++) { for (j = 0; j < x; j++) { *(a + i*y + j) = i * j; } } } もちろんこれでも動くのですが、やはりこういう書き方はルールにはないので、コンパイルで警告が出ます。 a.c: In function ‘main’: a.c:10: warning: passing argument 1 of ‘func’ from incompatible pointer type a.c:4: note: expected ‘unsigned char *’ but argument is of type ‘unsigned char (*)[10]’ このような書き方はやはりやめたいいのでしょうか。 また、その際はサイズ別に関数を作るしかないのでしょうか。 他にいい方法があれば教えていただけると助かります。

  • CSVファイルを多次元配列に格納する

    CSVファイルをopenCSVを読み込んでその行と列の要素数の多次元配列を作りその配列にデータを格納したいです。 しかし、データが格納できません。2回目の格納するためにwhileから何かおかしいのではないかと思っています。 なにかわかる方、アドバイスが欲しいです。 public class ReadCSV { public static void main(String[] args){ try{ CSVReader reader = new CSVReader( new FileReader("/home/masa/Desktop/WameiSample.csv")); //配列の宣言 String[] nextLine; //データを配列に入れる要素数を見る int j = 0; nextLine = reader.readNext(); int k = nextLine.length; System.out.println("列数[i]"+k); System.out.println("nextLine"+nextLine); while((nextLine = reader.readNext()) != null){ for (int i=0; i<nextLine.length; i++){ //System.out.print(nextLine[i] + "|" + i + "|"); } //System.out.println(); j++; } System.out.println("行数[j]"+j); //記憶する配列 String[][] Wamei = new String[k][j]; System.out.println("きてるよ"); //データを配列に格納していく int x = 0; while((nextLine = reader.readNext()) != null){ System.out.println("きてるよ");  <---こっから、表示してくれない. for (int y=0; y<nextLine.length; y++){ Wamei[x][y] = nextLine[y]; //多次元配列の要素を表示する System.out.print(Wamei[x][y]+"Wamei"+x+y); } System.out.println(); x++; } } catch (IOException e) { e.printStackTrace(); } } }

    • ベストアンサー
    • Java

専門家に質問してみよう