#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
// 2 dimension
void Swap( int *a, int *b );
// функция заполнения массива
void FillArr( int** a, const int r, const int c );
// функция вывода массива
void PrintArr(int** a, const int r, const int c);
// функция сдвигает вправо циклически указанную строку на одну позицию
void ShiftRightLoopRow( int**a, const int numRow, int cols );
// функция сортировки указанного столбца
void SortCol( int** a, int rows, const int numCol);
int main() {
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
srand(time(0));
printf( "Введите размеры двумерного массива: ");
int rows, cols;
scanf( "%d%d", &rows, &cols );
// выделяем память под массив указателей
int** arr = ( int** )malloc( rows * sizeof( int* ) );
if( arr == NULL ) {
puts( "Ошибка выделения памяти!" );
return 1;
}
int i;
for( i = 0; i < rows; ++i ) {
// выделяем память под очередную строку массива
arr[ i ] = ( int* )malloc( cols * sizeof( int ) );
if( arr[ i ] == NULL ) { // если выделить память под строку НЕ удалось,
int j; // то необходимо очистить память от всех ранее выделенных строк
for( j = 0; j < i; ++j )
// очищаем память от очередной строки
free( arr[ i ] );
free( arr ); // очищаем память от массива указателей
puts( "Ошибка выделения памяти!" );
return 1;
}
}
FillArr( arr, rows, cols );
PrintArr( arr, rows, cols );
int numRow;
printf("Введите строку, которую будем двигать: ");
scanf("%d", &numRow);
--numRow;
ShiftRightLoopRow(arr, numRow, cols);
PrintArr( arr, rows, cols );
int numCol;
printf("Введите столбец для сортировки: ");
scanf("%d", &numCol);
--numCol;
SortCol(arr, rows, numCol);
PrintArr( arr, rows, cols );
// ввод пользователя
for( i = 0; i < rows; ++i )
free( arr[ i ] ); // очищаем память от очередной строки
free( arr ); // очищаем память от массива указателей
return 0;
}
void FillArr( int** a, const int r, const int c ) {
int i, j;
for( i = 0; i < r; ++i )
for( j = 0; j < c; ++j )
a[ i ][ j ] = rand() % 101 - 50;
}
void PrintArr(int** a, const int r, const int c) {
int i,j;
for (i = 0; i < r; ++i) {
for (j = 0; j < c; j++)
printf("%5d", a[i][j]);
puts("");
}
}
void Swap( int *a, int *b ) { // указатель на int
int tmp = *a; // * - операция разыменования
*a = *b;
*b = tmp;
}
void ShiftRightLoopRow( int** a, const int numRow, int cols ){
int j;
int last = a[numRow][cols - 1];
for ( j = cols - 1; j > 0; --j )
a[numRow][j] = a[numRow][j - 1];
a[numRow][0] = last;
puts("");
}
//сортировка указанного столбца в порядке возрастания
void SortCol( int** a, int rows, const int numCol ){
int i,j;
for (i = 0; i < rows - 1; i++)
for (j = 0; j < rows - i - 1; j++)
if (a[j][numCol] < a[j + 1][numCol])
Swap(&a[j][numCol], &a[j + 1][numCol]);
}