#include <iostream> #include <fstream> #include <string> #include <cmath> using namespace std; //申明外联函数 //void gauss(); void select_main(int k,float **p,int m); void show(int m,int n,float **p); void answer(int m,int n,float **p); int gain_m(); int gain_n(int m); void guass(int m,int n,float **p); //********************************************* //主函数体 void main() { int m=gain_m(); int n=gain_n(m); cout<<endl<<"行数为:"<<m<<endl; cout<<"列数为:"<<n<<endl; //定义m行n列的动态数组 float **p=new float*[m]; for(int i=0;i<m;i++) { p[i]=new float[m]; } ifstream oin("p59.txt"); float fn[100]; int jishu=0; for(float a;oin>>a;) { fn[jishu]=a; jishu++; } for(i=0;i<m;i++) { for(int j=0;j<n;j++) { *(*(p+i)+j)=fn[i*n+j]; } } //show(m,n,p); guass(m,n,p); cout<<endl; cout<<"高斯消元后的到的行列式为:"<<endl; show(m,n,p); answer(m,n,p); } //列主元函数 void select_main(int k,float **p,int m) { double d; d=*(*(p+k)+k); //cout<<d; int l=k; int i=k+1; for(;i<m;i++) { if(fabs(*(*(p+i)+k)) > fabs(d)) { d=*(*(p+i)+k); l=i; } else continue; } if(d==0) cout<<"错误"; else { if(k!=l) { for(int j=k;j<m+1;j++) { double t; t=*(*(p+l)+j); *(*(p+l)+j)=*(*(p+k)+j); *(*(p+k)+j)=t; } } } } //显示具有m行n列p数组的各元素值 void show(int m,int n,float **p) { for(int i=0;i<m;i++) { for(int j=0;j<n;j++) {cout<<*(*(p+i)+j)<<" ";} cout<<endl;}//数组创建成功 cout<<endl; } //计算并输出x的解 void answer(int m,int n,float **p) { *(*(p+m-1)+n-1)=*(*(p+m-1)+n-1) / *(*(p+m-1)+n-2); //cout<<*(*(p+m-1)+n-1)<<endl; for(int i=m-2;i>=0;i--) { float a=0; for(int j=i+1;j<m;j++) { a=a + (*(*(p+i)+j) * *(*(p+j)+m)); } // cout<<a<<endl; *(*(p+i)+n-1)= (*(*(p+i)+n-1) - a) / *(*(p+i)+i); } cout<<"方程组的解为:"<<endl; for(i=0;i<m;i++) { cout<<"x"<<i+1<<"="; cout<<*(*(p+i)+n-1)<<endl; } } //获得行列式的行数 int gain_m() { ifstream fin("p59.txt"); int f=0; for(string str;getline(fin,str);) { cout<<str<<endl; f++; } return f; } //获得行列式的列数,参数m为行列式的行数 int gain_n(int m) { ifstream oin("p59.txt"); int element=0; for(float a;oin>>a;) { element++; } return element/m; } void guass(int m,int n,float **p) { for(int k=0;k<m;k++) { select_main(k,p,m);//调用列主元函数 for(int i=1+k;i<m;i++) { *(*(p+i)+k)=(float) *(*(p+i)+k) / *(*(p+k)+k); } for(i=k+1;i<m;i++) { for(int j=k+1;j<n;j++) { *(*(p+i)+j)=(*(*(p+i)+j)) - (*(*(p+i)+k)) * (*(*(p+k)+j)); } *(*(p+i)+k)=0; } } }
- 粉丝: 0
- 资源: 9
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助