Сортировка строк матрицы по неубыванию наибольших элементов - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток, помогите, кто осилит, вопрос таков, дана вещественная матрица NнаM, упорядочить ее строки по неубыванию их наибольших элементов То есть матрица (размерность введена с клавиатуры) 3.123 5.235 6.346 1.363 6.234 8.678 0.762 4.727 2.286 Нужно найти наибольший элемент в каждой строке И расположить строки по убыванию этих элементов 0.762 4.727 2.286 3.123 5.235 6.346 1.363 6.234 8.678 Выручайте, товарищи, скитаюсь над поиском инфы для задания 3-ий день, и ничего в голову не лезет, как реализовать сей алгоритм, двумерный массив я задал и повис – не могу сойти с этой мертвой точки, работаю с visual studio 2010 языком С, подскажите / напишите как реализовать, сдать нужно на завтра, использовать векторы, библиотеку <iostream> запрещено

Решение задачи: «Сортировка строк матрицы по неубыванию наибольших элементов»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
 
typedef double ITEMTYPE;
 
/// @return 0 if failed, else 1
int create(ITEMTYPE *** arr, int n, int m) {
    int fail = 0;
    int i;
 
    *arr = (ITEMTYPE **)calloc(n, sizeof(ITEMTYPE *));
    if (*arr == NULL)
        return 0;
 
    for (i=0; i<n; ++i) {
        (*arr)[i] = (ITEMTYPE*)calloc(m, sizeof(ITEMTYPE));
        if ((*arr)[i] == NULL) {
            fail = 1;
            break;
        }
    }
 
    if (fail != 0) {
        while (i>0)
            free((*arr)[i]);
        free(*arr);
        *arr = NULL;
        return 0;
    }
    return 1;
}
 
void destroy(ITEMTYPE ** *arr, int n, int m) {
    while(n>0) {
        --n;
        free((*arr)[n]);
    }
    free(*arr);
    *arr = NULL;
}
 
void generate(ITEMTYPE ** arr, int n, int m, int max) {
    int col;
    col = m;
    while(n>0) {
        --n;
        m = col;
        while(m>0) {
            --m;
            arr[n][m] = (ITEMTYPE)(((double)rand())/((double)RAND_MAX)*((double)max));
        }
    }
}
 
void print(ITEMTYPE ** arr, int n, int m) {
    int row = 0;
    int col = 0;
 
    while(row < n) {
        col = 0;
        while(col < m) {
            printf("%5.2f ", arr[row][col]);
            ++col;
        }
        ++row;
        fputc('\n', stdout);
    }
}
 
ITEMTYPE maxofrow(ITEMTYPE *row, int sz) {
    ITEMTYPE max;
 
    max = row[sz-1];
    while(sz > 0) {
        --sz;
        if(row[sz] > max)
            max = row[sz];
    }
    return max;
}
 
int sort(ITEMTYPE ** arr, int n, int m) {
 
    int imin, i, j;
    ITEMTYPE* maximum;
    ITEMTYPE* tmprow;
    ITEMTYPE  tmp;
 
    maximum = (ITEMTYPE*)calloc(n, sizeof(ITEMTYPE));
 
    if (maximum == NULL) {
        return 0;
    }
 
    for(i = 0; i<n; ++i)
        maximum[i] = maxofrow(arr[i], m);
 
    for(i = 0; i<n-1; ++i) {
        imin = i;
        for(j=i+1; j<n; ++j)
            if(maximum[j] < maximum[imin])
                imin = j;
 
        if(imin != i) {
            tmp = maximum[i];
            maximum[i] = maximum[imin];
            maximum[imin] = tmp;
 
            tmprow = arr[i];
            arr[i] = arr[imin];
            arr[imin] = tmprow;
        }
    }
 
    free(maximum);
    return 1;
}
 
int main() {
    ITEMTYPE ** matrix;
    int n,m;
    int exitcode = EXIT_SUCCESS;
 
    do {
        fputs("enter n(>0): ", stdout);
        scanf("%d", &n);
        fputs("enter m(>0): ", stdout);
        scanf("%d", &m);
    }
    while((n <= 0) || (m <= 0));
 
    if(create(&matrix, n, m) == 0) {
        fputs("create failed : no memory\n", stderr);
        return 1;
    }
 
    generate(matrix, n, m, 100);
 
    fputs("generated matrix:\n", stdout);
    print(matrix, n, m);
 
    if(sort(matrix, n, m) == 0) {
        fputs("sort filed : no memory\n", stderr);
        exitcode = EXIT_FAILURE;
    }
    else {
        fputs("sorted matrix:\n", stdout);
        print(matrix, n, m);
    }
 
    destroy(&matrix, n, m);
 
    return exitcode;
}

Объяснение кода листинга программы

В данном коде реализована сортировка строк матрицы по неубыванию наибольших элементов.

  1. Создание матрицы:
    • Объявляется тип данных ITEMTYPE, который будет использоваться для хранения значений элементов матрицы.
    • Определяется функция create, которая создает матрицу заданного размера и заполняет ее значениями.
    • Если выделение памяти под матрицу не удалось (например, из-за нехватки памяти), то код возвращает 0 и выводит сообщение об ошибке.
    • В основной функции main, после ввода размеров матрицы, вызывается функция create для создания матрицы.
    • Если создание матрицы не удалось, то код выводит сообщение об ошибке и завершает работу с кодом возврата 1.
    • Если создание матрицы успешно, то происходит генерация случайных значений элементов матрицы.
  2. Генерация матрицы:
    • Определяется функция generate, которая генерирует случайные значения элементов матрицы.
    • В основной функции main, после создания матрицы, вызывается функция generate для заполнения матрицы случайными значениями.
  3. Вывод матрицы:
    • Определяется функция print, которая выводит матрицу на экран.
    • В основной функции main, после генерации матрицы, вызывается функция print для вывода матрицы на экран.
  4. Сортировка матрицы:
    • Определяется функция sort, которая сортирует строки матрицы по неубыванию наибольших элементов.
    • В основной функции main, после вывода сгенерированной матрицы, вызывается функция sort для сортировки матрицы.
    • Если сортировка матрицы не удалась (например, из-за нехватки памяти), то код выводит сообщение об ошибке и изменяет код возврата на EXIT_FAILURE.
    • В противном случае, после сортировки, выводится отсортированная матрица.
  5. Уничтожение матрицы:
    • Определяется функция destroy, которая освобождает память, выделенную под матрицу.
    • В основной функции main, после сортировки матрицы, вызывается функция destroy для освобождения памяти под матрицей.
  6. Ввод размеров матрицы и завершение работы программы:
    • В основной функции main, после вывода отсортированной матрицы, программа завершается с кодом возврата EXIT_SUCCESS.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.867 из 5
Похожие ответы