Перестановка строк и столбцов в матрице для перемещения влево вверх. (С)

125
28 июня 2019, 06:20

Необходимо двигать строки и столбцы так, чтобы наибольший элемент оказался слева вверху. До того, как начал разбираться с этими перемещениями, все работало. И вот в части кода с перемещениями (два цикла в конце), появляется такая ошибка: expression must have pointer-to-object. Не совсем понятно, как правильно сделать перемещение строк и столбцов? Помогите, пожалуйста

#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
#include <malloc.h>
int main()
{
    int *a;  // указатель на массив
    int i, j, n, m, line, column, imax, jmax;
    printf("write the quantity of the lines\n");
    scanf_s("%d", &n);
    printf("write the quantity of the columns\n");
    scanf_s("%d", &m);
    printf("\n it would be matrix %dx%d\n", n, m);
    // Выделение памяти
    a = (int*)malloc(n*m * sizeof(int));
    // Ввод элементов массива
    for (i = 0; i < n; i++)  // цикл по строкам
    {
        for (j = 0; j < m; j++)  // цикл по столбцам
        {
            printf("\na[%d][%d] =", i, j);
            scanf_s("%d", (a + i * m + j)); // обращение к элементу с использованием указателя; a - указатель на массив 
        }
    }
    // Вывод элементов массива
    for (i = 0; i < n; i++)  // цикл по строкам
    {
        for (j = 0; j < m; j++)  // цикл по столбцам
        {
            printf("%5d ", *(a + i * m + j)); // 5 знакомест под элемент массива
        }
        printf("\n");
    }
    int max = a[0];
    for (int i = 1; i < n; i++)//Нахождение максимального элемента и его положения
    {
            for (int j = 1; j < m; j++)
            {
                if (a[i] > max)
                {
                    max = a[i];
                    imax = i;
                    jmax = j;
                }
            }
    }
    printf("the biggest element of the array is %d", max);
    for (int i = 0, temp = 0; i < n; i++) //imax, jmax - строки и столбца максимального элемента, n -кол-во строк
    {
        temp = a[0][i];
        a[0][i] = a[imax][i];
        a[imax][i] = temp;
    }
    for (int i = 0, temp = 0; i < m; i++) // перестановка столбца, m -кол-во столбцов
    {
        temp = a[i][0];
        a[i][0] = a[i][jmax];
        a[i][jmax] = temp;
    }


    free(a);
    return 0;
}
Answer 1

В вашем коде a имеет тип int*. a[i][j] - будет эквивалентно *(*(a + i) + j). Т.е. вы пытаетесь разыменовать int* дважды. *(a + i) в результате даст int, затем вы прибавляете j и применяете унарный * к int-у, что разумеется недопустимо.

Вы можете использовать тот подход, который был использован выше в вашем коде: заменить a[i][j] на a[i * m + j].

Другой подход состоит в том, чтобы использовать более похожую на двумерный массив сущность - массив указателей на массивы.

int row = 5;
int col = 4;
int ** matrix = malloc(sizeof(int*) * row);
for (int i = 0; i < row; ++i)
{
    matrix[i] = malloc(sizeof(int) * col);
}

При таком подходе можно будет использовать a[i][j] для доступа к элементу на i-той строке, j-том столбце. Очищать динамическую память, выделенную таким образом необходимо зеркально:

for (int i = 0; i < row; ++i)
{
    free(matrix[i]);
}
free(matrix);

Также пересмотрите логику алгоритма, в частности алгоритм нахождения максимума.

READ ALSO
Как правильно передать данные из COM порта

Как правильно передать данные из COM порта

В COM порт поступают данные вида 0,0,999,000000110: , получив строку ее надо привести к виду 0,0,999,0,0,0,0,0,0,1,1,0

95
Ошибка в с++ программа

Ошибка в с++ программа

Найти сумму под и над главной диагональю ПРИМЕР 1 2 3 4 5 6 7 8 9 над ней будет 2+3+6=11 - правильно, а под 4+7+8=19 , а выдает 15 (7+8) Вот код:`

120
Как использовать Qt в C++ без QtCreator?

Как использовать Qt в C++ без QtCreator?

Как я могу использовать Qt без QtCreator?

96