fork download
  1. #include <iostream>
  2. #include <fstream>
  3. #include <cmath>
  4. #include <iomanip>
  5.  
  6. using namespace std;
  7. int create(int n, double *&a, double *&b) {
  8. a = new double[n * n];
  9. b = new double[n];
  10. if (!a || !b) {
  11. cerr << "Ошибка выделения памяти" << endl;
  12. return -1;
  13. }
  14. cout << "Введите элементы матрицы коэффициентов (" << n << "x" << n << "):" << endl;
  15. for (int i = 0; i < n; ++i) {
  16. for (int j = 0; j < n; ++j) {
  17. cin >> a[i * n + j];
  18. }
  19. }
  20.  
  21. cout << "Введите вектор свободных членов (" << n << " элементов):" << endl;
  22. for (int i = 0; i < n; ++i) {
  23. cin >> b[i];
  24. }
  25.  
  26. return 0;
  27. }
  28. double gauss(int n, double **a, double *b, double *x) {
  29. double det = 1.0;
  30. int *pivot = new int[n];
  31. for (int i = 0; i < n; ++i) {
  32. pivot[i] = i;
  33. }
  34.  
  35. for (int k = 0; k < n - 1; ++k) {
  36. int max_row = k;
  37. for (int i = k; i < n; ++i) {
  38. if (fabs(a[pivot[i]][k]) > fabs(a[pivot[max_row]][k])) {
  39. max_row = i;
  40. }
  41. }
  42. if (max_row != k) {
  43. swap(pivot[k], pivot[max_row]);
  44. det *= -1;
  45. }
  46. double pivot_val = a[pivot[k]][k];
  47. if (fabs(pivot_val) < 1e-10) {
  48. cerr << "Матрица вырожденная, определитель равен 0!" << endl;
  49. delete[] pivot;
  50. return 0.0;
  51. }
  52.  
  53. for (int i = k + 1; i < n; ++i) {
  54. double factor = a[pivot[i]][k] / pivot_val;
  55. for (int j = k; j < n; ++j) {
  56. a[pivot[i]][j] -= factor * a[pivot[k]][j];
  57. }
  58. b[pivot[i]] -= factor * b[pivot[k]];
  59. }
  60.  
  61. det *= pivot_val;
  62. }
  63. det *= a[pivot[n-1]][n-1];
  64. if (fabs(a[pivot[n-1]][n-1]) < 1e-10) {
  65. cerr << "Матрица вырожденная, определитель равен 0!" << endl;
  66. delete[] pivot;
  67. return 0.0;
  68. }
  69. for (int i = n - 1; i >= 0; --i) {
  70. double sum = 0.0;
  71. for (int j = i + 1; j < n; ++j) {
  72. sum += a[pivot[i]][j] * x[j];
  73. }
  74. x[i] = (b[pivot[i]] - sum) / a[pivot[i]][i];
  75. }
  76.  
  77. delete[] pivot;
  78. return det;
  79. }
  80. double** convertTo2D(double *a1D, int n) {
  81. double **a2D = new double*[n];
  82. for (int i = 0; i < n; ++i) {
  83. a2D[i] = &a1D[i * n];
  84. }
  85. return a2D;
  86. }
  87. void free2D(double **a, int n) {
  88. delete[] a;
  89. }
  90.  
  91. int main() {
  92. int n;
  93. cout << "Введите порядок системы линейных уравнений n: ";
  94. cin >> n;
  95. if (n <= 0) {
  96. cerr << "Некорректный порядок матрицы!" << endl;
  97. return 1;
  98. }
  99. double *a1D = nullptr;
  100. double *b = nullptr;
  101. if (create(n, a1D, b) != 0) {
  102. return 1;
  103. }
  104. double **a2D = convertTo2D(a1D, n);
  105. double *x = new double[n]();
  106. double determinant = gauss(n, a2D, b, x);
  107. cout << "\nРешение системы линейных уравнений:" << endl;
  108. for (int i = 0; i < n; ++i) {
  109. cout << "x[" << i + 1 << "] = " << fixed << setprecision(4) << x[i] << endl;
  110. }
  111. cout << "Определитель матрицы коэффициентов: " << fixed << setprecision(4) << determinant << endl;
  112. return 0;
  113. }
Success #stdin #stdout 0.01s 5292KB
stdin
4
1 1 1 1 
2 1 -1 1
3 -1 -1 2
2 2 1 -1
4 3 3 4
stdout
Введите порядок системы линейных уравнений n: Введите элементы матрицы коэффициентов (4x4):
Введите вектор свободных членов (4 элементов):

Решение системы линейных уравнений:
x[1] = 1.0000
x[2] = 1.0000
x[3] = 1.0000
x[4] = 1.0000
Определитель матрицы коэффициентов: 21.0000