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

📄 gauss.cpp

📁 这个是我自己编写的高斯列主元消去法的VC程序,简单实用!
💻 CPP
字号:
/*********************************************** 
 
高斯列主元消去法 
  
created:     2005/06/25 
filename:    xiaochengwei'gs.cpp 
file ext:    cpp 
author:      xiaochengwei
 
**********************************************/ 
 
#include <iostream> 
#include <fstream> 
#include <string> 
#include <cstdlib> 
#include <conio.h> 
#include <cmath> 
 
using namespace std; 
 
/**//************************************************** 
*                                                  * 
*                    高斯消元函数                  * 
*                                                  * 
*    参数说明                                      * 
*                                                  * 
*  double m[N][N] 系数|常数 矩阵                  * 
*  int n          元数+1(因为包含常数列)          * 
*  doublex x[N]   方程解的矩阵                      * 
*  double e       主元最大值                      * 
*                                                  * 
***************************************************/ 
bool myGauss(double m[10][10],int n,double x[10],double epxl); 
 
 
/**//************************************************** 
*                                                  * 
*                    读文件函数                    * 
*                                                  * 
*    参数说明                                      * 
*                                                  * 
*   char* filename 文件名                          * 
*    double mm[10][10] 存放读入数据的矩阵          * 
*                                                  * 
*                                                  * 
*                                                  * 
***************************************************/ 
int sReadFile(double mm[10][10],char* filename); 
 
/**//************************************************** 
*                                                  * 
*       判断一个字符是否在一个字符串内               * 
*                                                  * 
*    参数说明                                      * 
*                                                  * 
*   char* s 要查找字符串                          * 
*    char d 要查找的字符                             * 
*                                                  * 
*                                                  * 
*                                                  * 
***************************************************/ 
bool isic(const char* s , char d); 
 
//TODO: -------------[ 程序入口 ]--------------- 
int main(int argc,char* argv[]) 
{ 
    double mm[10][10];//存放方程 系数|常数 矩阵 
    double x[10];//存放解的数组 
    int iRow;//存放方程的元数 
    char filename[256]; 
    if(argc>1) 
    { 
        strcpy(filename,argv[2]); 
    } 
    else 
    { 
 
 
 
        cout<<"Input the file's name:"<<endl; 
 
        cin>>filename; 
 
    } 
    iRow=sReadFile(mm,filename);//从文件读取矩阵 
 
    if(iRow==-1)return -1; 
 
    if(myGauss(mm,iRow,x,1e-5)){ 
        for(int i=0;i<iRow-1;i++) 
            cout<<"x"<<i<<"="<<x[i]<<endl; 
    } 
    getch(); 
    return 0; 
 
} 
 
 
 
//TODO: --------------[ 高斯消元函数 ]----------------- 
bool myGauss(double m[10][10],int iRow,double x[10],double epxl) 
{ 
    int i,j,k,t; 
    double temp; 
 
 
    for(i=0;i<iRow-2;++i)//行循环 
    { 
        //获取主元 
        k=i; 
        double max=m[k][i]; 
        for(j=i+1;j<iRow-1;++j) 
        { 
            if(fabs(m[j][i])>fabs(m[k][i])){ 
                max=m[j][i]; 
                k=j; 
            } 
        } 
 
 
        if(fabs(max)<epxl)   return false; 
 
        //交换行 
        if(k!=i) 
        { 
            for(j=i;j<iRow;j++) 
            { 
                temp=m[k][j]; 
                m[k][j]=m[i][j]; 
                m[i][j]=temp; 
 
            } 
 
 
        }  
 
 
        //计算消元 
 
        for(j=i+1;j<iRow-1;++j) 
        { 
            temp=m[j][i]/m[i][i]; 
 
            for(t=i+1;t<iRow;t++) 
                m[j][t]-=temp*m[i][t]; 
 
        } 
 
 
    } 
 
    //回代求解 
    x[iRow-2]=m[iRow-2][iRow-1]/m[iRow-2][iRow-2]; 
    for(i=iRow-3;i>=0;--i) 
    {  
        for(j=iRow-2;j>=i+1;--j) 
            m[i][iRow-1]-=x[j]*m[i][j]; 
        x[i]=m[i][iRow-1]/m[i][i]; 
 
    } 
 
    return true; 
 
} 
 
//TODO: ---------------------------[ 从文件读取矩阵赋值于数组,并返回元数 ]------------------------- 
int sReadFile(double mm[10][10] , char* filename) 
{ 
    char cs[128]; 
    int c=-1; 
 
    int iRow=0; 
 
    char* numb="0123456789."; 
 
    char *alls; 
    alls=new char[100000]; 
 
 
    FILE* fp; 
    if((fp=fopen(filename,"r"))==NULL) 
        return -1; 
 
    while(!feof(fp)){ 
        ++c; 
        alls[c]=getc(fp); 
 
    } 
    alls[c] = '\0'; 
 
    size_t allsl=strlen(alls); 
 
    size_t i=0; 
 
 
    char* dSing; 
 
    int il=-1; 
 
    double x; 
 
 
    while (alls[i]!='{') { 
        ++i; 
    } 
 
    while(alls[i]!='\0' && alls[i]!='}' ) 
    { 
        int t=-1; 
 
        if(isic(numb,alls[i])) 
        { 
            while (isic(numb,alls[i])) { 
                cs[++t]=alls[i]; 
                ++i; 
 
            } 
 
            cs[++t]='\0'; 
 
            t=0; 
 
            x=strtod(cs,&dSing); 
 
            mm[iRow][++il]=x; 
 
            continue; 
 
        } 
 
 
 
        else if(alls[i]==',') 
        { 
            ++iRow; 
            il=-1; 
        }     
 
 
        ++i; 
    } 
 
 
    iRow+=2; 
 
    return iRow; 
} 
 
 
//TODO: ---------------[ 判断一个字符是否在一个字符串内 ]----------------- 
bool isic(const char* s , char d) 
{ 
    size_t strl=strlen(s); 
    for(size_t i=0;i<=strl-1;++i) 
    { 
        if (s[i]==d) { 
            return true; 
        } 
    } 
 
    return false; 
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -