Вот проблема, над которой я работаю: Напишите программу, которая считывает матрицу 3 на 4 и отображает сумму каждого столбец и каждую строку отдельно.
Вот пример выполнения: Введите матрицу 3 на 4 строка за строкой:
1.5 2 3 4
5.5 6 7 8
9.5 1 3 1
Sum of the elements at column 0 is 16.5
Sum of the elements at column 1 is 9.0
Sum of the elements at column 2 is 13.0
Sum of the elements at column 3 is 13.0
Sum of the elements at Row 0 is: 10.5
Sum of the elements at Row 0 is: 26.5
Sum of the elements at Row 0 is: 14.5
и вот код, который я придумал:
package multidimensionalarrays;
public class MultidimensionalArrays {
public static void main(String[] args) {
double sumOfRow = 0;
double[][] matrix = new double[3][4];
java.util.Scanner input = new java.util.Scanner(System.in); //Scanner
System.out.println("Enter a 3 by 4 matrix row by row: ");
//Prompt user to enter matrix numbers
for (int row = 0; row < matrix.length; row++) {
for (int col = 0; col < matrix[0].length; col++) {
matrix[row][col] = input.nextDouble();
}
}
double[] sumOfCol =new double[matrix[0].length];
for (int i = 0; i < matrix.length; i++) { //row
for (int j = 0; j < matrix[i].length; j++) { //column
sumOfRow += matrix[i][j];
sumOfCol[j] += matrix[i][j];
}
System.out.println("Sum of the elements at row " + row + " is: " + sumOfRow);
}
System.out.println("Sum of the elements at column " + col + " is: " + sumOfCol);
}
}
Моя проблема в том, что когда доходит до конца, чтобы распечатать суммы для столбцов и строк, он не распознает переменные row или col. Я играл с этим и менял вещи, наверное, уже несколько часов, и я просто не могу понять это правильно, может ли кто-нибудь помочь мне с тем, что я делаю неправильно? Также я не знаю, правильно ли я суммирую столбец?




Переменная, подсчитывающая строки, называется i в том месте, где вы печатаете сумму строк.
Для сумм столбцов вам понадобится еще один цикл, чтобы печатать их одну за другой.
поэтому я заменяю строку на i?
Кроме того, мне нужно полностью вывести сумму столбца из этого цикла и поместить в другой цикл? извините, я только сейчас учусь программировать в первый раз, так что это меня очень сбивает с толку
@Britney Кроме того, здесь есть синтаксическая ошибка. По соглашению вы рассматриваете первую координату как координату строки.
@Britney: да, вы использовали i как строковую переменную. Суммы строк вычисляются правильно, просто для их вывода понадобится еще один цикл.
@ Генри Я предложил более простой алгоритм. Есть ли еще более эффективный алгоритм, который требует всего одного прохода для получения сумм всех строк и столбцов?
@Mulliganaceous Я не предоставил полное решение специально, чтобы дать ОП возможность разобраться.
@ Генри Спасибо. Однако из исходного кода Бритни использовала только один цикл и, возможно, захотела сохранить результаты во вспомогательном массиве, таком как sumOfCol.
В вашем matrix это матрица 3 на 4 из сегмента кода double[][] matrix = new double[3][4];. Первый индекс - это индекс строки, а второй индекс - индекс столбца.
Обратите внимание, что ваша матрица double[][] - это массив массивов. А именно, matrix представляет собой массив из трех массивов длиной 4, и по соглашению каждый подмассив можно рассматривать как массив объектов, расположенных в одну строку. Это называется основным порядком строк.
Например, в массиве
0 1 2 4
0 1 3 9
0 1 5 15
он действительно хранится как
matrix[0]: [matrix[0][0], matrix[0][1], matrix[0][2], matrix[0][3] и так [0 1 2 4]matrix[1]: [matrix[1][0], matrix[1][1], matrix[1][2], matrix[1][3] и так [0 1 3 9]matrix[2]: [matrix[2][0], matrix[2][1], matrix[2][2], matrix[2][3] и так [0 1 5 25]Вот более простой алгоритм, который использует петли для нахождения суммы значений для каждого значения строки и столбца, но требует двух проходов:
/* After the prompt code segment and sumOfCol in the main method */
// Row (major index)
for (int row = 0; row < matrix.length; row++) {
int rowSum = 0;
for (int col = 0; col < matrix[row].length; col++) {
rowSum += matrix[row][col];
}
System.out.println("Sum of the elements at row " + row + " is: " + rowSum);
}
// Column (minor index)
// Assuming the length of each row is the same
for (int col = 0; col < matrix[0].length; col++) {
int colSum = 0;
for (int row = 0; row < matrix.length; row++) {
colSum += matrix[row][col];
}
System.out.println("Sum of the elements at col " + col + " is: " + colSum);
}
На выходе
Enter a 3 by 4 matrix row by row:
0 1 2 4
0 1 3 9
0 1 5 15
Sum of the elements at row 0 is: 7
Sum of the elements at row 1 is: 13
Sum of the elements at row 2 is: 21
Sum of the elements at col 0 is: 0
Sum of the elements at col 1 is: 3
Sum of the elements at col 2 is: 10
Sum of the elements at col 3 is: 28
хорошо, вы объяснили это так, что помогли мне лучше понять это, массивы действительно сбивали меня с толку. Спасибо!!
@Britney Это соглашение использовать имена row и col для индексации 2D-массива в этом контексте.
Вы имеете в виду вместо i & j, который я использовал?
@ Бритни, да. Вы не назвали переменные индекса последовательно. Хорошая практика - постоянно называть
Я думал, что это вызовет проблему, потому что я уже объявил их в цикле, где пользователю нужно ввести номера матриц. одно и то же имя переменной может быть объявлено несколько раз в разных циклах? это разделяет их?
Объем i и j является локальным. Следовательно, имена i и j могут повторяться в разных циклах при условии, что они существуют только в циклах for.
В вашем текущем коде есть синтаксическая ошибка, особенно с строками и столбцами.