⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 研究生期间上《数值计算方法》课的作业
💻 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 + -