constk

Lab_2d_arrays

Apr 14th, 2020
71
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <ctime>
  4. #include <conio.h>
  5.  
  6. using namespace std;
  7.  
  8. //Задать двумерный массив размера a на b с клавиатуры
  9. int **inputMatrixFromKeyboard(size_t a, size_t b);
  10.  
  11. //Задать двумерный массив размера a на b случайным образом целыми числами от min до max (от -5 до 9 по умолчанию)
  12. int ** createRandomMatrix(size_t a, size_t b, int max = 9, int min = -5);
  13.  
  14. //Выводит матрицу в виде таблицы с заданной шириной поля (3 по умолчанию) на экран
  15. void showMatrix(int **m, size_t a, size_t b, int wide = 3);
  16.  
  17. //Удаляет матрицу, чистит память
  18. void freeMatrix(int **m, size_t a, size_t b);
  19.  
  20. //Функция для задания 1 - выводит на экран сумму элементов тех строк, которые содержат хотя бы один отрицательный элемент.
  21. void Task1(int **m, size_t a, size_t b);
  22.  
  23. //Функция для задания 2 - выводит на экран седловые точки матрицы (максимальные в своёй строке, но минимальные в своём столбце)
  24. void Task2(int **m, size_t a, size_t b);
  25.  
  26. int main()
  27. {
  28. setlocale(0, "Russian");
  29. srand(time(NULL));
  30.  
  31. //Считываем размер матрицы у пользователя
  32. size_t N = 0, M = 0;
  33. cout << "Введите количество строк матрицы: ";
  34. cin >> N;
  35. cout << "Введите количество столбцов матрицы: ";
  36. cin >> M;
  37.  
  38. int ** Matrix;
  39. char choice = 0;
  40. cout << "Хотите ввести матрицу вручную? (y/n)";//Хочет ли пользователь ввести массив вручую?
  41. choice = _getch();
  42. cout << endl;
  43.  
  44. if (choice == 'y')//Если да
  45. Matrix = inputMatrixFromKeyboard(N, M);//Вводим матрицу с клавиатуры
  46. else//Иначе
  47. {
  48. Matrix = createRandomMatrix(N, M);//Создаём случайную матрицу указанного размера
  49. cout << "Сгенерирована случайная матрица " << N << " на " << M << "." << endl;
  50. }
  51.  
  52. showMatrix(Matrix, N, M);//Выводим её на экран
  53.  
  54. cout << "Суммы элеметов строк, содержащих отрицательный элемент:" << endl;
  55. Task1(Matrix, N, M);//Первое задание
  56.  
  57. cout << endl << "Седловые точки:" << endl;
  58. Task2(Matrix, N, M);//Второе задание
  59.  
  60. freeMatrix(Matrix, N, M);//Удаляем матрицу из динамической памяти
  61.  
  62. system("pause");
  63. return 0;
  64. }
  65.  
  66. int **inputMatrixFromKeyboard(size_t a, size_t b)
  67. {
  68. int **m = new int *[a];
  69. for (size_t i = 0; i < a; i++)
  70. {
  71. m[i] = new int[b];
  72. cout << "Ввод " << ( i + 1 ) << " - ой строки: " << endl;
  73. for (size_t j = 0; j < b; j++)
  74. cin >> m[i][j];
  75. }
  76. return m;
  77. }
  78.  
  79. int ** createRandomMatrix(size_t a, size_t b, int max, int min)
  80. {
  81. int **m = new int *[a];
  82. for (size_t i = 0; i < a; i++)
  83. {
  84. m[i] = new int[b];
  85. for(size_t j = 0; j < b; j++)
  86. m[i][j] = rand() % (max - min + 1) + min;
  87. }
  88. return m;
  89. }
  90.  
  91. void showMatrix(int **m, size_t a, size_t b, int wide)
  92. {
  93. for (size_t i = 0; i < a; i++)
  94. {
  95. for (size_t j = 0; j < b; j++)
  96. cout << setw(wide) << m[i][j] << " ";
  97. cout << endl;
  98. }
  99. cout << endl;
  100. }
  101.  
  102. void freeMatrix(int **m, size_t a, size_t b)
  103. {
  104. for (size_t i = 0; i < a; i++)
  105. delete[] m[i];
  106. delete[] m;
  107. }
  108.  
  109. void Task1(int **m, size_t a, size_t b)
  110. {
  111. bool ThereIsNegativeElement = false; //Флаг, показывающий, есть ли в текущей строке отрицательные элементы
  112. int rowSum = 0; //Сумма элементов одной строки
  113. for (size_t i = 0; i < a; i++)
  114. {
  115. for (size_t j = 0; j < b; j++)
  116. {
  117. rowSum += m[i][j];//Ищем сумму строки
  118. if (m[i][j] < 0)//Если нашли отрицательный элемент
  119. ThereIsNegativeElement = true;//Устанавливаем флаг в true
  120. }
  121. if (ThereIsNegativeElement)//Если флаг true
  122. cout << "Сумма эдементов " << (i + 1) << " строки равна " << rowSum << endl;
  123. rowSum = 0;//Обнуляем сумму ряда
  124. ThereIsNegativeElement = false;//Устанавливаем флаг в false
  125. }
  126. }
  127.  
  128. void Task2(int **m, size_t a, size_t b)
  129. {
  130. bool thereAreSaddlePoints = false;
  131. int iMax = 0, jMax = 0, max = 0;
  132. bool itIsMin = true;//Флаг, показывающий, является ли точка минимальной в своём столбце
  133. for (size_t i = 0; i < a; i++)
  134. {
  135. max = m[i][0];//Устанавливаем изначальное значение max для текущей строки - первый её элемент
  136. jMax = 0;
  137. iMax = i;
  138. itIsMin = true;//Восстанавливаем флаг
  139. for (size_t j = 1; j < b; j++)//Ищем максимальный элемент i строки и запоминаем его строку и столбец в матрице
  140. {
  141. if (m[i][j] > max)
  142. {
  143. max = m[i][j];
  144. jMax = j;
  145. }
  146. }
  147. for (int k = 0; k < a; k++)//Проверяем, является ли данный элемент минимальным в своём столбце
  148. {
  149. if (m[k][jMax] < max)//Если находим элемент меньше чем max
  150. itIsMin = false;//Устанавливаем флаг в false
  151. }
  152. if (itIsMin)//Если данный элемент действительно наименьший в своём столбце
  153. {
  154. cout << "m [ " << iMax << " ] [ " << jMax << " ] = " << m[iMax][jMax] << " - седловая точка." << endl;
  155. thereAreSaddlePoints = true;
  156. }
  157. }
  158. if (!thereAreSaddlePoints)
  159. cout << "В данной матрице нет седловых точек" << endl;
  160. }
RAW Paste Data