Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <malloc.h>
- #include <stdlib.h>
- #include <math.h>
- void MakeMatr(int *, int *);
- int** MakeMemory(int, int);
- void FreeMemory(int **, int);
- void OutMatr(int **mtr, int, int);
- void InputData(int **mtr, int, int);
- void SortAllRow(int **mtr, int, int, int);
- void SortCol(int **mtr, int, int, int, int);
- void SortRowByCol(int **mtr, int, int, int, int);
- const int LtoR= 1;
- const int RtoL= 0;
- const int UtoD= 1;
- const int DtoU= 0;
- int main()
- {
- int **a; // указатель на указатель на строку элементов
- int i, j, n, m;
- system("chcp 1251"); srand((unsigned)time(NULL));
- MakeMatr(&n, &m); a= MakeMemory(n, m);
- if (a==NULL) { printf("Закройте все ненужные приложения"); exit(1); }
- InputData(a, n, m);
- printf("\n\n"); OutMatr(a, n , m);
- SortAllRow(a, n, m, LtoR);
- printf("\n\n"); OutMatr(a, n , m); getchar();
- InputData(a, n, m);
- printf("\n\n"); OutMatr(a, n , m);
- SortAllRow(a, n, m, RtoL);
- printf("\n\n"); OutMatr(a, n , m);
- SortSortRowByColCol(a, n, m, UtoD, 0);
- printf("\n\n"); OutMatr(a, n , m);
- FreeMemory(a, n);
- getchar(); getchar();
- return 0;
- }
- //////////////////
- void MakeMatr(int *nn, int *mm)
- {
- system("cls"); int n1, m1;
- printf("Введите количество строк: ");
- scanf("%d", &n1);
- printf("Введите количество столбцов: ");
- scanf("%d", &m1);
- *nn= n1; *mm= m1;
- }
- //////////////////
- void FreeMemory(int **A, int N)
- {
- for(int i = 0; i < N; i++) {
- free(A[i]);
- }
- free(A);
- }
- ///////////////////
- int** MakeMemory(int nn, int mm)
- {
- // Выделение памяти под указатели на строки
- int **A; // указатель на указатель на строку элементов
- int i,j;
- A = (int**)malloc(nn * sizeof(int*));
- if (A==NULL) { printf("Память не выделена\n"); exit(1); }
- // цикл по строкам
- for (i = 0; i<nn; i++)
- {
- // Выделение памяти под хранение строк
- A[i] = (int*)malloc(mm * sizeof(int));
- // if(i==1) A[i]=NULL; //Тест для аварийного завершения программы
- /* В случае невыделения памяти
- удаление уже занятой происходит до n= i БДВ*/
- if (A[i]== NULL)
- { printf("Память не выделена\n");
- // Очистка
- for (int ii = 0; ii < i; ii++) // цикл по строкам
- free(A[ii]); // освобождение памяти под строку
- free(A); // удаление основы матрицы
- return NULL;
- }
- }
- return A;
- }
- /////////////////////
- void OutMatr(int **mtr, int nn, int mm)
- {
- // Вывод элементов массива
- for (int i = 0; i < nn; i++) // цикл по строкам
- {
- for (int j = 0; j < mm; j++) // цикл по столбцам
- {
- printf("%5d ", mtr[i][j] ); // 5 знакомест под элемент массива
- }
- printf("\n");
- }
- }
- //////////////////////
- void InputData(int **mtr, int nn, int mm)
- {
- for (int i = 0; i < nn; i++) // цикл по строкам
- {
- for (int j = 0; j<mm; j++) // цикл по столбцам
- {
- mtr[i][j]= rand() % 100;
- }
- }
- }
- /////////////////
- void SortAllRow(int **mtr, int nn, int mm, int path)
- {
- int tmp = 0;
- for (int row = 0; row < nn; row++)
- {
- for(int i = 0; i < mm; i++)
- {
- for(int j = (mm-1); j >= (i+1); j--)
- {
- switch (path)
- {
- case 1: if(mtr[row][j] < mtr[row][j-1])
- {
- tmp = mtr[row][j];
- mtr[row][j] = mtr[row][j-1];
- mtr[row][j-1] = tmp;
- } break;
- case 0: if(mtr[row][j] > mtr[row][j-1])
- {
- tmp = mtr[row][j];
- mtr[row][j] = mtr[row][j-1];
- mtr[row][j-1] = tmp;
- } break;
- }
- }
- }
- }
- }
- ///////////////////////////
- void SortCol(int **mtr, int nn, int mm, int path, int NumCol)
- {
- int tmp = 0;
- for(int i = 0; i < nn; i++)
- {
- for(int j = (nn-1); j >= (i+1); j--)
- {
- switch (path)
- {
- case 1: if(mtr[j][NumCol] < mtr[j-1][NumCol])
- {
- tmp = mtr[j][NumCol];
- mtr[j][NumCol] = mtr[j-1][NumCol];
- mtr[j-1][NumCol] = tmp;
- } break;
- case 0: if(mtr[j][NumCol] > mtr[j-1][NumCol])
- {
- tmp = mtr[j][NumCol];
- mtr[j][NumCol] = mtr[j-1][NumCol];
- mtr[j-1][NumCol] = tmp;
- } break;
- }
- }
- }
- }
- ////////////////////////////////////
- void SortRowByCol(int **mtr, int nn, int mm, int path, int NumCol)
- {
- int *tmp = 0;
- for(int i = 0; i < nn; i++)
- {
- for(int j = (nn-1); j >= (i+1); j--)
- {
- switch (path)
- {
- case 1: if(mtr[j][NumCol] < mtr[j-1][NumCol])
- {
- tmp = mtr[j];
- mtr[j]= mtr[j-1];
- mtr[j-1] = tmp;
- } break;
- case 0: if(mtr[j][NumCol] > mtr[j-1][NumCol])
- {
- tmp = mtr[j];
- mtr[j] = mtr[j-1];
- mtr[j-1] = tmp;
- } break;
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment