не могу дописать программу
Дана матрица целых чисел. Упорядочить ее строки по возрастанию значений их наибольших элементов. программа работает, если набирать, например, любую матрицу 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 шт):
Она ни в каких случаях "не фурычит". Если у вас что-то получалось - скорее всего просто совпадение. Потому что по условию задачи вам нужно упорядочить строки по возрастанию их максимальных элементов. Т.е. вам нужно найти максимальный элемент в каждой строке, а затем сортировать строки (менять местами) в зависимости от их максимального элемента. А вы находите один максимальный элемент во всей матрице и запоминаете строку в которой он находится.
А в функции Perestanovka() вообще делаете странное - фактически делаете ротацию строк от нулевой до содержащий максимальный элемент на 1 шаг. Зачем - непонятно.
Функция func() в принципе вообще не нужна - максимумы можно находить во время ввода матрицы.
Что вам нужно делать:
- при вводе строки сразу ищете максимальный элемент в этой строке и запоминаете. Можно в этом же массиве (задав размерность по столбцам на 1 больше), можно в отдельном
- нужно отсортировать строки - здесь достаточно много вариантов.
- Делаете функцию-аналог
swap()для строк (код уже есть у вас в алгоритме). Можете использовать любой алгоритм сортировки, который знаете. Хоть пузырьком. Если вместо двумерного массива сделаете массив указателей на одномерные массивы - перестановка строк местами сведется к перестановке местами двух указателей. - Делаете отдельный массив из пар
{мас. элемент, номер строки}(или двумерный массив [n][2]), сортируете его относительно первого параметра и затем копируете матрицу построчно в новое место в соответствии с порядком из этого массива. - ... можно придумать ещё кучу вариантов.
P.S. А для тестирования работы алгоритма, чтобы каждый раз не вводить данные с клавиатуры, задайте размеры и матрицу сразу в программе
void main() { //ввод
int a[3][3]{
{ 1, 1, 5},
{ 1, 1, 3},
{ 1, 1, 1} };
int m = 3, n =3;
Внимательно сравни со своим первоначальным вариантом. И замечания в предыдущем ответе тоже учти.
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);
}
}