Перестановка нечетных и отрицательных элементов столбцов
Не переставляет столбцы. Сама задача:Характеристикой столбца целочисленной матрицы назовем сумму модулей его отрицательных нечетных элементов. Переставляя столбцы заданной матрицы, расположить их в соответствии с ростом характеристик. В чем ошибка, сам код:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
int main()
{
int M, N;
printf("ryad pls:");
scanf_s("%d", &M);
printf("stob pls:");
scanf_s("%d", &N);
int** mas = (int**)malloc(M * sizeof(int));
for (int i = 0; i < M; i++)
{
mas[i] = (int*)malloc(N * sizeof(int));
}
for (int i = 0; i < M; i++)
{
for (int j = 0; j < N; j++)
{
printf("arrayl (%d)(%d) = ", i, j);
scanf("%d", &mas[i][j]);
}
}
printf("vasha matrica\n");
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
printf("%5d ", mas[i][j]);
}
printf("\n");
}
for (int i = 0; i < N - 1; i++)
{
int sum1 = 0, sum2 = 0;
for (int j = 0; j < M; j++)
{
if ((mas[i][j] < 0) && (mas[i][j] % 2 != 0))
{
sum1 += abs(mas[i][j]);
}
if (mas[i][j + 1] < 0 && abs(mas[i][j + 1]) % 2 == 1)
{
sum2 += abs(mas[i][j + 1]);
}
}
if (sum1 < sum2)
{
for (int i = 0; i < N; i++)
{
int tmp = mas[i][j];
mas[i][j] = mas[i][j + 1];
mas[i][j + 1] = tmp;
}
}
}
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
printf("%5d ", mas[i][j]);
}
printf("\n");
}
}
Ответы (1 шт):
Автор решения: MBo
→ Ссылка
Вы делаете только один проход пузырьковой сортировки. Он должен привести к тому, что столбец с наименьшей характеристикой встанет на последнее место. Но остальные тоже надо отсортировать, для этого нужен двойной цикл
int main()
{
int M, N;
printf("ryad pls:");
scanf_s("%d", &M);
printf("stob pls:");
scanf_s("%d", &N);
int** mas = (int**)malloc(M * sizeof(int));
for (int i = 0; i < M; i++)
{
mas[i] = (int*)malloc(N * sizeof(int));
}
for (int i = 0; i < M; i++)
{
for (int j = 0; j < N; j++)
{
//printf("arrayl (%d)(%d) = ", i, j);
mas[i][j] = (rand() % 30) - 15;
}
}
printf("vasha matrica\n");
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
printf("%5d ", mas[i][j]);
}
printf("\n");
}
for (int k = N-1; k >=0 ; k--)
{
for (int c = 0; c < k; c++)
{
int sum1 = 0, sum2 = 0;
for (int r = 0; r < M; r++)
{
if ((mas[r][c] < 0) && (mas[r][c] % 2 != 0))
{
sum1 += abs(mas[r][c]);
}
if (mas[r][c + 1] < 0 && abs(mas[r][c + 1]) % 2 == 1)
{
sum2 += abs(mas[r][c + 1]);
}
}
if (sum1 > sum2)
{
for (int r = 0; r < M; r++)
{
int tmp = mas[r][c];
mas[r][c] = mas[r][c + 1];
mas[r][c + 1] = tmp;
}
}
}
}
printf("---------\n");
for (int i = 0; i < M; i++)
{
for (int j = 0; j < N; j++)
{
printf("%5d ", mas[i][j]);
}
printf("\n");
}
}
Результат:
ryad pls:5
stob pls:5
vasha matrica
-4 2 -11 -5 14
-11 3 3 7 -1
-10 -10 -14 12 -14
-4 10 -13 12 -9
6 9 -13 -12 7
---------
2 -5 14 -4 -11
3 7 -1 -11 3
-10 12 -14 -10 -14
10 12 -9 -4 -13
9 -12 7 6 -13