Необходимо двигать строки и столбцы так, чтобы наибольший элемент оказался слева вверху. До того, как начал разбираться с этими перемещениями, все работало. И вот в части кода с перемещениями (два цикла в конце), появляется такая ошибка: 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;
}
В вашем коде 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);
Также пересмотрите логику алгоритма, в частности алгоритм нахождения максимума.
Виртуальный выделенный сервер (VDS) становится отличным выбором
В COM порт поступают данные вида 0,0,999,000000110: , получив строку ее надо привести к виду 0,0,999,0,0,0,0,0,0,1,1,0
Найти сумму под и над главной диагональю ПРИМЕР 1 2 3 4 5 6 7 8 9 над ней будет 2+3+6=11 - правильно, а под 4+7+8=19 , а выдает 15 (7+8) Вот код:`