Найти ошибки в коде программы

Доброй ночи, господа. Суть такова, программа должна отсортировать массив М[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  
→ Ссылка