Сортировка строк матрицы по неубыванию наибольших элементов - 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;
}
Объяснение кода листинга программы
В данном коде реализована сортировка строк матрицы по неубыванию наибольших элементов.
- Создание матрицы:
- Объявляется тип данных ITEMTYPE, который будет использоваться для хранения значений элементов матрицы.
- Определяется функция create, которая создает матрицу заданного размера и заполняет ее значениями.
- Если выделение памяти под матрицу не удалось (например, из-за нехватки памяти), то код возвращает 0 и выводит сообщение об ошибке.
- В основной функции main, после ввода размеров матрицы, вызывается функция create для создания матрицы.
- Если создание матрицы не удалось, то код выводит сообщение об ошибке и завершает работу с кодом возврата 1.
- Если создание матрицы успешно, то происходит генерация случайных значений элементов матрицы.
- Генерация матрицы:
- Определяется функция generate, которая генерирует случайные значения элементов матрицы.
- В основной функции main, после создания матрицы, вызывается функция generate для заполнения матрицы случайными значениями.
- Вывод матрицы:
- Определяется функция print, которая выводит матрицу на экран.
- В основной функции main, после генерации матрицы, вызывается функция print для вывода матрицы на экран.
- Сортировка матрицы:
- Определяется функция sort, которая сортирует строки матрицы по неубыванию наибольших элементов.
- В основной функции main, после вывода сгенерированной матрицы, вызывается функция sort для сортировки матрицы.
- Если сортировка матрицы не удалась (например, из-за нехватки памяти), то код выводит сообщение об ошибке и изменяет код возврата на EXIT_FAILURE.
- В противном случае, после сортировки, выводится отсортированная матрица.
- Уничтожение матрицы:
- Определяется функция destroy, которая освобождает память, выделенную под матрицу.
- В основной функции main, после сортировки матрицы, вызывается функция destroy для освобождения памяти под матрицей.
- Ввод размеров матрицы и завершение работы программы:
- В основной функции main, после вывода отсортированной матрицы, программа завершается с кодом возврата EXIT_SUCCESS.