Ошибка "Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3"
Нужно сформировать одномерный массив, состоящий из произведения целочисленных элементов, располагающихся в четных строках матрицы X (n x m). Я вроде сделала, но выходит ошибка "Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3". Подскажите в чем проблема?
package Pr2;
import java.util.Scanner;
public class pr5 {
public static void main(String[] args) {
double[][] x;
double [] z;
int N,M,K;
double P;
int newn;
Scanner inp = new Scanner(System.in);
System.out.print("N = ");
N = inp.nextInt();
System.out.print("M = ");
M = inp.nextInt();
z = new double[N];
x = new double[N][M]; // N-число строк M-число столбцов
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
System.out.print("x(" + i + "," + j + ")=");
x[i][j] = inp.nextDouble();
}
}
inp.close();
//вывод матрицы в виде таблицы
for (int i = 0; i < x.length; i++) {
for (int j = 0; j < x[i].length; j++) {
System.out.printf("%6.2f", x[i][j]);
}
System.out.println();
}
//произведения четных строк матрицы
P = 1;
newn = 0;
for (int i = 0; i<M; i= i+2) { //четные строки
for (int j = 0; j < N; j++) {
if (!(x[i][j] % 1 == 0)) { // если целочисленные, то считается произведение
P = P * x[i][j];
z[newn] = P;
newn++;
}
}
}
for (int i = 0; i < N; i++) { //выводим новый массив
System.out.printf("Массив: x(%d) = %1.2f\n", i, z[newn]);
}
if (newn == 0) {
System.out.println("Ошибка");
}
}
}
Ответы (4 шт):
После "//произведения четных строк матрицы" перепутаны M и N
Код
z[newn] = P;
newn++;
нужно вынести из внутреннего цикла, и вообще newn не понадобится.
"Целочисленность" инвертирована была.
for (int i = 0; i<N; i= i+2) { //четные строки
z[i] = 1;
for (int j = 0; j < M; j++) {
if ((x[i][j] % 1 == 0)) {
z[i] *= x[i][j];
}
}
}
for (int i = 0; i < N; i++) { //выводим новый массив
System.out.printf("Массив: x(%d) = %1.2f\n", i, z[i]);
}
У вас ошибка при шагании i+2 на нечётных, нужно остановить цикл при M-1
for (int i = 0; i < N-1; i++) { //выводим новый массив
System.out.printf("Массив: x(%d) = %1.2f\n", i, z[newn]);
}
if (newn == 0) {
System.out.println("Ошибка");
}
Измените в конце вашего кода цикл
У вас в коде это далеко не единственная ошибка. Читайте мой ответ по этому вопросу (все замечания касаются и вашего кода). Нужна помощь: java.lang.ArrayIndexOutOfBoundsException
Результаты таковы:
import java.util.Scanner;
public class Pr5 {
public static void main(String[] args) {
double[][] sourceArray = inputArray();
//вывод матрицы в виде таблицы
for (int i = 0; i < sourceArray.length; i++) {
for (int j = 0; j < sourceArray[i].length; j++)
System.out.printf("%6.2f", sourceArray[i][j]);
System.out.println();
}
double [] resultArray = calculate(sourceArray);
//выводим новый массив
for (int i = 0; i < resultArray.length; i++) {
System.out.printf("Массив: x(%d) = %1.2f\n", i, resultArray[i]);
}
}
private static double[][] inputArray() {
double[][] sourceArray;
try (Scanner scanner = new Scanner(System.in)) {
System.out.print("Rows = ");
int rows = scanner.nextInt();
System.out.print("Columns = ");
int column = scanner.nextInt();
sourceArray = new double[rows][column];
for (int i = 0; i < sourceArray.length; i++) {
for (int j = 0; j < sourceArray[i].length; j++) {
System.out.print("x(" + i + "," + j + ")=");
sourceArray[i][j] = scanner.nextDouble();
}
}
}
return sourceArray;
}
//произведения четных строк матрицы
public static double[] calculate(double[][] array) {
double [] result = new double [array.length/2+1];
for (int i = 0; i < array.length; i = i + 2) { //четные строки
double increase = 1;
for (int j = 0; j < array[i].length; j++) {
if ((array[i][j] % 1 == 0)) increase *= array[i][j];
}
result[i/2] = increase;
}
return result;
}
}
А раз у нас отдельный метод отвечает за расчеты и создание результирующего массива, мы можем написать юнит тест для отладки
import org.junit.Test; import static org.junit.Assert.*;
public class Pr5Test {
@Test
public void testCalculate() {
System.out.println("calculate");
double[][] x = {{2,3.5,5},{1,3,8},{4,7,9}};
double[] expResult = {10D, 252D};
double[] result = Pr5.calculate(x);
assertArrayEquals(expResult, result, 0.0001);
}
}
Я оставил ваши методы статическими, но это не отменяет того, о чем я говорил в указанном ответе.