constk

Some_shit_playing_2d_arrays

Feb 8th, 2020
171
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <time.h>
  3. #include <iomanip>
  4.  
  5. int **createArray2dFrag(size_t a, size_t b);
  6. void freeArray2dFrag(int **m, size_t a, size_t b);
  7. int **createArray2d(size_t a, size_t b);
  8. void freeArray2d(int **m, size_t a, size_t b);
  9. void freeArray2d(int **m);
  10. void setArray2d(int **m, size_t a, size_t b, int value);
  11. int **initArray2d(size_t a, size_t b);
  12. void setRandArray2d(int **m, size_t a, size_t b, int min, int max);
  13. void showArray2d(int **m, size_t a, size_t b, int wide);
  14. int **transpose(const int * const * m, size_t rows, size_t cols);
  15. void swap_min(int *m[], unsigned rows, unsigned cols);
  16.  
  17. int main()
  18. {
  19. setlocale(0, "Russian");
  20. srand(time(NULL));
  21.  
  22. int N = 5, M = 3;
  23. int x = 0;
  24. int **arr;
  25. arr = initArray2d(N, M);
  26.  
  27. setRandArray2d(arr, N, M, -10, 10);
  28. showArray2d(arr, N, M, 4);
  29.  
  30. system("pause");
  31.  
  32. int **arrT;
  33. arrT = transpose(arr, N, M);
  34. showArray2d(arrT, M, N, 4);
  35.  
  36. freeArray2d(arrT);
  37. system("pause");
  38. return 0;
  39. }
  40.  
  41. //Функция создания двумерного массива. Неэффективна из-за большого количества вызовов
  42. //дорогостоящего оператора new и из-за высокой степени фрагментации памяти
  43. int ** createArray2dFrag(size_t a, size_t b)
  44. {
  45. int **m = new int *[a];
  46. for (size_t i = 0; i < a; i++)
  47. {
  48. m[i] = new int[b];
  49. }
  50. return m;
  51. }
  52.  
  53. //Функция очищения памяти
  54. void freeArray2dFrag(int **m, size_t a, size_t b)
  55. {
  56. for (size_t i = 0; i < a; i++)
  57. delete[] m[i];
  58. delete[] m;
  59. }
  60.  
  61. //Более эффективная функция создания двумерного динамического массива
  62. int ** createArray2d(size_t a, size_t b)
  63. {
  64. int **m = new int *[a];
  65. m[0] = new int[a*b];
  66. for (size_t i = 1; i < a; i++)
  67. m[i] = m[i-1] + b;
  68. return m;
  69. }
  70.  
  71. //Более эффективная функция очищения памяти
  72. void freeArray2d(int **m, size_t a, size_t b)
  73. {
  74. delete[] m[0];
  75. delete[] m;
  76. }
  77. void freeArray2d(int **m)
  78. {
  79. delete[] m[0];
  80. delete[] m;
  81. }
  82.  
  83. //Функция, инициализирующая двумерный массив нулями
  84. void setArray2d(int **m, size_t a, size_t b, int value)
  85. {
  86. for (size_t i = 0; i < a; i++)
  87. {
  88. for (size_t j = 0; j < b; j++)
  89. m[i][j] = value;
  90. }
  91. }
  92.  
  93. //Функция, инициализирующая двумерный массив случайными значениями от min до max включительно
  94. void setRandArray2d(int **m, size_t a, size_t b, int min, int max)
  95. {
  96. for (size_t i = 0; i < a; i++)
  97. {
  98. for (size_t j = 0; j < b; j++)
  99. m[i][j] = rand()%(max - min + 1) + min;
  100. }
  101. }
  102.  
  103. //Функция, выводящая массив на экран в виде таблицы с шириной поля wide
  104. void showArray2d(int **m, size_t a, size_t b, int wide)
  105. {
  106. for (size_t i = 0; i < a; i++)
  107. {
  108. for (size_t j = 0; j < b; j++)
  109. std::cout << std::setw(wide) << m[i][j] << " ";
  110. std::cout << std::endl;
  111. }
  112. }
  113.  
  114. //Функция, создающая двумерный динамический массив и сразу инициализирующая его нулями
  115. int **initArray2d(size_t a, size_t b)
  116. {
  117. int **arr;
  118. arr = createArray2d(a, b);
  119. setArray2d(arr, a, b, 0);
  120. return arr;
  121. }
  122.  
  123. //Функция, принимающая матрицу m : dim(m) = rows x cols и возвращающая транспонированную матрицу, соответствующую данной
  124. int **transpose(const int * const * m, size_t rows, size_t cols)
  125. {
  126. int **mT = initArray2d(cols, rows);
  127. size_t a = cols;
  128. size_t b = rows;
  129.  
  130. for (size_t i = 0; i < a; i++)
  131. {
  132. for (size_t j = 0; j < b; j++)
  133. mT[i][j] = m[j][i];
  134. }
  135.  
  136. return mT;
  137. }
RAW Paste Data