Задача только с использованием библиотек C. Создать динамическую вещественную матрицу NxM (N и M ввести с клавиатуры)
Создать динамическую вещественную матрицу NxM (N и M ввести с клавиатуры). Размещение в памяти: все строки матрицы располагаются в едином массиве (один запрос на выделение 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;
}