Не получается заменить элементы в квадратной матрице ниже побочной диагонали
Вот задание: Все элементы матрицы X (n x n), лежащие ниже второстепенной диагонали,заменить ко-личеством отрицательных элементов, стоящих в нечетных строках и в четных столбцах.
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("Введите размер квадратной матрицы: ");
int n = input.nextInt();
double[][] X = new double[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.print("Введите элемент в строке " + (i + 1) + " столбце " + (j + 1) + ": ");
X[i][j] = input.nextDouble();
}
}
System.out.println("Изначальная матрица:");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
String fmat = new DecimalFormat("#0.00").format(X[i][j]);
System.out.print(fmat + "\t");
}
System.out.println();
}
int countNegatives;
for (int i = 0; i < n; i++) {
countNegatives = 0;
for (int j = 0; j < n; j++) {
if (X[i][j] < 0) {
countNegatives++;
}
}
for (int j = 0; j < n; j++) {
if (j < n - i + 1) {
X[i][j] = countNegatives;
}
}
}
System.out.println("Матрица после замены:");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
String fmat = new DecimalFormat("#0.00").format(X[i][j]);
System.out.print(fmat + "\t");
}
System.out.println();
}
}
Пример ввода:
Введите размер квадратной матрицы: 3
Вв элемент в строке 1 столбце 1: 1
Вв элемент в строке 1 столбце 2: -2
Вв элемент в строке 1 столбце 3: 3
Вв элемент в строке 2 столбце 1: -4
Вв элемент в строке 2 столбце 2: 5
Вв элемент в строке 2 столбце 3: -6
Вв элемент в строке 3 столбце 1: 7
Вв элемент в строке 3 столбце 2: -8
Вв элемент в строке 3 столбце 3: 9
Пример вывода:
Изначальная матрица:
1.00 -2.00 3.00
-4.00 5.00 -6.00
7.00 -8.00 9.00
Матрица после замены:
1.00 1.00 1.00
2.00 2.00 2.00
1.00 1.00 9.00
Ожидаемый результат:
1.00 -2.00 3.00
-4.00 5.00 2.00
7.00 2.00 2.00
Ответы (1 шт):
В представленном коде вычисление количества отрицательных чисел выполняется неправильно, так как не отбрасываются "чётные" строки и "нечётные" столбцы.
К тому же заполнение матрицы начинается до того, как будет вычислено полное количество.
Фактически, вычисляется количество отрицательных чисел в каждой строке, и оно же записывается в неправильные ячейки.
Исправленный вариант, оформлен в виде отдельной функции для упрощения тестирования:
public static void fixMatrix(double[][] arr) {
int negs = 0;
int n = arr.length;
// считаем общее количество отрицательных чисел в нужных "узлах"
for (int i = 0; i < n; i += 2) { // "нечетные" строки (индекс с 1)
for (int j = 1; j < n; j += 2) { // "чётные" столбцы
if (arr[i][j] < 0) negs++;
}
}
System.out.println("Found: " + negs);
// заполняем элементы под побочной диагональю
for (int i = 1; i < n; i++) {
for (int j = n - 1; j > n - 1 - i; j--) {
arr[i][j] = negs;
}
}
}
Тест:
double[][] arr = {
{1, -2, 3},
{-4, 5, -6},
{7, -8, 9}
};
fixMatrix(arr);
for (double[] r : arr) {
System.out.println(Arrays.toString(r));
}
Результат:
Found: 2
[1.0, -2.0, 3.0]
[-4.0, 5.0, 2.0]
[7.0, 2.0, 2.0]