Найти ошибки в коде программы
Доброй ночи, господа. Суть такова, программа должна отсортировать массив М[50] и каждую строку матрицы А[6][7] в порядке убывания, причем и массив и матрица должны быть с динамическим выделением памяти. По итогу в функциях сортировки change1 и change2 у меня получилось все очень печально и ничего не работает, и до меня не может дойти в чем дело.
Пример того, как программа должна работать: К примеру, массив M[5] - 2 8 3 7 1 должен отсортироваться так, чтобы получился такой результат - M[5] - 8 7 3 2 1 , а матрица A[2][4] -
5 5 7 7
1 10 8 3
должна стать такой A[2][4] -
7 7 5 5
10 8 3 1
Суть ошибки заключается в том, что вместо измененных массивов программа просто напросто ничего не выводит.
Update: Вообщем, все настолько плохо, что оказывается я забыл вызвать функцию вывода после изменения массива, но получаемый результат все равно неверный
Прикладываю полный код программы:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 50
#define M 6
#define Q 7
int input(int* a, int n)
{
int i;
for (i = 0; i < n; ++i)
{
*(a + i) = rand() % 30 - 15;
}
}
int change1(int* a, int n, int b)
{
int i, j, t;
for(i = 0; i < n - 1; i++)
{
for(j = 0; j < n - 1; j++)
{
if(*(a + i*b + j) < *(a++))
{
t = *(a++);
*(a++) = *(a + i*b + j);
*(a + i*b + j) = t;
}
}
}
}
int change2(int* a, int n, int b)
{
int i, j, t;
for(i = 0; i < n; i++)
{
for(j = 0; j < b; j++)
{
if(*(a + i*b + j) < *(a++))
{
t = *(a++);
*(a++) = *(a + i*b + j);
*(a + i*b + j) = t;
}
}
}
}
int output(int* a, int n, int m)
{
int i, j;
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
printf("%5d", *(a + i*m + j));
}
printf("\n");
}
}
int main()
{
srand(time(NULL));
int *m, *a, g;
m = malloc(4*N);
a = malloc(4*M*Q);
input(a,M*Q);
input(m,N);
printf("Massiv A: \n");
output(a,M,Q);
printf("Massiv M: \n");
output(m,1,N);
printf("Izmenenniy massiv M: \n");
change1(m,1,N);
printf("Izmeneniy massiv A: \n");
change2(a,M,Q);
free(a);
free(m);
}
Помогите, пожалуйста, разобраться где я и что не так накодил.
Ответы (1 шт):
Не буду расписывать где у вас ошибки в реализации алгоритма "пузырьковая сортировка", а просто посмотрите на реализацию тут. Единственное, судя по вашему последнему примеру вам нужно отсортировывать по убыванию, тогда вам нужно заменить > на <.
Если вам важно делать через арифметику указателей, то не нужно писать подобные вещи *(a++). Например у нас есть массив items, тогда получить значение i-го элемента можно следующим образом: *(a + i)
Теперь когда у вас есть правильно написанная функция change1, вы можете написать функцию change2 таким образом:
void change2(int* a, int n, int b)
{
for(int i = 0; i < n; ++i)
change1(a + i*b, b);
}
То есть мы передаем указатель на начало i-ой строки и размер строки b, в функцию change1, которая отсортировывает i-ую строку матрицы.
P.S. мне не очень понятно зачем в функции change1 три аргумента, если это важно, то можно оставить одну функцию change2 и передавать в нее change2(m, 1, N).
Пример вывода программы:
Massiv A:
10 -11 10 9 -7 10 -9
-1 1 5 -15 -7 -3 -3
11 -13 -9 -2 -10 6 9
6 -14 -12 12 11 -2 14
-14 14 -4 3 10 13 -3
10 1 3 -14 9 -14 -14
Izmeneniy massiv A:
10 10 10 9 -7 -9 -11
5 1 -1 -3 -3 -7 -15
11 9 6 -2 -9 -10 -13
14 12 11 6 -2 -12 -14
14 13 10 3 -3 -4 -14
10 9 3 1 -14 -14 -14