не могу дописать программу

Дана матрица целых чисел. Упорядочить ее строки по возрастанию значений их наибольших элементов. программа работает, если набирать, например, любую матрицу 2 на 2(с любыми элементами) или 3 на 3 со значениями, допустим, 1-9, но в других случаях не фурычит, как дописать не знаю

#include<stdio.h>
#include<locale.h>

#define N 100
#define F 100

void Perestanovka(int a[][N], int max_i, int m, int n) { //Перестановка строк
    while (max_i != 0) {
        int i = max_i - 1, j, cont;
        for (j = 0; j < n; j++) {
            cont = a[i][j];
            a[i][j] = a[max_i][j];
            a[max_i][j] = cont;
        }
        max_i--;
    }
    printf("Готовая матрица:\n"); //Результат
    for (int i = 0; i < m; i++) {
        printf("\n");
        for (int j = 0; j < n; j++) {
            printf("a[%d][%d]=%d ", i + 1, j + 1, a[i][j]);
        }
    }
}

void func(int a[][N], int m, int n) {
        int max = a[0][0];
        int max_i = 0;
        printf("\n"); //определение максимума
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (a[i][j] > max) {
                    max = a[i][j];
                    max_i = i;
                }
            }
        Perestanovka(a, max_i, m, n);
    }
}


void main() { //ввод
    setlocale(LC_ALL, "Russian");
    int a[F][N];
    int m, n;
    printf("Размерность матрицы: ");
    scanf_s("%d %d", &m, &n);
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            printf("матрица[%d][%d]: ", i + 1, j + 1);
            scanf_s("%d", &a[i][j]);
        }
    }
    func(a, m, n);
}

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

Автор решения: DmitryK

Она ни в каких случаях "не фурычит". Если у вас что-то получалось - скорее всего просто совпадение. Потому что по условию задачи вам нужно упорядочить строки по возрастанию их максимальных элементов. Т.е. вам нужно найти максимальный элемент в каждой строке, а затем сортировать строки (менять местами) в зависимости от их максимального элемента. А вы находите один максимальный элемент во всей матрице и запоминаете строку в которой он находится.
А в функции Perestanovka() вообще делаете странное - фактически делаете ротацию строк от нулевой до содержащий максимальный элемент на 1 шаг. Зачем - непонятно.
Функция func() в принципе вообще не нужна - максимумы можно находить во время ввода матрицы.
Что вам нужно делать:

  • при вводе строки сразу ищете максимальный элемент в этой строке и запоминаете. Можно в этом же массиве (задав размерность по столбцам на 1 больше), можно в отдельном
  • нужно отсортировать строки - здесь достаточно много вариантов.
  1. Делаете функцию-аналог swap() для строк (код уже есть у вас в алгоритме). Можете использовать любой алгоритм сортировки, который знаете. Хоть пузырьком. Если вместо двумерного массива сделаете массив указателей на одномерные массивы - перестановка строк местами сведется к перестановке местами двух указателей.
  2. Делаете отдельный массив из пар {мас. элемент, номер строки} (или двумерный массив [n][2]), сортируете его относительно первого параметра и затем копируете матрицу построчно в новое место в соответствии с порядком из этого массива.
  3. ... можно придумать ещё кучу вариантов.

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

void main() { //ввод
    int a[3][3]{
        { 1, 1, 5},
        { 1, 1, 3},
        { 1, 1, 1} };
    int m = 3, n =3;
→ Ссылка
Автор решения: JohnDoe

Внимательно сравни со своим первоначальным вариантом. И замечания в предыдущем ответе тоже учти.

void Perestanovka(int a[][N], int max_i, int m, int n, int nI) { //Перестановка строк
    while (max_i > nI) {
        int i = max_i - 1, j, cont;
        for (j = 0; j < n; j++) {
            cont = a[i][j];
            a[i][j] = a[max_i][j];
            a[max_i][j] = cont;
        }
        max_i--;
    }
    printf("\nГотовая матрица:\n"); //Результат
    for (int i = 0; i < m; i++) {
        printf("\n");
        for (int j = 0; j < n; j++) {
            printf("a[%d][%d]=%d ", i + 1, j + 1, a[i][j]);
        }
    }
}

void func(int a[][N], int m, int n, int nI) {
    int max = a[nI][0];
    int max_i = -1;
    printf("\n"); //определение максимума
    for (int i = nI; i < m; i++) {
        for (int j = 0; j < n; j++) {
            if (a[i][j] > max) {
                max = a[i][j];
                max_i = i;
            }
        }
    }
    Perestanovka(a, max_i, m, n, nI);
}


void main() { //ввод
    setlocale(LC_ALL, "Russian");
    int a[F][N];
    int m, n;
    printf("Размерность матрицы: ");
    scanf_s("%d %d", &m, &n);
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            printf("матрица[%d][%d]: ", i + 1, j + 1);
            scanf_s("%d", &a[i][j]);
        }
    }
    for (int i = 0; i < m; i++) {
        func(a, m, n, i);
    }
}
→ Ссылка