列主元消去法 的问题 输出结果有问题 跪求哪位达人帮看下 哪出的问题 运行结果有问题

BJUTmark 2008-05-12 08:48:36
我想通过输入一个N值 来构造矩阵A及常数项,然后用列主元消去法 解这个方程
但是调试了好多次,没有语法错误,结果总是问题
大家可以尝试输入 6 看下结果
希望能帮我看看哪出的错。。。谢谢了
#include <iostream.h>
#include <string.h>
#include <math.h>
struct jie{double answer[20];};
struct marix{double A[20][20];double B[20];};
class rg
{
public:
rg(int N){n=N;}
int getn(){return n;};
int maxi(double a[20]);
marix initAB();
jie qiujie(marix m);
private:
int n;
};
int rg::maxi(double a[20])
{
double q;
int p;
double c[20];
for(int r=0;r <20;r++)
{c[r]=a[r];};
for(int i=0;i <19;i++)
{
if(fabs(a[i])>fabs(a[i+1]))
{
a[i+1]=a[i];
}
q=fabs(a[i+1]);


}

for(int j=0;j <20;j++)
{
if(c[j]==q ¦ ¦c[j]==-q)
{
p=j;
}
}
return p;
}
marix rg::initAB()
{
marix xishu;

memset(xishu.A,0,400*sizeof(double));
memset(xishu.B,0,20*sizeof(double));

int s;
s=getn();
for(int z=0;z <s;z++)
{
for(int w=0;w <s;w++)
{
xishu.A[z][w]=(-(double((z+1)*(w+1))/double((z+1)+(w+1)-1))+(double(2*(z+1)*(w+1)+(z+1)+(w+1))/double((w+1)+(z+1)))-(double(1+(z+1)*(w+1)+(z+1)+(w+1))/double((z+1)+(w+1)+1))-(2/double((z+1)+(w+1)+2))+1/double((w+1)+(z+1)+3)+1/(double((w+1)+(z+1)+1)));
}
xishu.B[z]=(-1/double((z+3)*(z+4)));
}
return xishu;
}
jie rg::qiujie(marix m)
{
double zhongjie[20];
double huajian[20];

memset(zhongjie,0,20*sizeof(double));
memset(huajian,0,20*sizeof(double));

int s;
s=getn();
int q;double p,pp=0; jie x;double r;
for(int i=0;i <s-1;i++)
{

for(int j=i;j <s;j++)
{
zhongjie[j-i]=m.A[j][i];
huajian[j-i]=m.A[j][i];

}

/* for(int k=0;k <s;k++)
{
juedui[k]=fabs(zhongjie[k]);
}*/
q=maxi(zhongjie)+i;
if(q!=i)
{
for(int h=i;h <s;h++)
{
r=m.A[i][h];
m.A[i][h]=m.A[q][h];
m.A[q][h]=r;
}

p=m.B[i];
m.B[i]=m.B[q];
m.B[q]=p;
pp=huajian[i];
huajian[i]=huajian[q];
huajian[q]=pp;

}
for(int d=i+1;d <s;d++)
{

for(int n=i;n <s;n++)
{
m.A[d][n]=m.A[d][n]-(huajian[d-i]/m.A[i][i])*m.A[i][n];
if(m.A[d][n] <0.0000000001&&m.A[d][n]>(-0.0000000001))
{m.A[d][n]=0;}


}
m.B[d]=m.B[d]-(huajian[d-i]/m.A[i][i])*m.B[i];
if(m.B[d] <0.0000000001&&m.B[d]>(-0.0000000001))
{m.B[d]=0;}
}
for(int vv=0;vv <s;vv++){
for(int zz=0;zz <s;zz++){
cout < <m.A[vv][zz] < <" ";
}
cout < <m.B[vv] < <" ";
cout < <endl;

}
cout < <endl;


}

for(int v=0;v <s;v++){
for(int z=0;z <s;z++){
cout < <m.A[v][z] < <" ";}
cout < <endl;

}cout < <endl;
for(int g=0;g <s;g++)
cout < <m.B[g] < <" ";
cout < <endl;


x.answer[s-1]=m.B[s-1]/m.A[s-1][s-1];
for(int y=s-2;y>=0;y--)
{
for(int z=s-1;z>y;z--)
{
m.B[y]-=m.A[y][z]*x.answer[y+1];

}
x.answer[y]=m.B[y]/m.A[y][y];
}


return x;
}
void main()
{
int n;
cout < <"请输入n的值" < <endl;
cin>>n;
if(n>20)
cout < <"本程序不适用于n>20的情况" < <endl;
rg riga(n);
marix m=riga.initAB();
for(int s=0;s <n;s++)
{
for(int u=0;u <n;u++)
{
cout < <m.A[s][u] < <" ";
}
cout < <m.B[s] < <" ";
cout < <endl;
}
jie x=riga.qiujie(m);
for(int t=0;t <n;t++)
{
cout < <"c" < <t+1 < <"=" < <x.answer[t] < <endl;
}

}
...全文
58 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
打开链接下载源码: https://pan.quark.cn/s/a4b39357ea24 在Qt框架中,QSerialPort类被视为一个关键组件,用于执行与串行端口之间的通信任务,它具备多样化的功能,涵盖了串口的开启与关闭操作,以及波特率、数据位、停止位和奇偶校验等参数的设定,同时还包括数据的发送和接收功能。在标题和描述中提及的“Qt5的QSerialPort类通过信号槽实现串口读写”,这代表了一种在Qt编程中普遍采用的事件驱动策略,借助信号槽机制,能够便捷地管理串口数据的传输与接收。 1. **QSerialPort类的基础操作**: - 初始化阶段:必须构建一个QSerialPort实例,并为其指定串口名称,例如"/dev/ttyUSB0"。 - 参数配置:利用`setPortName()`、`setBaudRate()`、`setDataBits()`、`setParity()`、`setStopBits()`、`setFlowControl()`等方法,依据具体需求对串口参数进行配置。 - 串口开启/终止:借助`open()`方法启动串口,通过`close()`方法终止串口。务必验证`isOpen()`的返回状态,以确保操作的有效性。 2. **信号槽机制的应用**: - 信号的生成:QSerialPort类中定义了若干信号,诸如`readyRead()`表明有数据可读,`error()`指示出现错误,`bytesWritten()`显示数据已传输等。当这些事件发生时,将触发相应的信号。 - 槽函数的关联:相应地,可以将这些信号与自定义的槽函数相连接,比如,当`readyRead()`信号被激活时,可以调用一个用于处理读取数据的函数。 3. **串口数据...

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧