实现复数矩阵的加减乘除

被应付的作业们

  • 实现复数矩阵的加减乘除
    • 大一非计算机类程序设计作业

实现复数矩阵的加减乘除

大一非计算机类程序设计作业

要求:

(1)使用+与-号实现两个复数矩阵的加减法;
(2)使用*实现两个复数矩阵的乘法;
(3)使用!实现复数矩阵的共轭转置操作;
(4)使用<<与>>实现复数矩阵的输出与输入;
(5)要求兼容实数矩阵运算

其实:;兼容矩阵运算也可以使用转换构造函数,但是我直接读取时判断,个人觉得比较方便。

/*
  user: sky48
  language: c++
  for dream for young
*/
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
double eps; bool correct;
struct comp                                                              //complex 结构体 
{	
	comp(double a=0,double b=0){ real=a, imag=b; }                       //complex 构造函数 
	comp operator + (comp& a){ return comp(real+a.real,imag+a.imag); }   //complex 重载运算符 + 
	comp operator - (comp& a){ return comp(real-a.real,imag-a.imag); }   //complex 重载运算符 -
	comp operator * (comp& a)
		{return comp(real*a.real-imag*a.imag,real*a.imag+imag*a.real); } //complex 重载运算符 * 
	void disp();                                                         //complex 输出函数 
	double real,imag;
};
class matrix                                                             //矩阵 类 
{
	public:
	friend istream &operator >> (istream&,matrix&);                      //matrix 重载运算符 >> 
	friend ostream &operator << (ostream&,matrix&);                      //matrix 重载运算符 <<
	friend matrix &operator + (matrix&,matrix&);                         //matrix 重载运算符 +
	friend matrix &operator * (matrix&,matrix&);                         //matrix 重载运算符 *
	friend matrix &operator - (matrix&,matrix&);                         //matrix 重载运算符 -
	friend matrix &operator ! (matrix&);                                 //matrix 重载运算符 !
	void display();                                                      //matrix 输出函数 
	void reads();                                                        //matrix 读入函数 
	int n,m;
	private:
	comp s[25][25];
};
void gets(double &real,double &imag,char tmp[]){                         // 复数读入 
	int p=0,f=1; int v=0,v1=0,v2=1; double v3;
	while(!isdigit(tmp[p])){if(tmp[p]=='-') f=-1; 
	if(tmp[p]=='i'){ imag=f; return;} p++;} v=tmp[p++]-48; 
	while( isdigit(tmp[p])) v=(v<<1)+(v<<3)+tmp[p]-48, p++;				 //读入优化 
	if(tmp[p]=='.'){
		p++;
		while(isdigit(tmp[p])) v2=(v2<<1)+(v2<<3), v1=(v1<<1)+(v1<<3)+tmp[p]-48, p++;
	}				
	v3=double(v1)/double(v2)+double(v); v3*=f;	                         //兼容double类型读入优化 
	if(tmp[p]=='i'){ real=0; imag=v3; return ; }                         //纯虚数判断 
	if(tmp[p]!='+' && tmp[p]!='-'){	real=v3, imag=0; return ; }          //复数判断 
	real=v3; f=v2=1, v=v1=v3=0;
	if(tmp[p]=='-') f=-1; p++; if(tmp[p]=='i'){ imag=f; return;} 
	v=tmp[p++]-48;
	while( isdigit(tmp[p])) v=(v<<1)+(v<<3)+tmp[p]-48, p++;              //虚数读入优化 
	if(tmp[p]=='.'){
		p++;
		while(isdigit(tmp[p])) v2=(v2<<1)+(v2<<3), v1=(v1<<1)+(v1<<3)+tmp[p]-48, p++;
	}                                                                    //兼容double虚数读入优化 
	v3=double(v1)/double(v2)+double(v); v3*=f; imag=v3;
}
istream& operator>>(istream& input,matrix& a){
	cout<<"now input the matrix:(please input a+bi while a or b can be zero)\n";
	char tmp[20];
	rep(i,1,a.n) rep(j,1,a.m){
		input>>tmp; gets(a.s[i][j].real,a.s[i][j].imag,tmp);             //读入并存储在real和imag中 
	}
	return input;
}
ostream& operator<<(ostream& ouput,matrix& a){
	cout<<"the row and line is "<<a.n<<" "<<a.m<<endl;                   //输出行和列 
	rep(i,1,a.n){
		rep(j,1,a.m) a.s[i][j].disp(), cout<<" ";
		cout<<endl;
	}          															 //输出矩阵 
}
matrix &operator + (matrix &a,matrix &b){								 //matrix 重载运算符 +
	a.n=max(b.n,a.n), a.m=max(b.m,a.m);
	rep(i,1,a.n) rep(j,1,a.m) a.s[i][j]=a.s[i][j]+b.s[i][j];
	return a;
}
matrix &operator - (matrix &a,matrix &b){								 //matrix 重载运算符 - 
	a.n=max(b.n,a.n), a.m=max(b.m,a.m);
	rep(i,1,a.n) rep(j,1,a.m) a.s[i][j]=a.s[i][j]-b.s[i][j];
	return a;
}
matrix &operator * (matrix &a,matrix &b){  								 //matrix 重载运算符 * 
	if(a.m!=b.n) correct=1, cout<<"the multiplication is error."<<endl;
	int t=b.m; comp f[25][25];
	rep(i,1,a.n) rep(j,1,b.m){
		f[i][j]=comp(0,0); 
		rep(k,1,a.m) f[i][j]=a.s[i][k]*b.s[k][j]+f[i][j];
	}
	a.m=b.m;
	rep(i,1,a.n) rep(j,1,a.m) a.s[i][j]=f[i][j];
	return a;
}
matrix &operator ! (matrix &a){ 										 //matrix 重载运算符 ! 
	swap(a.n,a.m); comp tmp(0,0); int t=max(a.n,a.m);
	rep(i,1,t) rep(j,1,i-1)
		tmp=a.s[i][j], a.s[i][j]=a.s[j][i], a.s[j][i]=tmp, a.s[i][j].imag*=-1;
	return a;
}
void matrix::display(){									 				 //matrix 输出函数 
	rep(i,1,n) rep(j,1,m) s[i][j].disp();
}
void matrix::reads(){ 													 //matrix 读入行和列 
	cout<<"please input the row and line of matrix:"; 
	cin>>n>>m;
}
void comp::disp(){														 //matrix 输出函数 
	if(fabs(imag)<eps) printf("%12.2lf",real);							 //如果为实数 
	else {
		if(fabs(real)<eps) printf("%11.2lfi",imag);						 //如果为纯虚数 
		else printf("%5.2lf%+06.2lfi",real,imag);						 //如果为复数 
	}
}
int main ()
{
//	freopen("tt.txt","r",stdin);
	eps=0.00001; 
	matrix mat1,mat2;
	mat1.reads(); cin>>mat1;											 //读入行列和矩阵 
	mat2.reads(); cin>>mat2;
	char typ;
	cout<<"what operator you wanna do:"; cin>>typ;						 //读入操作的类型 
	if(typ=='+') mat1=mat1+mat2;
	if(typ=='-') mat1=mat1-mat2;
	if(typ=='*') mat1=mat1*mat2;	
	if(typ=='!') mat1=!mat1;
	if(!correct) cout<<mat1; 
	return 0;
}

你可能感兴趣的:(课程)