📄 main.cpp
字号:
/*/////////////////////////////////////////////////////////////////////
// //
// 此程序框架是为了验证各种求解线性方程组的方法 , //
// 作者:常晓东 //
// 2004-10-11 //
// //
/////////////////////////////////////////////////////////////////////*/
#include <iostream>
#include <stdlib.h>
#include <math.h>
using namespace std;
class Equation //定义方程组的类
{
private:
int nDimension;
public:
float Matrix[10][11];
Equation(int nDim);
void GetMatrix();
void PrintMatrix();
void ExchangeLine(int nfirst, int nlast);
int GetDimension();
};
void Equation::ExchangeLine(int nfirst, int nlast)//交换系数矩阵的两行
{
float temp;
for(int i=0; i<=nDimension; i++)
{
temp = Matrix[nfirst][i];
Matrix[nfirst][i] = Matrix[nlast][i];
Matrix[nlast][i] = temp;
}
}
int Equation::GetDimension() //返回方程组的维数
{
return nDimension;
}
Equation::Equation(int nDim) //构造函数
{
nDimension = nDim;
}
void Equation::GetMatrix() //方程组系数矩阵的输入
{
int i=0,j=0;
printf("请输入方程组系数矩阵及常数项向量\n");
for(i=0; i<nDimension; i++)
{
for(j=0; j<=nDimension; j++)
{
if(j==nDimension)
{
printf("B[%d] = ",i);
}
else
{
printf("A[%d][%d] = ",i,j);
}
scanf("%f",&Matrix[i][j]);
}
printf("\n");
}
};
void Equation::PrintMatrix() //打印方程组的系数矩阵
{
int i=0,j=0;
for(i=0; i<nDimension; i++)
{
for(j=0; j<=nDimension; j++)
{
printf("Matrix[%d][%d] = %3.3f ",i,j,Matrix[i][j]);
}
printf("\n");
}
};
int GetMatrixDim() //输入方程组的维数
{
int temp = 0;
printf("请输入方程组的维数(n<=10)\n");
do
{
fflush(stdin);
scanf("%d",&temp);
if((temp > 1)&(temp <= 10))
break;
printf("输入有误,请重新输入\n");
}while(true);
return temp;
};
int GetCulModel() //输入方程组的求解方式
{
int temp = 0;
printf("请选择求解方式:\n");
printf("1:列主消元法 2:按比例消元法\n");
do
{
fflush(stdin);
scanf("%d",&temp);
if((temp == 1)||(temp == 2))
break;
printf("输入有误,请重新输入\n");
}while(true);
return temp;
};
//列主元法求解方程组
void RowMethod(Equation* p)
{
int i=0,j=0,k=0;
float temp;
float X[10];
int index=0;
int N = p->GetDimension();
//消元
for(k=0; k<N-1; k++)
{
temp = p->Matrix[k][k];
index = k;
for(i=k+1; i<N; i++) //找最大的系数行index
{
if(fabs(p->Matrix[i][k]) > fabs(temp))
{
temp = p->Matrix[i][k];
index = i;
}
}
if(index != k)
p->ExchangeLine(index,k);
//p->PrintMatrix();
//system("PAUSE");
for(i=k+1; i<N; i++) //第i行消元
{
temp = -(p->Matrix[i][k]/p->Matrix[k][k]);
for(j=k; j<=N; j++)
{
p->Matrix[i][j] += p->Matrix[k][j]*temp;
}
//printf("%3.3f\n",temp);
//p->PrintMatrix();
//system("PAUSE");
}
}
//求解
X[N-1] = p->Matrix[N-1][N]/p->Matrix[N-1][N-1];
for(i=N-2; i>=0; i--)
{
temp = 0.0;
for(j=N-1; j>i; j--)
{
temp += p->Matrix[i][j]*X[j];
}
X[i] = (p->Matrix[i][N]-temp)/p->Matrix[i][i];
}
for(i=0; i<N; i++)
{
printf("X[%d] = %3.3f\n",i,X[i]);
}
};
//按比例消元法求解方程组
void ScaleMethod(Equation* p)
{
int i=0,j=0,k=0;
int N = p->GetDimension();
int index = 0;
float X[10];
float temp;
//将各行中绝对值最大的项放入X[i]
for(i=0; i<N; i++)
{
X[i] = fabs(p->Matrix[i][0]);
for(j=1; j<N; j++)
{
if(fabs(p->Matrix[i][j]) > X[i])
X[i] = fabs(p->Matrix[i][j]);
}
}
//消元
for(k=0; k<N-1; k++)
{
temp = fabs(p->Matrix[k][k])/X[k];
index = k;
for(i=k+1; i<N; i++)
{
if(fabs(p->Matrix[i][k])/X[i] > temp)
{
temp = fabs(p->Matrix[i][k])/X[i];
index = i;
}
}
if(index != k)
p->ExchangeLine(index,k);
for(i=k+1; i<N; i++) //第i行消元
{
temp = -(p->Matrix[i][k]/p->Matrix[k][k]);
for(j=k; j<=N; j++)
{
p->Matrix[i][j] += p->Matrix[k][j]*temp;
}
printf("%3.3f\n",temp);
p->PrintMatrix();
system("PAUSE");
}
}
//求解
X[N-1] = p->Matrix[N-1][N]/p->Matrix[N-1][N-1];
for(i=N-2; i>=0; i--)
{
temp = 0.0;
for(j=N-1; j>i; j--)
{
temp += p->Matrix[i][j]*X[j];
}
X[i] = (p->Matrix[i][N]-temp)/p->Matrix[i][i];
}
for(i=0; i<N; i++)
{
printf("X[%d] = %3.3f\n",i,X[i]);
}
};
//计算方程组
//model 为求解方式,p为方程组类的一个实例的指针
void CalculateEqu(int model, Equation* p)
{
switch(model)
{
case 1:
printf("按列主元方式求解方程组......\n");
RowMethod(p);
break;
case 2:
printf("按比例消元法求解方程组......\n");
ScaleMethod(p);
break;
default:
printf("计算模式出现错误!\n");
}
};
int main(int argc, char *argv[])
{
char temp;
printf("求解线性方程组\n");
do
{
printf("-----------------------------------------\n");
int nCulModel = GetCulModel();
int nDim = GetMatrixDim();
Equation* pEqu = new Equation(nDim);
pEqu->GetMatrix();
pEqu->PrintMatrix();
CalculateEqu(nCulModel,pEqu);
delete pEqu;
printf("继续请输入 [c] ,退出按回车键:");
fflush(stdin);
scanf("%c",&temp);
}while(temp == 'c');
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -