Guest User

Untitled

a guest
Dec 7th, 2019
101
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7. setlocale(LC_ALL, "Russian");
  8. int n, m, i, j;
  9. double** a;
  10. cout << "Введите количество строк" << endl;
  11. cin >> n;
  12. cout << "Введите количество столбцов" << endl;
  13. cin >> m;
  14.  
  15. a = new double* [n];
  16.  
  17. for (i = 0; i < n; i++)
  18. a[i] = new double[m];
  19.  
  20. // ввод массива вручную
  21. for (i = 0; i < n; i++)
  22. for (j = 0; j < m; j++)
  23. {
  24. cout << "Введите элемент " << i << " " << j << endl;
  25. cin >> a[i][j];
  26. }
  27. cout << "Матрица:" << endl;
  28. // вывод массива на экран
  29. for (i = 0; i < n; i++)
  30. {
  31. for (j = 0; j < m; j++)
  32. cout << a[i][j] << " ";
  33. cout << endl; //тут обрываем строку
  34. }
  35.  
  36. int counter = 0, index_h = -1, index_w = -1;
  37.  
  38.  
  39. for (i = 0; i < n; i++) {//поиск первого нуля и счет кол-ва нулей
  40. for (j = 0; j < m; j++) {
  41. if (a[i][j] == 0) {
  42. if (index_h == -1 && index_w == -1) {
  43. index_h = i;
  44. index_w = j;
  45. }
  46. counter++;
  47. }
  48. }
  49. }
  50. cout << "Индекс первого нуля:" << index_h << " " << index_w << endl;
  51. cout << "Количество нулей в матрице: " << counter << endl;
  52.  
  53.  
  54.  
  55.  
  56. int size, max_i = index_h, min_j = index_w, k = 0;//проходим по диагонали квадрата для транспонирования
  57. for (i = index_h, j = index_w; i < n && j >= 0; (i++, j--)) {
  58. min_j = j; //min_j = индекс столбца элемента массива находящийся в начале диагонали, в конце которой стоит 0
  59. max_i = i; //max_i = индекс строки того же элемента
  60. }
  61.  
  62. if (index_h == index_w) { size = index_h; }
  63. else { size = max_i - index_h; }
  64.  
  65.  
  66. double** a_buffer;
  67. a_buffer = new double* [size+1];
  68. //создаем буферный массив
  69. for (i = 0; i < size+1; i++)
  70. a_buffer[i] = new double[size+1];
  71.  
  72. for (i = 0; i <= size; i++) {//заполняем буферную матрицу нулями, чтобы в пустые ячейки не залетал "мусор"
  73. for (j = 0; j <= size; j++) {
  74. if (i > n) { break; };
  75. a_buffer[i][j] = 0;
  76. }
  77. }
  78.  
  79.  
  80. cout << "Вырезанный квадрат для транспонирования: " << endl;
  81.  
  82. for (i = 0; i <= size; i++) {//Вырезаем квадрат для транспонирования
  83. for (j = 0; j <= size; j++) {
  84. if (i > n) { break; };
  85. a_buffer[i][j] = a[i+index_h][j+min_j];
  86.  
  87. cout << a_buffer[i][j] << " ";
  88. }
  89. cout << endl;
  90. }
  91.  
  92. cout << "Транспонированный квадрат: " << endl;
  93.  
  94. for (i = 0; i <=size; i++) {//Транспонируем его и возвращаем в исходную матрицу
  95. for (j = 0; j <=size; j++) {
  96. a[i + index_h][j + min_j] = a_buffer[j][i];
  97. cout << a_buffer[j][i] << " ";
  98. }
  99. cout << endl;
  100. }
  101.  
  102. for (int i = 0; i <size+1; i++)//Удаляем буферную матрицу, освобождаем память
  103. {
  104. delete[] a_buffer[i];
  105. }
  106. delete[] a_buffer;
  107.  
  108.  
  109. cout << "Матрица после транспонирования: " << endl;
  110.  
  111. for (i = 0; i < n; i++)//выводим результат
  112. {
  113. for (j = 0; j < m; j++)
  114. cout << a[i][j] << " ";
  115. cout << endl; //тут обрываем строку
  116. }
  117.  
  118. if (counter > n) {
  119. cout << "Матрица после замены нулей на их количество: " << endl;
  120. for (i = 0; i < n; i++) {
  121. for (j = 0; j < m; j++) {
  122. if (a[i][j] == 0) { a[i][j] = counter; }
  123. cout << a[i][j] << " ";
  124. }
  125. cout << endl; //тут обрываем строку
  126. }
  127. }
  128.  
  129.  
  130. //Удаляем массив - освобождаем память
  131. for (int i = 0; i < n; i++)
  132. {
  133. delete[] a[i];
  134. }
  135. delete[] a;
  136.  
  137. system("pause");
  138.  
  139.  
  140. return 0;
  141. }
RAW Paste Data