themlgyo

Untitled

Dec 19th, 2017
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.49 KB | None | 0 0
  1. #include <iostream>
  2. #include <Windows.h>
  3. using namespace std;
  4.  
  5. void output(double **a, double *y, int n) // Вывод системы уравнений
  6. {
  7. cout << endl;
  8. cout << "Заданная СЛАУ: " << endl;
  9. for (int i = 0; i < n; i++) // Инициализация строк СЛАУ
  10. {
  11. cout << endl;
  12. for (int j = 0; j < n; j++) // Инициализация столбцов СЛАУ
  13. {
  14. cout << a[i][j] << "x" << j; // Вывод коэффициентов
  15. if (j < n - 1) // Условие расстановки коэффициентов возле Х
  16. cout << " + "; // Простановка + между X
  17. }
  18. cout << " = " << y[i] << endl; // Вывод свободных членов уравнений через =
  19. }
  20. cout << " " << endl;
  21. return;
  22. }
  23. double *gauss(double **a, double *y, int n) // реализация метода Гаусса
  24. {
  25. double *x, max; // Инициализация динамического параметра х, максимального значения для дальнейшего использования в сравнении
  26. int k, index; // Инициализация переменной k, индекса index
  27. const double eps = 0.001; // точность вычислений
  28. x = new double[n]; // Инициализация массива
  29. k = 0;
  30. while (k < n) // Пробег по значениям, пока не достигнет последнего уравнения
  31. {
  32. // Поиск строки с максимальным a[i][k]
  33. max = abs(a[k][k]); // Задание начального максимального члена
  34. index = k; // Присвоение индекса
  35. for (int i = k + 1; i < n; i++) //Инициализация цикла
  36. {
  37. if (abs(a[i][k]) > max) // Сравнение следующего члена с max
  38. {
  39. max = abs(a[i][k]); // При выполнении условия следующий член становится максимальным для дальнейшего сравнения
  40. index = i; // Переназначение индекса
  41. }
  42. }
  43. for (int j = 0; j < n; j++) // Инициализация цикла для перестановки коэффициентов путем сравнения
  44. {
  45. double temp = a[k][j]; // Помещаем коэффициент во переменную temp
  46. a[k][j] = a[index][j]; // Заменяем пустующий элемент на элемент с переназначенным индексом
  47. a[index][j] = temp; // Перемещаем элемент с переназначенным индексом во временный
  48. }
  49. double temp = y[k]; // Помещаем свободный член во временную переменную temp
  50. y[k] = y[index]; // Заменяем пустующий элемент на свободный член с переназначенным индексом
  51. y[index] = temp; // Перемещаем свободный член с переназначенным индексом во временную переменную
  52. // Подведение результатов под точность эпсилон
  53. for (int i = k; i < n; i++) // Инициализация цикла
  54. {
  55. double temp = a[i][k]; // Помещение коэффициента в временную переменную
  56. if (abs(temp) < eps) continue; // для нулевого коэффициента пропустить
  57. // выполнение деления коэффициентов
  58. for (int j = 0; j < n; j++)
  59. a[i][j] = a[i][j] / temp;
  60. y[i] = y[i] / temp;
  61. if (i == k) continue;
  62. for (int j = 0; j < n; j++)
  63. a[i][j] = a[i][j] - a[k][j];
  64. y[i] = y[i] - y[k];
  65. }
  66. k++;
  67. }
  68. // обратный ход метода Гаусса
  69. for (k = n - 1; k >= 0; k--) // обратный цикл
  70. {
  71. x[k] = y[k];
  72. for (int i = 0; i < k; i++) // Инициализация цикла
  73. y[i] = y[i] - a[i][k] * x[k]; // формула нахождения ответа
  74. }
  75. return x;
  76. }
  77. int main()
  78. {
  79. double **a, *y, *x; // Инициалищация динамических массивов
  80. int n;
  81. SetConsoleCP(1251);// установка кодовой страницы win-cp 1251 в поток ввода
  82. SetConsoleOutputCP(1251); // установка кодовой страницы win-cp 1251 в поток вывода
  83. cout << "Введите количество уравнений: ";
  84. cin >> n;
  85. a = new double*[n]; // Инициализация массива
  86. y = new double[n]; // Инициализация массива
  87. cout << "Введите коэффициенты СЛАУ: " << endl;
  88. for (int i = 0; i < n; i++) // Инициализация массива под вводимые значения
  89. {
  90. a[i] = new double[n]; // Инициализация массива
  91. for (int j = 0; j < n; j++) // Инициализация цикла
  92. {
  93. cout << "a[" << i << "][" << j << "]= ";
  94. cin >> a[i][j];
  95. }
  96. }
  97. cout << "Введите свободные члены уравнений: " << endl;
  98. for (int i = 0; i < n; i++) // Ввод свободных членов уравнений
  99. {
  100. cout << "y[" << i << "]= ";
  101. cin >> y[i];
  102. }
  103. output(a, y, n); // Вывод СЛАУ
  104. x = gauss(a, y, n); // Решение методом Гаусса
  105. for (int i = 0; i < n; i++) // Вывод решения СЛАУ
  106. cout << "x[" << i << "]=" << x[i] << endl;
  107. return 0;
  108. }
Add Comment
Please, Sign In to add comment