Задача только с использованием библиотек C. Создать динамическую вещественную матрицу NxM (N и M ввести с клавиатуры)

Создать динамическую вещественную матрицу NxM (N и M ввести с клавиатуры). Размещение в памяти: все строки матрицы располагаются в едином массиве (один запрос на выделение NxM элементов). Создать функцию, которая формирует массив результатов – возвращает указатели на минимальные элементы заштрихованной области .

[Матрица NxM]

Я смог написать код для матрицы NxN,но не знаю как сделать код для NxM,укажите что нужно поменять что бы код корректно работал для Матрицы NxM.

    double* find_min(double** start_pointers, int N) {
    // Выделяем память для массива arr, где будем хранить минимальные значения строк
    double* arr = (double*)malloc(N * sizeof(double));
    // Проверяем, удалось ли выделить память
    if (!arr) {
        // Если память не удалось выделить, выводим сообщение об ошибке и завершаем программу
        printf("Memory allocation failed.\n");
        exit(EXIT_FAILURE);
    }

    // Инициализируем все элементы массива arr значением INT_MAX
    for (int i = 0; i < N; i++) {
        arr[i] = INT_MAX;
    }

    // Находим минимальные значения в каждой строке матрицы, ограниченные верхним треугольником
    for (int i = 0; i < N; i++) {
        int j = 0;
        for (double* t = start_pointers[i]; t < (start_pointers[i] + N); t++) {
            // Проверяем, что текущий элемент находится в верхнем треугольнике
            if (j >= i && j <= N - i - 1) {
                // Если значение текущего элемента меньше значения в arr для данной строки, обновляем arr
                if (arr[i] > *t) {
                    arr[i] = *t;
                }
            }
            j++;
        }
    }

    // Переставляем строки матрицы местами
    for (int i = 0; i < N / 2; i++) {
        double* temp = start_pointers[i];
        start_pointers[i] = start_pointers[N - i - 1];
        start_pointers[N - i - 1] = temp;
    }

    // Находим минимальные значения в каждой строке матрицы, ограниченные верхним треугольником
    // для отзеркаленной матрицы
    for (int i = 0; i <= N / 2 - 1; i++) {
        int j = 0;
        for (double* t = start_pointers[i]; t < (start_pointers[i] + N); t++) {
            // Проверяем, что текущий элемент находится в верхнем треугольнике
            if (j >= i && j <= N - i - 1) {
                // Если значение текущего элемента меньше значения в arr для данной строки, обновляем arr
                if (arr[N - i - 1] > *t) {
                    arr[N - i - 1] = *t;
                }
            }
            j++;
        }
    }

    // Возвращаем массив с минимальными значениями строк
    return arr;
}

void exercise_2() 
{
    int const N=7;


    // один запрос на выделение NxN элементов
    double** A = (double**)malloc(N * sizeof(double*) + N * N * sizeof(double));
    if (!A) {
        printf("Memory allocation failed.\n");
        exit(EXIT_FAILURE);
    }
    double* start = (double*)((char*)A + N * sizeof(double*));

    for (int i = 0; i < N; i++) {
        A[i] = start + i * N; // инициализация всех указателей массива указателей
    }


    // массив из указателей на начало строк X[i][0]
    double* start_pointers[N];


    srand(time(0));
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            A[i][j] = rand() % 91 - 50; //[-10; 10]
            printf("%10.3lf\t", A[i][j]);
            if (j == 0)
                start_pointers[i] = &A[i][j];
        }
        printf("\n");
    }
    printf("\n");

    double* arr = find_min(start_pointers, N);
    for (int i = 0; i < N; i++) {
        printf("Минимальное значение в %d строке = %.3lf\n", i + 1, arr[i]);
    }

    free(arr);
    free(A);
}

int main() {
    setlocale(LC_ALL, "Rus");

    exercise_2();

    return 0;
}

Ответы (0 шт):