Почему возникает ошибка nan(ind)?
Пытаюсь привести матрицу к треугольному виду. На входе
4
10 23 17 44 25
15 35 26 69 40
25 57 42 108 65
30 69 51 133 95
// на входе принимается размер матрицы
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
int main() {
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
int n;
cin >> n;
int m = n + 1;// размер матррицы вместе с векторм b [n][m]
double a[4][5];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
cin >> a[i][j];
}
////проверяем, что первый элемент первого столбца не равен 0
for (int i = 0; i < n-1; i++) {
for (int i = 0; i < n - 1; i++) {
if (a[i][0] == 0) {
for (int y = 0; y < m; y++) {
int z = a[i][y];
a[i][y] = a[i + 1][y];
a[i + 1][y] = z;
}
}
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
cout << a[i][j] << " ";
cout << endl;
}//вывели матрицу
//cout << endl;
//приводим к треугольному виду
for (int i = 0; i < n - 1; i++) {
{
if (a[i][i] != 0) {
for (int k = i; k < n - 1; k++) {
float s = a[k + 1][i] / a[k][i];
for (int x = i; x < m; x++) {
float c = a[k][x] * (-1) * s;
a[k + 1][x] = a[k + 1][x] + c;
}
}
}
}
}
cout << endl;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
cout << a[i][j] << " ";
cout << endl;
}//вывели матрицу
}
Ответы (1 шт):
Потому что вы делите на 0.
Запишите
assert(a[k][i] != 0);
перед
float s = a[k + 1][i] / a[k][i];
и убедитесь в этом сами...
Что и неудивительно - ведь матрица
10 23 17 44
15 35 26 69
25 57 42 108
30 69 51 133
вырожденная, ее определитель равен 0...
P.S. Что-то странный у вас вложенный цикл
for (int i = 0; i < n-1; i++) {
for (int i = 0; i < n - 1; i++) {
нет? i во вложенном цикле скрывает i из внешнего, да и дальнейшее вызывает сомнения... int z = a[i][y]; тоже как-то не комильфо :) - зачем double до int обрезать?
Но главное - какой смысл в проверках до преобразований? Ведь именно в их процессе очередной опорный элемент может стать нулевым! Возьмите простую матрицу, типа
1 1
1 1
и вручную убедитесь, что первая ваша проверка работает, но уже после первой итерации преобразований вы получите нулевую вторую строку - и никаких проверок такой неприятности у вас уже нет.