Untitled

mail@pastecode.io avatar
unknown
c_cpp
a year ago
3.9 kB
2
Indexable
#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]);
}