Untitled
unknown
c_cpp
a year ago
3.9 kB
2
Indexable
Never
#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 cols, 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, cols, 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 cols, const int numCol ){ int i; for (i = 0; i < rows - 1; i+= cols) if (a[i][numCol] > a[i + cols][numCol]) Swap(&a[i][numCol], &a[i + cols][numCol]); }