请各位帮帮忙,一个比较厉害的程序设计!!
题目:直接法解线性方程组算法设计直接法解线性方程组可以采用Gauss列主元素消去法或直接三角分解法。应具有解决任意阶(n<10)线性方程组的能力,包含以下模块:
(1)输入系数矩阵
(2)消元(或分解)
(3)回代
(4)输出结果
要求:用VC构建一个像VB的界面,其中我已经把C代码写好了,请各位看看怎么整理。
#include "iostream.h"
#include "stdlib.h"
#include "math.h"
#include "stdio.h"
#define MAX 200
int Guass(double a[],double b[],int n)
{//int n;
//double a[],b[];
int *s,l,k,i,j,m,p,q;
double d,t;
s=new int(n*sizeof(int));
l=1;
for (k=0;k<=n-2;k++)
{
d=0.0;
/*下面是换主元部分,即从系数矩阵A的第K行,第K列之下的部分选出
绝对值最大的元,交换到对角线上。*/
for (i=k;i<=n-1;i++)
for (j=k;j<=n-1;j++)
{
t=fabs(a[i*n+j]); /*fabs()定义在math.h中,含义是求一个浮点数的绝对值。*/
if (t>d) { d=t; s[k]=j; m=i;}
}
if (d+1.0==1.0) l=0; /*主元为0*/
/*主元不为0的时候*/
else
{
if (s[k]!=k)
for (i=0;i<=n-1;i++)
{
p=i*n+k; q=i*n+s[k];
t=a[p]; a[p]=a[q]; a[q]=t;
}
if (m!=k)
{
for (j=k;j<=n-1;j++)
{
p=k*n+j; q=m*n+j;
t=a[p]; a[p]=a[q]; a[q]=t;
}
t=b[k]; b[k]=b[m]; b[m]=t;
}
}
if (l==0)
{
free(s); printf("失败 !\n");
return(0);
}
d=a[k*n+k];
/*下面为归一化部分*/
for (j=k+1;j<=n-1;j++)
{
p=k*n+j; a[p]=a[p]/d;
}
b[k]=b[k]/d;
/*下面为矩阵A,B消元部分*/
for (i=k+1;i<=n-1;i++)
{
for (j=k+1;j<=n-1;j++)
{
p=i*n+j;
a[p]=a[p]-a[i*n+k]*a[k*n+j];
}
b[i]=b[i]-a[i*n+k]*b[k];
}
}
d=a[(n-1)*n+n-1];
/*矩阵无解或有无限多解*/
if (fabs(d)+1.0==1.0)
{
free(s); printf("该矩阵为奇异矩阵\n");
return(0);
}
b[n-1]=b[n-1]/d;
/*下面为迭代消元*/
for (i=n-2;i>=0;i--)
{
t=0.0;
for (j=i+1;j<=n-1;j++)
t=t+a[i*n+j]*b[j];
b[i]=b[i]-t;
}
s[n-1]=n-1;
for (k=n-1;k>=0;k--)
if (s[k]!=k)
{ t=b[k]; b[k]=b[s[k]]; b[s[k]]=t;}
free(s);
return(1);
}
void main()
{
int i,n;
double A[MAX];
double B[MAX];
//clrscr();
puts("求解N阶线性代数方程组 Ax=B");
puts("用高斯消去法求如下形式的方程组的解:");
puts("\n a(0,0)x0+a(0,1)x1+a(0,2)x2+...+a(0,n-1)xn-1=b0");
puts(" a(1,0)x0+a(1,1)x1+a(1,2)x2+...+a(1,n-1)xn-1=b1");
puts(" ......");
puts(" a(n-1,0)x0+a(n-1,1)x1+a(n-1,2)x2+...+a(n-1,-1)xn-1=bn-1\n");
printf(" >> 请输入阶数 n (>1): ");
scanf("%d",&n);
printf(" >> Please input the %d elements of matrix A(%d*%d) one by one:\n",n*n,n,n);
for(i=0;i<n*n;i++)
scanf("%lf",&A[i]);
printf(" >> Please input the %d elements of matrix B(%d*1) one by one:\n",n,n);
for(i=0;i<n;i++)
scanf("%lf",&B[i]);
if (Guass(A,B,n)!=0) /*调用Guass消去,1为计算成功*/
printf(" >> 线性方程 Ax=B 的解为 x(%d*1):\n",n);
for (i=0;i<n;i++) /*打印结果*/
printf("x(%d)=%f ",i,B[i]);
puts("\n Press any key .......");
//getch();
}