初学,想实现n阶线性方程组求解。从txt文件中读入A矩阵和b,求解后将结果输出到另一个txt文件。
调试过程很奇怪,有时不会有问题,有时会报错。我单步执行时会在main函数return时出现断点,百度了一下,好像跟内存溢出什么的有关,没能看得很明白。请问是哪里出了问题。
#include <iostream>
#include <fstream>
#include <string>
#include <stdlib.h>
using namespace std;
class equation
{
public:
int n;
double ** A = new double *[n]; //系数阵
double *b = new double[n]; //常数项
double *x = new double[n];
void solve();
void DisplayEquation();
void DisplayResult();
void input();
void output();
equation()
{
n = 0;
}
equation(int a)
{
n = a;
}
};
int CountLines() //统计系数阵阶数
{
int n = 0;
string temp;
fstream f;
f.open("equation.txt", ios::in);
if (f.fail())
{
cout << "打开文件失败\n";
}
else
{
while (getline(f, temp))
{
if (temp[0] == '#')
break;
n++;
}
}
f.close();
return n;
}
void equation::input()
{
int t, i = 0, j = 0;
string temp;
fstream f;
f.open("equation.txt", ios::in);
while (getline(f, temp, ' ')) //从文件读入系数矩阵到A中
{
t = temp.find('\n');
if (t > -1)
temp.erase(t, sizeof('\n'));
if (temp[0] == '#')
break;
else
{
if (j == n - 1)
{
A[i][j] = atof(temp.c_str());
j = 0;
i++;
}
else
{
A[i][j] = atof(temp.c_str());
j++;
}
}
}
i = 0;
while (getline(f, temp, ' ') && !f.eof()) //从文件读入常数项到b中
{
t = temp.find('\n');
if (t > -1)
temp.erase(t, sizeof('\n'));
b[i] = atof(temp.c_str());
i++;
}
// f.close(); //这里加这东西居然会报错
}
void equation::DisplayEquation() //显示系数矩阵与常数向量
{
cout << "系数矩阵为:\n";
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
{
if (j == n - 1)
cout << A[i][j] << "\t\n";
else
cout << A[i][j] << "\t";
}
cout << "\n常数项为:\n";
for (int i = 0; i < n; i++)
cout << b[i] << "\n";
}
void equation::solve() //求解方程,将解存入x中
{
double c;
//================================forward elimination==================================
for (int k = 0; k < n; k++)
{
for (int i = k + 1; i < n; i++)
{
c = A[i][k] / A[k][k];
for (int j = k; j < n; j++)
A[i][j] = A[i][j] - A[k][j] * c;
b[i] = b[i] - b[k] * c;
}
}
//==========================back substitution==========================================
double sum;
x[n - 1] = b[n - 1] / A[n - 1][n - 1];
for (int i = n - 2; i >= 0; i--)
{
sum = 0;
for (int j = n - 1; j >= i + 1; j--)
sum = sum + A[i][j] * x[j];
x[i] = (b[i] - sum) / A[i][i];
}
}
void equation::DisplayResult()
{
cout << "方程的解为:\n";
for (int i = 0; i < n; i++)
cout << x[i] << " ";
cout << endl;
}
void equation::output()
{
fstream r;
r.open("result.txt", ios::out);
if (r.fail())
{
cout << "打开文件失败\n";
exit(1);
}
for (int i = 0; i < n; i++)
{
r << "X" << i << "=" << x[i] << "\n";
}
r.close();
}
int main()
{
int N, j = 0;
string temp, a;
N = CountLines();
equation e1(N);
for (int i = 0; i < N; i++)
e1.A[i] = new double[N];
e1.input();
// e1.DisplayEquation();
e1.solve();
// e1.DisplayEquation(); //上三角矩阵
// e1.DisplayResult();
e1.output();
return 0;
}
刚注册的账号,没有C币。。。
class equation
{
public:
int n;
double ** A = new double *[n]; //系数阵
double *b = new double[n]; //常数项
double *x = new double[n];
void solve();
void DisplayEquation();
void DisplayResult();
void input();
void output();
equation()
{
n = 0;
}
equation(int a)
{
n = a;
}
};
两点问题:
1)构造函数equation(){n=0;}会生成一个长度为0的数组,编译不会抛错,也会返回一个正常的数组指针,但是如果修改了指针会
导致内存被破坏,恰巧这块内存正在使用,就会抛出异常,也就会崩!
2)建议申请的内存最好在析构函数内释放掉。。。
return的时候崩溃?那可能是释放的时候出问题,看到有很多数组操作和new,但是好像没见到手动的delete,可能是数组越界的问题
这看的很模糊,文件数据也没有
建议你手动的去delete这样就知道你new的数组操作有没有越界,然后可以采用逐步屏蔽的方法找一下到底是哪个操作的问题,然后慢慢调试找到具体的问题所在分析。
文件是这样的,每个数用\t隔开,每行最后一个数后面也有一个\t,比如第一行应该是1\t-2\t6\t\n,然后系数矩阵与常数项间用#隔开(#后面也有一个\t)
1 -2 6
2 2 3
-1 3 0
#
0
3
2
我手动delete过,像delete[]A这样,但是加上这样的语句在这里就会崩。。。都搞晕了不知道怎么回事了
还有在equation::input函数的最后,如果加上f.colse()也会崩,这是什么原理