-1

私のコードでは、配列の各行を次の各列で乗算する必要があります。ユーザーが高さと幅を入力すると、プログラムが配列値をランダムに生成します。たとえば (3x3) (3x3) のように配列が等しい場合、または (3x2) (2x3) の場合でも、エラーは発生しません。ただし、(3x3)(3x2) のようなものを入力すると、範囲外の例外が発生します。

public class Multiply {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        int width = -1;
        int height = 0;
        int width2 = 0;
        int height2 = 0;

        while (width != height2) {

            while (height <= 0) {
                System.out.print("Enter a height for array1: ");
                height = checkInt(scan);
            }

            while (width <= 0) {
                System.out.print("Enter a width for array1: ");
                width = checkInt(scan);
            }

            while (height2 <= 0) {
                System.out.print("Enter a height for array2: ");
                height2 = checkInt(scan);
            }

            while (width2 <= 0) {
                System.out.print("Enter a width for array2: ");
                width2 = checkInt(scan);
            }

            if (width != height2) {
                System.out
                        .println("Error! Dimensions of matrices not compatible. Try again.");
                width = -1;
                height = 0;
                width2 = 0;
                height2 = 0;
            }
        }

        int array1[][] = randomMatrix(height, width);
        int array2[][] = randomMatrix(height2, width2);
        int product[][] = matrixMultiply(array1, array2, height, width2);

        printArray(product);

    }// end of main method

    public static int[][] randomMatrix(int height, int width) {
        int array1[][] = new int[height][width];
        for (int i = 0; i < height; i++) {
            for (int j = 0; j < width; j++) {
                array1[i][j] = (int) (-10 + Math.random() * 20);
            }
        }
        return array1;
    }// end of randomMatrix method

    public static int[][] matrixMultiply(int[][] array1, int[][] array2, int height, int width) {
        int[][] product = new int[height][width];
        for (int i = 0; i < array1.length; i++) {
            for (int j = 0; j < array1[i].length; j++) {
                int prod = 0;
                for (int k = 0; k < array2.length; k++) {
                    prod = prod + array1[i][k] * array2[k][j];
                }
                product[i][j] = prod;
            }
        }
        return product;
    }// end of matrixMultiply method

    public static void printArray(int[][] array) {
        System.out.println(" ");
        System.out.println("Row Major Representation:");

        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                System.out.print(array[i][j] + " ");
            }
            System.out.println();
        }
        System.out.println(" ");
        System.out.println("Column Major Representation:");

        for (int i = 0; i < array[1].length; i++) {
            for (int j = 0; j < array.length; j++) {
                System.out.print(array[j][i] + " ");
            }

            System.out.println();
        }
    }

    public static int checkInt(Scanner scan) {
        int width = 0;
        if (scan.hasNextInt()) {
            width = scan.nextInt();
            return width;
        } else {
            scan.next();
            return 0;
        }

    }

}// end of public class Multiply
4

1 に答える 1

0

変数「j」の値 (行 82) の最後の繰り返しで、境界外例外が発生しています。(3x3)(3x2) でエラーが発生するのは、最後の "j" 反復で j が 2 に等しくなり、値が 1 (j の位置の最大インデックス値) より大きくなるためです。j > 最高インデックスの場合をチェックするロジックを追加すると、問題が回避されます。

于 2015-04-21T19:35:12.097 に答える