подсчитать среднее значение многомерного массива

#java #arrays #multidimensional-array

#java #массивы #многомерный массив

Вопрос:

Меня попросили посчитать среднее значение многомерного массива (таблицы). Я думаю, что я все строю правильно (по крайней мере, я так чувствую):

 import java.util.Scanner;

public class Exam {
    static int NROWS = 5;
    static int NCOL = 6;
    static int[][] data = new int[NROWS][NCOL];

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

static void enterData(Scanner in) {
    System.out.println("How many rows ? (up to "   NROWS   ")");
    int rows = in.nextInt();
    System.out.println("How many cols ? (up to "   NCOL   ")");
    int cols = in.nextInt();
    for (int i = 0; i < rows; i  ) {
        System.out.println("Row"   i   ": ");
        for (int j = 0; j < cols; j  ) {
            System.out.print("Enter Data for Column "   j   ":");
            data[i][j] = in.nextInt();
        }
    }
}

static void countAvg() {
    int total = 0;
    int count = 0;
    for (int i = 0; i < NROWS; i  ) {
        for (int j = 0; j < NCOL; j  ) {
            total = total   data[i][j];
            count = count  ;
        }
    }
    int avg = total / count;
    System.out.println("the average is: "   avg);
}
  

}

но система по-прежнему отправляет мне это сообщение:

Исключение в потоке «main» java.lang.ArithmeticException: / на ноль в Exam.countAvg(Exam.java:33) в Exam.main(Exam.java:9)

Пожалуйста, помогите мне понять, что я делаю не так. Большое спасибо!

Комментарии:

1. В нем говорится, что вы делите на 0. Я бы подумал, что это будет на линии int avg = total / count; , поэтому ваш счет здесь равен 0. Я не знаю, как count = count ' это работает, поэтому просто попробуйте сделать count

2. Да. Это определенно ваша проблема. Я это протестировал. Извлеките count = и просто используйте count ;

3. Спасибо, Майкл! Теперь по какой-то причине среднее значение считается равным 0, что неверно. Как вы думаете, где может быть скрытая проблема?

4. Это потому, что вы выполняете целочисленное деление, которое отбрасывает десятичные дроби. Изменить int avg на double avg = total / (double) count;

5. Я собираюсь добавить ответ, и я нашел что-то еще.

Ответ №1:

Во-первых, измените count = count ; на просто count ;

Во-вторых, вы выполняете целочисленное деление, поэтому измените int avg = total/count; на double int = total / (double) count;

В-третьих, вы устанавливаете свой массив данных как 5X6, даже если они вводят что-то другое, это приведет к снижению среднего значения, поскольку количество будет добавляться для каждой ячейки, всего 30.

Вместо этого попробуйте следующее

 import java.util.Scanner;

public class Exam {
    static int[][] data;
    private static int rows = 0;
    private static int cols = 0;

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

    static void enterData(Scanner in) {
        System.out.println("How many rows ?");
        rows = in.nextInt();
        System.out.println("How many cols ?");
        cols = in.nextInt();
        data = new int[rows][cols];
        for (int i = 0; i < rows; i  ) {
            System.out.println("Row"   i   ": ");
            for (int j = 0; j < cols; j  ) {
                System.out.print("Enter Data for Column "   j   ":");
                data[i][j] = in.nextInt();
            }
        }
    }

    static void countAvg() {
        int total = 0;
        int count = 0;
        for (int i = 0; i < rows; i  ) {
            for (int j = 0; j < cols; j  ) {
                total = total   data[i][j];
                count  ;
            }
        }
        double avg = total / (double) count;
        System.out.println(count   "the average is: "   avg);
    }
}
  

Это позволит вам создать новый массив данных с входными строками и столбцами, что позволит вам правильно рассчитать среднее значение.

Комментарии:

1. Спасибо! Я думал то же самое о СТРОКАХ и столбцах, но эти статические переменные являются частью пакета по умолчанию, который был предложен для изменений.

Ответ №2:

Как упоминал Майкл Пикетт в комментариях выше, проблема связана с count = count ; . Во всех случаях ваш счетчик становится равным нулю, потому что вы используете post-increment , поэтому увеличение происходит после выполнения строки.Если вы используете pre-increment count = count; , приращение происходит во время выполнения строки.

Таким образом, вы можете использовать pre-increment , как указано выше, или post-increment без присвоения его count переменной.

Ответ №3:

Наряду с другими ответами (оба правильные) обратите внимание на пару вещей, которые могут улучшить читаемость вашего кода. Вы можете использовать цикл «для каждого» вместо использования индексов, и вы можете использовать = для добавления значения к итогу:

 for (int[] row: data) {
    for (int value: row) {
        total  = value;
        count  ;
    }
}
  

Также обратите внимание, что если вы знакомы с Java 8, вы можете сделать это в одном операторе:

 Arrays.stream(data).flatMapToInt(Arrays::stream).average()
  

Это возвращает значение an OptionalDouble , чтобы учесть возможность того, что массив будет пустым (возвращая значение an Optional.empty )