Guest User

Untitled

a guest
Jan 17th, 2022
27
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.43 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5.  
  6. void MakeMatr(int *, int *);
  7. int** MakeMemory(int, int);
  8. void FreeMemory(int **, int);
  9. void OutMatr(int **mtr, int, int);
  10. void InputData(int **mtr, int, int);
  11.  
  12. void SortAllRow(int **mtr, int, int, int);
  13. void SortCol(int **mtr, int, int, int, int);
  14. void SortRowByCol(int **mtr, int, int, int, int);
  15.  
  16. const int LtoR= 1;
  17. const int RtoL= 0;
  18. const int UtoD= 1;
  19. const int DtoU= 0;
  20.  
  21. int main()
  22. {
  23. int **a; // указатель на указатель на строку элементов
  24. int i, j, n, m;
  25. system("chcp 1251"); srand((unsigned)time(NULL));
  26.  
  27. MakeMatr(&n, &m); a= MakeMemory(n, m);
  28. if (a==NULL) { printf("Закройте все ненужные приложения"); exit(1); }
  29.  
  30. InputData(a, n, m);
  31.  
  32. printf("\n\n"); OutMatr(a, n , m);
  33. SortAllRow(a, n, m, LtoR);
  34. printf("\n\n"); OutMatr(a, n , m); getchar();
  35.  
  36. InputData(a, n, m);
  37. printf("\n\n"); OutMatr(a, n , m);
  38. SortAllRow(a, n, m, RtoL);
  39. printf("\n\n"); OutMatr(a, n , m);
  40.  
  41. SortSortRowByColCol(a, n, m, UtoD, 0);
  42. printf("\n\n"); OutMatr(a, n , m);
  43.  
  44. FreeMemory(a, n);
  45.  
  46. getchar(); getchar();
  47. return 0;
  48. }
  49. //////////////////
  50. void MakeMatr(int *nn, int *mm)
  51. {
  52. system("cls"); int n1, m1;
  53.  
  54. printf("Введите количество строк: ");
  55. scanf("%d", &n1);
  56.  
  57. printf("Введите количество столбцов: ");
  58. scanf("%d", &m1);
  59.  
  60. *nn= n1; *mm= m1;
  61. }
  62. //////////////////
  63. void FreeMemory(int **A, int N)
  64. {
  65. for(int i = 0; i < N; i++) {
  66. free(A[i]);
  67. }
  68. free(A);
  69. }
  70. ///////////////////
  71. int** MakeMemory(int nn, int mm)
  72. {
  73. // Выделение памяти под указатели на строки
  74.  
  75. int **A; // указатель на указатель на строку элементов
  76. int i,j;
  77.  
  78. A = (int**)malloc(nn * sizeof(int*));
  79. if (A==NULL) { printf("Память не выделена\n"); exit(1); }
  80.  
  81. // цикл по строкам
  82.  
  83. for (i = 0; i<nn; i++)
  84. {
  85. // Выделение памяти под хранение строк
  86.  
  87. A[i] = (int*)malloc(mm * sizeof(int));
  88.  
  89. // if(i==1) A[i]=NULL; //Тест для аварийного завершения программы
  90.  
  91. /* В случае невыделения памяти
  92. удаление уже занятой происходит до n= i БДВ*/
  93.  
  94. if (A[i]== NULL)
  95. { printf("Память не выделена\n");
  96.  
  97. // Очистка
  98. for (int ii = 0; ii < i; ii++) // цикл по строкам
  99. free(A[ii]); // освобождение памяти под строку
  100.  
  101. free(A); // удаление основы матрицы
  102. return NULL;
  103. }
  104. }
  105.  
  106. return A;
  107. }
  108. /////////////////////
  109. void OutMatr(int **mtr, int nn, int mm)
  110. {
  111. // Вывод элементов массива
  112.  
  113. for (int i = 0; i < nn; i++) // цикл по строкам
  114. {
  115. for (int j = 0; j < mm; j++) // цикл по столбцам
  116. {
  117. printf("%5d ", mtr[i][j] ); // 5 знакомест под элемент массива
  118. }
  119. printf("\n");
  120. }
  121. }
  122. //////////////////////
  123. void InputData(int **mtr, int nn, int mm)
  124. {
  125. for (int i = 0; i < nn; i++) // цикл по строкам
  126. {
  127. for (int j = 0; j<mm; j++) // цикл по столбцам
  128. {
  129. mtr[i][j]= rand() % 100;
  130. }
  131. }
  132. }
  133. /////////////////
  134. void SortAllRow(int **mtr, int nn, int mm, int path)
  135. {
  136. int tmp = 0;
  137. for (int row = 0; row < nn; row++)
  138. {
  139. for(int i = 0; i < mm; i++)
  140. {
  141. for(int j = (mm-1); j >= (i+1); j--)
  142. {
  143. switch (path)
  144. {
  145. case 1: if(mtr[row][j] < mtr[row][j-1])
  146. {
  147. tmp = mtr[row][j];
  148. mtr[row][j] = mtr[row][j-1];
  149. mtr[row][j-1] = tmp;
  150. } break;
  151. case 0: if(mtr[row][j] > mtr[row][j-1])
  152. {
  153. tmp = mtr[row][j];
  154. mtr[row][j] = mtr[row][j-1];
  155. mtr[row][j-1] = tmp;
  156. } break;
  157. }
  158. }
  159. }
  160. }
  161. }
  162. ///////////////////////////
  163. void SortCol(int **mtr, int nn, int mm, int path, int NumCol)
  164. {
  165. int tmp = 0;
  166. for(int i = 0; i < nn; i++)
  167. {
  168. for(int j = (nn-1); j >= (i+1); j--)
  169. {
  170. switch (path)
  171. {
  172. case 1: if(mtr[j][NumCol] < mtr[j-1][NumCol])
  173. {
  174. tmp = mtr[j][NumCol];
  175. mtr[j][NumCol] = mtr[j-1][NumCol];
  176. mtr[j-1][NumCol] = tmp;
  177. } break;
  178. case 0: if(mtr[j][NumCol] > mtr[j-1][NumCol])
  179. {
  180. tmp = mtr[j][NumCol];
  181. mtr[j][NumCol] = mtr[j-1][NumCol];
  182. mtr[j-1][NumCol] = tmp;
  183. } break;
  184. }
  185. }
  186. }
  187. }
  188. ////////////////////////////////////
  189. void SortRowByCol(int **mtr, int nn, int mm, int path, int NumCol)
  190. {
  191. int *tmp = 0;
  192. for(int i = 0; i < nn; i++)
  193. {
  194. for(int j = (nn-1); j >= (i+1); j--)
  195. {
  196. switch (path)
  197. {
  198. case 1: if(mtr[j][NumCol] < mtr[j-1][NumCol])
  199. {
  200. tmp = mtr[j];
  201. mtr[j]= mtr[j-1];
  202. mtr[j-1] = tmp;
  203. } break;
  204. case 0: if(mtr[j][NumCol] > mtr[j-1][NumCol])
  205. {
  206. tmp = mtr[j];
  207. mtr[j] = mtr[j-1];
  208. mtr[j-1] = tmp;
  209. } break;
  210. }
  211. }
  212. }
  213. }
  214.  
Advertisement
Add Comment
Please, Sign In to add comment