(怀旧向)第一弹:矩阵程序
好吧,最近我闲的蛋疼,于是就搞个专题,怀旧向程序。哎呀,就是把以前那些写过的好玩的代码拿出来看看,然后。。。额。。没然后了。。就是拿出来看看。。。
矩阵程序是我大一学完C++的那个假期无聊写的一个代码,现在看起来只能说,我去,真是弱爆了,倒不是说那个编程的代码的优化啊什么的,就是看那个花括号的位置和for写在一行,变量命名完全不没规律,双目运算符前后没有空一格之类的,还有就是一开始学的时候是在VC6上写的,现在那东西都被我抛弃多少年了??放上来之前用Alt+F8优化了一下。。
不过嘛,我个人一直觉得这个程序写出来很有成就感,当年大一,接触到编程这个概念也才10个月,而且中国的大学教育下,咳咳,你懂得。然后我花了3天吧,扒拉扒拉的写出了这个程序,反正就是个大杂烩,对着线代的课本,把证明题以外的东西全部集成进去,矩阵的运算自然不说,然后还有解线性方程,求秩,化简,然后施密特正交变换什么的,最后最让人抓狂的就是算特征值和特征向量,当时完全不懂这个算法有多难,然后去图书馆找了半天书,想了个方法最后却被证明想错了,没办法之下只好用暴力枚举解决,额,算了,大一些的小东西嘛,怀念怀念就好。
#include <iomanip.h> #include <conio.h> #include <iostream.h> #include <math.h> #include <stdlib.h> #include <string.h> #define cls system("cls") #define pause system("pause") int max(int m,int n) { m=abs(m); n=abs(n); int a = (m > n) ? m : n; int b = (m > n) ? n : m; int c = 0; if(m!=0&&n!=0) { while ((a % b) != 0) { c = a % b; a = b; b = c; } return b; } else return 1; } class fraction { public: fraction(){} fraction(int u,int d=1):up(u),down(d){} fraction(fraction &x){setup(x.getup());setdown(x.getdown());} int getup(); int getdown(); void setup(int); void setdown(int); friend istream & operator >>(istream &,fraction&); friend ostream & operator <<(ostream &,fraction &); friend bool operator >(fraction,fraction); friend bool operator >=(fraction,fraction); friend bool operator <(fraction,fraction); friend bool operator <=(fraction,fraction); friend fraction operator +(fraction,fraction); friend fraction operator -(fraction,fraction); friend fraction operator *(fraction,fraction); friend fraction operator /(fraction,fraction); void simplify(); operator float(); //operator int(); private: int up; int down; }; fraction abs(fraction k) { fraction temp(k); if (temp.getup()<0) temp.setup(temp.getup()*-1); if (temp.getdown()<0) temp.setdown(temp.getdown()*-1); return temp; } istream &operator >>(istream & input,fraction& x) { float n; cin>>n; int m=1,z=int(n); while((n-z)!=0) { m*=10; n*=10; z=int(n); } x.setup(z); x.setdown(m); x.simplify(); return input; } void fraction::simplify() { int mod =max(up,down); up=up/mod; down=down/mod; if(down<0) { up*=-1; down*=-1; } } ostream & operator <<(ostream &output,fraction &x) { if(x.getdown()==1) output<<x.getup(); else if(x.getup()==0) cout<<0; else output<<x.getup()<<"/"<<x.getdown(); return output; } fraction operator +(fraction x,fraction y) { fraction temp; temp.setdown(x.getdown()*y.getdown()); temp.setup(x.getup()*y.getdown()+x.getdown()*y.getup()); temp.simplify(); return temp; } fraction operator -(fraction x,fraction y) { fraction temp; temp.setdown(x.getdown()*y.getdown()); temp.setup(x.getup()*y.getdown()-x.getdown()*y.getup()); temp.simplify(); return temp; } fraction operator *(fraction x,fraction y) { fraction temp; temp.setdown(x.getdown()*y.getdown()); temp.setup(x.getup()*y.getup()); temp.simplify(); return temp; } fraction operator /(fraction x,fraction y) { fraction temp; temp.setdown(x.getdown()*y.getup()); temp.setup(x.getup()*y.getdown()); temp.simplify(); return temp; } bool operator >(fraction x,fraction y) { fraction temp=x-y; if(temp.getdown()*temp.getup()>0) return true; else return false; } bool operator >=(fraction x,fraction y) { fraction temp=x-y; if(temp.getdown()*temp.getup()>=0) return true; else return false; } bool operator <(fraction x,fraction y) { fraction temp=x-y; if(temp.getdown()*temp.getup()<0) return true; else return false; } bool operator <=(fraction x,fraction y) { fraction temp=x-y; if(temp.getdown()*temp.getup()<=0) return true; else return false; } fraction::operator float() { return float(up)/float(down); } int fraction::getdown() { return down; } int fraction::getup() { return up; } void fraction::setup(int u) { up=u; } void fraction::setdown(int d) { down=d; } class matrix { public: matrix(); matrix(int,int); matrix(matrix &); fraction get(int m,int n); void set(int m,int n,fraction newp); int getl(); int geth(); friend istream &operator >>(istream &,matrix&); friend ostream & operator <<(ostream &,matrix &); friend matrix operator ~(matrix); friend matrix operator +(matrix,matrix); friend matrix operator -(matrix,matrix); friend matrix operator *(matrix,matrix); friend matrix operator *(matrix,fraction); friend matrix operator ^(matrix,int); matrix operator =(matrix); friend fraction abs(matrix); matrix yzs(int m,int n); matrix unit(); void sway(int,int); bool rankc1(int); bool rankc2(int); int rank(); bool find(fraction); matrix eig(); private: fraction **m; int length; int heigth; }; bool matrix::find(fraction n) { for(int i=0;i<getl();i++) if(n==get(1,i+1)) return true; return false; } matrix matrix::operator =(matrix x) { for(int i=0;i<x.geth();i++) for(int j=0;j<getl();j++) { set(i+1,j+1,x.get(i+1,j+1)); } return *this; } void matrix::sway(int m,int n) { fraction temp; for(int i=0;i<getl();i++) { temp=get(m+1,i+1); set(m+1,i+1,get(n+1,i+1)); set(n+1,i+1,temp); } } ostream & operator <<(ostream &output, matrix &x) { int heigth=x.geth(); int length=x.getl(); if(heigth!=1) { for(int k=1;k<=heigth;k++) for(int l=1;l<=length;l++) { if(k==1&&l==1) cout<<"┏"; else if(k==heigth&&l==1) cout<<"┗"; else if(l==1) cout<<"∣"; output<<setw(6)<<x.get(k,l)<<" "; if(k==1&&l==length) cout<<setw(6)<<"┓"<<endl; else if(k==heigth&&l==length) cout<<setw(6)<<"┛"<<endl; else if(l==length) cout<<setw(6)<<"∣"<<endl; } } else { output<<"┏"; for(int i=0;i<x.getl();i++) output<<setw(6)<<x.get(1,i+1)<<" "; cout<<"┓"<<endl; cout<<"┗"; cout<<setw(i*7+2)<<"┛"<<endl; } return output; } istream &operator >>(istream &input,matrix &x) { cls; cout<<x<<"请继续输入:"; for (int i=0;i<x.geth();i++) { for (int k=0;k<x.getl();k++) { input>>x.m[i][k]; cls; cout<<x<<"请继续输入:"; } } cout<<endl; cls; cout<<x; return input; } matrix operator ~(matrix c) { matrix temp(c.getl(),c.geth()); for (int i=0;i<temp.geth();i++) for (int k=0;k<temp.getl();k++) temp.m[i][k]=c.m[k][i]; return temp; } matrix operator +(matrix x,matrix y) { matrix temp(x.geth(),x.getl()); for(int i=0;i<temp.geth();i++) for(int j=0;j<temp.getl();j++) temp.m[i][j]=x.m[i][j]+y.m[i][j]; return temp; } matrix operator -(matrix x,matrix y) { matrix temp(x.geth(),x.getl()); for(int i=0;i<temp.geth();i++) for(int j=0;j<temp.getl();j++) temp.m[i][j]=x.m[i][j]-y.m[i][j]; return temp; } matrix operator *(matrix x,matrix y) { matrix result(x.geth(),y.getl()); for(int i=0;i<x.geth();i++) for(int j=0;j<y.getl();j++) { fraction sum=0; for(int k=0;k<x.getl();k++) sum=sum+x.get(i+1,k+1)*y.get(k+1,j+1); result.set(i+1,j+1,sum); } return result; } matrix operator *(matrix x,fraction n) { matrix temp(x); for(int i=0;i<temp.geth();i++) for(int j=0;j<temp.getl();j++) temp.set(i+1,j+1,temp.get(i+1,j+1)*n); return temp; } matrix operator ^(matrix x,int n) { matrix temp(x.geth(),x.getl()); for(int i=0;i<x.geth();i++) temp.set(i+1,i+1,1); for(i=0;i<n;i++) temp=temp*x; return temp; } int matrix::geth() { return heigth; } int matrix::getl() { return length; } fraction matrix::get(int k,int n) { return m[k-1][n-1]; } void matrix::set(int k,int n,fraction newp) { m[k-1][n-1]=newp; } matrix::matrix(int hei,int len) { length=len; heigth=hei; m=new fraction*[hei]; for(int l=0;l<hei;l++) { m[l]=new fraction[len]; for(int k=0;k<len;k++) { m[l][k]=0; } } } matrix::matrix(matrix &c) { length=c.getl(); heigth=c.geth(); m=new fraction*[heigth]; for(int l=0;l<heigth;l++) { m[l]=new fraction[length]; for(int k=0;k<length;k++) { m[l][k]=c.m[l][k]; } } } matrix matrix::yzs(int m,int n) { matrix temp(heigth-1,length-1); for(int h=0,h2=0;h<heigth;h++) { if(h==m) continue; for(int l=0,l2=0;l<length;l++) { if(l==n) continue; temp.set(h2+1,l2+1,get(h+1,l+1)); l2++; } h2++; } return temp; } matrix matrix::unit() { matrix temp(*this); for(int i=0,j=0;i<geth()&&j<getl();i++,j++) { loop: if(get(i+1,j+1)==0) { for(int l=i+1;l<heigth;l++) { if(get(l+1,j+1)!=0) { sway(i,l); break; } if(l==(length-1)) { j++; goto loop; } } } for(int k=i+1;k<geth();k++) { fraction m=get(k+1,j+1)/get(i+1,j+1); for(int l=j;l<getl();l++) { set(k+1,l+1,get(k+1,l+1)-m*get(i+1,l+1)); } } } for( i=0;i<geth();i++) { int j=0; if(get(i+1,j+1)==0) { for(int l=j;l<getl();l++) { if(get(i+1,l+1)!=0) { j=l; break; } if(l==(getl()-1)) return *this; } } fraction temp=get(i+1,j+1); for(int k=j;k<getl();k++) set(i+1,k+1,get(i+1,k+1)/temp); for(k=i-1;k>=0;k--) { fraction m=get(k+1,j+1)/get(i+1,j+1); for(int l=j;l<getl();l++) set(k+1,l+1,get(k+1,l+1)-m*get(i+1,l+1)); } } return *this; } bool matrix::rankc1(int n)//lie { for(int i=0;i<geth();i++) { if(get(i+1,n+1)!=0) return true; } return false; } bool matrix::rankc2(int n)//hang { for(int i=0;i<getl();i++) { if(get(n+1,i+1)!=0) return true; } return false; } int matrix::rank() { int i,j,k=0,l=0; matrix temp(unit()); for( i=0;i<geth();i++) if(rankc2(i)) k++; for( j=0;j<getl();j++) if(rankc1(j)) l++; return k<l?(k):(l); } matrix matrix::eig() { matrix temp(*this),temp2(*this),result(1,getl()); for(int l=1;l<=result.getl();l++) result.set(1,l,100); fraction min=1; int mark=1; cout<<"0% 100%"<<endl; putch('|'); fraction jindu(1,1); for(fraction i=0;i<=fraction(50,1);i=i+fraction(1,1000)) { pp: if(jindu-i==0) { putch('|'); jindu=jindu+fraction(1,1); } matrix *p=new matrix(temp2); for(int j=0;j<geth();j++) { p->set(j+1,j+1,p->get(j+1,j+1)-i); } if(abs(*p)==0) { result.set(1,mark++,i); if(mark==result.getl()+1) { for(;jindu<fraction(51);jindu=jindu+fraction(1,1)) putch('|'); return result; } } delete p; if(i>fraction(0)) { i=i*fraction(-1); goto pp; } if(i<fraction(0)) i=i*fraction(-1); } return result; } fraction dot(matrix a,matrix b) { fraction sum=0; for(int i=0;i<a.getl();i++) sum=sum+a.get(1,i+1)*b.get(1,i+1); return sum; } void antim() { cls; cout << " 矩阵计算器 -> 两个矩阵的运算->矩阵求逆\n" <<endl; int heigth; cout<<"输入行列数:"; cin>>heigth; matrix x(heigth,heigth); cin>>x; fraction mod=abs(x); if(mod==0) { cout<<"矩阵"<<x<<endl<<"不可求逆!!"<<endl; return; } if(heigth==1) { cout<<"逆矩阵为:\n"<<fraction(1)/mod<<endl; return;} matrix temp(heigth,heigth); for(int m=0;m<heigth;m++) for(int n=0;n<heigth;n++) { temp.set(n+1,m+1,abs(x.yzs(m,n))*fraction(pow(-1,m+n))/mod); } cout<<"逆矩阵为:\n"<<temp<<endl; } void convert() { cls; cout << " 矩阵计算器 -> 一个矩阵的运算->计算矩阵倒置\n" << endl; int length,heigth; cout<<"输入行数:"; cin>>heigth; cout<<"输入列数:"; cin>>length; matrix m(heigth,length); cin>>m; matrix n(~m); cls; cout<<m<<"倒置后为:\n"; cout<<n<<endl; } fraction abs(matrix x) { if(x.geth()==1) { return x.get(1,1); } int n=1; fraction sum=0; for(int i=0;i<x.getl();i++) { sum=sum+x.get(1,i+1)*abs(x.yzs(0,i))*fraction(n); n*=-1; } return sum; } void add() { cls; cout << " 矩阵计算器 -> 两个矩阵的运算->矩阵相加\n" << endl; int length,heigth; cout<<"输入行数:"; cin>>heigth; cout<<"输入列数:"; cin>>length; matrix m(heigth,length),n(heigth,length); cin>>m>>n; matrix result(m+n); cout<<m<<endl<<"与"<<endl<<endl<<n<<endl<<"相加结果为:\n\n"<<result<<endl; } void sub() { cls; cout << " 矩阵计算器 -> 两个矩阵的运算->矩阵相减\n" << endl; int length,heigth; cout<<"输入行数:"; cin>>heigth; cout<<"输入列数:"; cin>>length; matrix m(heigth,length),n(heigth,length); cin>>m>>n; matrix result(m-n); cout<<m<<endl<<"与"<<endl<<endl<<n<<endl<<"相加结果为:\n\n"<<result<<endl; } void mul() { cls; cout << " 矩阵计算器 -> 两个矩阵的运算->矩阵相乘\n" << endl; int length1,heigth1,length2,heigth2; cout<<"输入第一个矩阵行数:"; cin>>heigth1; cout<<"输入第一个矩阵列数:"; cin>>length1; cout<<"输入第二个矩阵行数:"; cin>>heigth2; cout<<"输入第二个矩阵列数:"; cin>>length2; if(length1!=heigth2) { cout<<"不符合矩阵相乘规则,不能想乘!!!"<<endl; return; } else { matrix x(heigth1,length1),y(heigth2,length2); cin>>x>>y; cout<<endl; cls; cout<<x<<"\n与\n\n"<<y<<"相乘结果为:"<<endl; cout<<x*y<<endl; } } void pow() { cls; cout << " 矩阵计算器 -> 两个矩阵的运算->矩阵求n次幂\n" << endl; int length; cout<<"输入方阵行列数:"; cin>>length; int n; cout<<"输入幂:"; cin>>n; matrix x(length,length); cin>>x; cout<<x<<"\n的"<<n<<"次幂为:\n\n"<<(x^(n))<<endl; } void simplify() { cls; cout << " 矩阵计算器 -> 两个矩阵的运算->矩阵化简\n" << endl; int length,heigth; cout<<"输入行数:"; cin>>heigth; cout<<"输入列数:"; cin>>length; matrix m(heigth,length); cin>>m; cout<<"\n\n的最简阶梯型为:\n\n"<<m.unit()<<endl; } void rank() { cls; cout << " 矩阵计算器 -> 两个矩阵的运算->矩阵求秩\n" << endl; int length,heigth; cout<<"输入行数:"; cin>>heigth; cout<<"输入列数:"; cin>>length; matrix m(heigth,length); cin>>m; cout<<"\n\n\nRank(A)="<<m.rank()<<endl; } void function() { cls; fraction temp; cout << " 矩阵计算器 -> 两个矩阵的运算->解线性方程\n" << endl; int xnum,funnum; cout<<"输入方程个数:"; cin>>funnum; cout<<"输入未知数个数:"; cin>>xnum; cout<<endl<<endl<<endl; matrix liner(funnum,xnum),eliner(funnum,xnum+1); for(int i=1;i<=funnum;i++) { for(int j=1;j<=xnum;j++) { cout<<"a"<<i<<j<<"="; cin>>temp; liner.set(i,j,temp); eliner.set(i,j,temp); /*if(j==xnum) { cout<<"y"<<i<<"="; cin>>temp; eliner.set(i,xnum,temp); }*/ } cout<<"y"<<i<<"="; cin>>temp; eliner.set(i,xnum+1,temp); } //cout<<liner<<eliner<<endl; //cout<<liner<<eliner; cout<<"\n\n方程:\n"; for(i=0;i<liner.geth();i++) { for(int j=0;j<liner.getl();j++) { if(liner.get(i+1,j+1)!=0) { cout<<liner.get(i+1,j+1)<<" * X"<<j+1<<" "; if(j==liner.getl()-1) cout<<" = "; else cout<<" + ";} } cout<<eliner.get(i+1,eliner.getl())<<endl; //cout<<endl; } if(eliner.unit().rank()>liner.unit().rank()) {cout<<"方程无解!!"<<endl; return; } cout<<"\n\n最简形式矩阵为:\n"; cout<<eliner; cout<<"\n\n解为:\n"; matrix result(1,eliner.rank()); for(i=0;i<result.getl();i++) { for(int j=0;j<eliner.getl()-1;j++) { if(eliner.get(i+1,j+1)==0) continue; else { result.set(1,i+1,j); break; } } } //cout<<result; for(i=0;i<result.getl();i++) { cout<<"x"<<result.get(1,i+1)+fraction(1)<<" = "; for(int j=0;j<eliner.getl()-1;j++) { if(!result.find(j)) { if(eliner.get(i+1,j+1)!=0) { cout<<fraction(-1)*eliner.get(i+1,j+1)<<" * X"<<j+1; cout<<" + "; } } } cout<<eliner.get(i+1,eliner.getl())<<endl; } } int min(int m,int n) { return m*n/max(m,n); } void smitchange(matrix x) { //matrix result(x.geth(),x.getl()); fraction *k=new fraction[x.geth()]; matrix **beta=new matrix*[x.geth()]; matrix **afa=new matrix*[x.geth()]; for(int i=0;i<x.geth();i++) { beta[i]=new matrix(1,x.getl()); afa[i]=new matrix(1,x.getl()); } for(int j=0;j<x.geth();j++) for(i=0;i<x.getl();i++) afa[j]->set(1,i+1,x.get(j+1,i+1)); *beta[0]=*afa[0]; for(i=1;i<x.geth();i++) { *beta[i]=*afa[i]; for(int j=0;j<i;j++) { k[j]=fraction(-1)*dot(*afa[i],*beta[j])/dot(*beta[j],*beta[j]); *beta[i]=*beta[i]+(*afa[j])*k[j]; } } for( j=0;j<x.geth();j++) { int mul=(*beta[j]).get(1,1).getdown(); for(int i=1;i<x.getl();i++) { mul=min(mul,(*beta[j]).get(1,i+1).getdown()); } *beta[j]=*beta[j]*fraction(mul,1); } for( j=0;j<x.geth();j++) { int mul=(*beta[j]).get(1,1).getup(); for(int i=1;i<x.getl();i++) { if((*beta[j]).get(1,i+1).getup()!=0) mul=max(mul,(*beta[j]).get(1,i+1).getup()); } *beta[j]=*beta[j]*fraction(1,mul); } //cout<<*afa[0]<<*afa[1]<<*afa[2]; //cout<<*beta[0]<<*beta[1]<<*beta[2]; cout<<"施密特正交变换后为:"<<endl; for(i=0;i<x.geth();i++) { cout<<"β"<<i+1<<":"<<endl; fraction mod=dot(*beta[i],*beta[i]); //cout<<"√("<<mod<<")*"; cout<<*beta[i]; for(int j=0;j<x.getl()*7+3;j++) cout<<"-"; cout<<endl; cout<<"√("<<mod<<")"<<endl<<endl<<endl; } } void eig() { cls; cout << " 矩阵计算器 -> 两个矩阵的运算->计算特征根,特征向量,施密特正交变换\n" << endl; cout<<"鉴于本算法并不完善,如果某一特征根过大,将会出错。若特征根为精度过大或为无理数,也将无法算出.\n敬请原谅!!\n\n\n\n\n"<<endl; int n; cout<<"输入方阵阶数:"; cin>>n; matrix m(n,n),smit(n,n); int smitt=0; cin>>m; cout<<"请稍等,计算中。。。。。。"<<endl; matrix eig(m.eig()); cout<<endl; cls; /*cout<<m<<"特征根为:"<<endl; for(int i=0;i<eig.getl();i++) { if(eig.get(1,i+1)!=100) { cout<<eig.get(1,i+1)<<" "; } }*/ cout<<m<<endl; int eignum=1; for(int i=0;i<n;i++) { if(eig.get(1,i+1)!=100) { matrix *p=new matrix(m); int ff=0; for(int j=0;j<m.geth();j++) { p->set(j+1,j+1,p->get(j+1,j+1)-eig.get(1,i+1)); } for( j=0;j<m.geth();j++) for(int l=0;l<m.geth();l++) p->set(j+1,l+1,p->get(j+1,l+1)*fraction(-1,1)); p->unit(); int prank=p->rank(),re=prank; re++; cout<<endl; for(int jj=0;jj<n-prank;jj++) { cout<<"λ"; cout<<eignum++; cout<<"="; } cout<<eig.get(1,i+1)<<"\n化简后为:"<<endl<<*p<<endl;//namuda matrix record(1,n); for(j=0;j<n;j++) record.set(1,j+1,n); for(j=0;j<n;j++) for(int l=0;l<n;l++) { if(p->get(j+1,l+1)==1) { record.set(1,j+1,l); break; } } //cout<<"\nrecord:"<<record<<endl; cout<<"特征向量为:"<<endl; for(j=0;j<n;j++) { if(!record.find(j)) {//smit++ int cc=0; for(int l=0;l<prank;l++) { while(!record.find(cc)) cc++; smit.set(smitt+1,cc+1,p->get(l+1,j+1)*fraction(-1)); cc++; } //cout<<smit<<endl; while(record.find(ff)) ff++; smit.set(smitt+1,ff+1,1); ff++; matrix tmp(1,n); for(int kk=0;kk<n;kk++) tmp.set(1,kk+1,smit.get(smitt+1,kk+1)); cout<<tmp<<endl; smitt++; } } //cout<<endl<<endl<<endl<<record<<endl; //cout<<endl<<smit<<endl; //cout<<eig.get(1,i+1)<<" "; } } cout<<"要进行施密特正交变换吗?(Y/N)"<<endl; char choose; cin>>choose; if(choose=='Y'||choose=='y') { cls; cout<<m; cout<<endl; smitchange(smit); } cout<<endl; } void smitt() { cls; cout << " 矩阵计算器 -> 两个矩阵的运算->施密特正交变换\n" << endl; cout<<"输入向量个数:"; int m; cin>>m; cout<<"输入维数:"; int n; cin>>n; matrix k(m,n); matrix **afa=new matrix*[m]; for(int i=0;i<m;i++) { afa[i]=new matrix(1,n); //cout<<"α"<<i+1<<":"<<endl; cin>>*afa[i]; } for( i=0;i<m;i++) for(int j=0;j<n;j++) k.set(i+1,j+1,(*afa[i]).get(1,j+1)); cout<<endl; cls; for(i=0;i<m;i++) cout<<"α"<<i+1<<":\n"<<*afa[i]<<endl; //cout<<k; smitchange(k); } void show1(); void show2(); void show3(); void show4(); int main() { char choose; while(1) { loop1:show1(); choose=getche(); switch(choose) { case '1':cls; loop2:show2(); choose=getche(); switch(choose) { case '1':convert(); pause; cls; goto loop2; case '2': antim(); pause; cls; goto loop2; case '3':cls; cout << " 矩阵计算器 -> 一个矩阵的运算->计算行列式的值\n" << endl; int heigth; cout<<"输入行列数:"; cin>>heigth; matrix *p; p=new matrix(heigth,heigth); cin>>*p; cout<<"det(A)="<<abs(*p)<<endl; delete p; pause; cls; goto loop2; case '4':pow(); pause; cls; goto loop2; case '5':function(); pause; cls; goto loop2; case '6': rank(); pause; cls; goto loop2; case '7':eig(); pause; cls; goto loop2; case '8': simplify(); pause; cls; goto loop2; case '9': smitt(); pause; cls; goto loop2; case '0':cls; goto loop1; default:cout<<"输入错误~~~"<<endl; pause; cls; goto loop2; } case '2':cls; loop3:show3(); choose=getche(); switch(choose) {case '1':add(); pause; cls; goto loop3; case '2':sub(); pause; cls; goto loop3; case '3': mul(); pause; cls; goto loop3; case '4':cls; goto loop1; default:cout<<"输入错误~~~"<<endl; pause; cls; goto loop3; } case '3':return 0; default:cout<<"输入错误~~~"<<endl; pause; cls; goto loop1; } } // matrix a(3,3); // cin>>a; // cout<<a.eig(); } void show1() { cout << "*********************************矩阵计算器*******************************\n" << endl; cout<<"\n\n\n\n\n\n\n\n\n\n\n\n"; cout <<" 1:(一个矩阵)\n"; cout <<" 2:(两个矩阵)\n"; cout <<" 3:(退出)\n " << endl; cout << "\n\n\n\n\n\n\n 输入命令: "<<endl; } void show2() { cout <<"**************************矩阵计算器 -> 一个矩阵的运算**************************\n" << endl; cout <<"\n\n\n\n\n\n"; cout <<" 1:(转置)\n"; cout <<" 2:(逆矩阵)\n"; cout <<" 3:(求行列式的值)\n"; cout <<" 4:(求n次幂)\n"; cout <<" 5:(解线性方程)\n"; cout <<" 6:(求秩)\n"; cout <<" 7:(求特征根,特征向量,施密特正交变换)\n"; cout <<" 8:(化简矩阵)\n"; cout <<" 9:(施密特正交变换)\n"; cout <<" 0:(返回)\n\n" << endl; cout <<" 输入命令: "<<endl; }/*坐标变换,对角化*/ void show3() { cout << "**************************矩阵计算器 -> 两个矩阵的运算**************************" << endl; cout << "\n\n\n\n\n\n 1:(相加)\n"; cout << " 2:(相减)\n"; cout << " 3:(相乘)\n"; cout << " 4:(返回)\n\n" << endl; cout << " 输入命令: "<<endl; }
【完】
本文内容遵从CC版权协议,转载请注明出自http://www.kylen314.com