Не получается заменить элементы в квадратной матрице ниже побочной диагонали

Рейтинг: -1Ответов: 1Опубликовано: 13.03.2023

Вот задание: Все элементы матрицы 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

Ответы

▲ 0Принят

В представленном коде вычисление количества отрицательных чисел выполняется неправильно, так как не отбрасываются "чётные" строки и "нечётные" столбцы.

К тому же заполнение матрицы начинается до того, как будет вычислено полное количество.

Фактически, вычисляется количество отрицательных чисел в каждой строке, и оно же записывается в неправильные ячейки.

Исправленный вариант, оформлен в виде отдельной функции для упрощения тестирования:

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]