?? gauss.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 + -