c++学习笔记之复数计算器

准备了一个月的考试终于结束了。总结一下这一个月学到的理论知识,规划一下1月的计划。昨天敲了一天的代码。复数计算器是我敲的第一个比较大的程序,涉及到的主要知识点是运算符的重载和文件操作。纯代码后面再做详细的介绍。

#include<iostream>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<fstream>
#include<ctime>
#define EPS 1e-5
using namespace std;
namespace NameCComplex //空间域防止混淆 
{
	class CComplex
	{
		private:
		double Real,Image;
		public:
				CComplex(double real=0,double image=0)
				{
					Real=real;Image=image;	
				}	
				friend istream &operator >>(istream & is,CComplex& com);
				friend ostream &operator <<(ostream & os,CComplex &com);//运算符的重载
				CComplex operator +(CComplex &com); 
				CComplex operator -(CComplex &com); 
				CComplex operator *(CComplex &com); 
				CComplex operator +=(CComplex &com); 
				CComplex operator -=(CComplex &com); 
				CComplex operator *=(CComplex &com);
				CComplex operator ++(); 
				CComplex operator --();
				double mod(void);
				int operator >(CComplex &com);//类型转换字符 
				int operator <(CComplex &com);
				int operator !=(CComplex &com);
				int operator ==(CComplex &com);
	};	
	struct User
	{
		char  szname[20];
		int ntime;
		int ntest;
		double dlave;
		int nadd;
		int nsub;
		int nmul;
		double dlsocre[3];
	} user;
	CComplex CComplex::operator ++()
	{
		Real++;
		Image++;
		return *this;
	}
	CComplex CComplex::operator --()
	{
		Real --;
		Image--;
		return *this;
	}
	double CComplex::mod()
	{
		return Real*Real+Image*Image;
	 } 
	 int CComplex::operator >(CComplex &com)
	 {
	 	if(mod()>com.mod())
	 	return 1;
	 	else return 0;
	 }
	 int CComplex::operator <(CComplex &com)
	 {
	 	if(mod()<com.mod())
	 	return 1;
	 	else return 0;
	 }
	 int CComplex::operator !=(CComplex &com)
	 {
	 	if(*this==com)
	 	return 0;
	 	else
	 	return 1;
	 }
	 istream &operator >>(istream&is,CComplex &com)
	 {
	 	cout<<"输入复数:";
	 	char s[80];
	 	is>>s;
	 	int len=strlen(s);
	 	int n=0,sign=1;
	 	com.Image=com.Real=0;
	 	for(int k=0;k<len;k++)
	 	{
	 		if((s[k]<'0'||s[k]>'9')&&(s[k]!='+'&&s[k]!='-'&&s[k]!='i'))
	 		{
			 	cout<<"error"<<endl;
	 			return is;
	 		}
		 }
		for(int k=0;k<len;)
		{
			if(n!=0&&(s[k]=='-'||s[k]=='+'))
			{
				com.Real=sign*n;
				n=0;
			}
			if(s[k]=='-')
			{
				sign=-1;k++;
			}
			if(s[k]=='+')
			{
				sign=1;k++;
			}
			if(s[k]=='i')
			{
				if(k!=len-1)
				cout<<"error\n";
				else
				com.Image=sign*n;
				break;
			}
			while(s[k]>='0'&&s[k]<='9')
			{
				n=n*10+s[k]-'0';
				k++;
			}
		}
		if(s[len-1]!='i'&&n!=0)
		com.Real=n*sign;
		return is;
	 }
	 ostream&operator<<(ostream &os,CComplex &com)
	 {
	 	if(fabs(com.Image)<EPS)
	 	os<<com.Real;
	 	else if((fabs(com.Real)<EPS))
	 	os<<com.Image<<"i";
	 	else if(com.Image>0)
	 	os<<com.Real<<"+"<<com.Image<<"i";
	 	else
	 	os<<com.Real<<com.Image<<"i";
	 	return os;
	 }
	 CComplex CComplex::operator +(CComplex&com)
	 {
	 	CComplex sum;
	 	sum.Real=Real+com.Real;
	 	sum.Image=Image+com.Image;
	 	return sum;
	 }
	 CComplex CComplex::operator *(CComplex &com)
	 {
	 	CComplex multi;
	 	multi.Real=Real*com.Real-Image*com.Image;
	 	multi.Image=Real*com.Image+Image*com.Real;
	 	return multi;
	 }
	 CComplex CComplex::operator -(CComplex &com)
	 {
	 	CComplex sub;
		sub.Real=Real-com.Real;
		sub.Image=Image-com.Image;
		return sub;	 	
	 }
	 CComplex CComplex::operator +=(CComplex &com)
	 {
	 	Real=Real+com.Real;
	 	Image=Image+com.Image;
	 	return *this;
	 }
	 CComplex CComplex::operator -=(CComplex &com)
	 {
	 	Real=Real-com.Real;
	 	Image=Image-com.Image;
	 	return *this;
	 }
	 CComplex CComplex::operator *=(CComplex &com)
	 {
	 	double nReal=Real*com.Real-Image*com.Image;
	 	double nImage=Real*com.Image+Image*com.Real;
	 	Real=nReal;
	 	Image=nImage;
	 	return *this;
	 }
	 int CComplex::operator ==(CComplex&com)
	{
		 if(Real==com.Real&&Image==com.Image)
		 return 1;
		 else
		 return 0;
	}
	void test(void)
	{
		user.ntest++;
		cout<<"共10道题,作10以内的加减运算,满分100分:\n";
		double real1,real2,image1,image2,real3,real4,image3,image4;
		CComplex answer,temp;
		int score=0;
		char op;
		for(int i=0;i<=9;i++)
		{
			real1=rand()%200-100;
			image1=rand()%200-100;
			real2=rand()%200-100;
			image2=rand()%200-100;
			CComplex a(real1,image1),b(real2,image2);
			real3=rand()%20-10;
			image3=rand()%20-10;
			real4=rand()%20-10;
			image4=rand()%20-10;
			CComplex c(real3,image3),d(real4,image4);
			op=rand()%3;
			switch(op)
			{
				case 0:
				answer=a+b;
				cout<<a<<"加上"<<b<<"等于";
				break;
				case 1:
				answer=a-b;
				cout<<a<<"减去"<<b<<"等于";
				break;
				case 2:
				answer=c*d;
				cout<<c<<"乘以"<<d<<"等于";
				break;	
			}
			cin>>temp;
			if(answer==temp)
			{
				score+=10;
			}
			else
			{
				cout<<"此题做错了\n";
				cout<<"正确答案为:"<<answer<<endl;
			}
		}
		cout<<"你的最后得分是:"<<score<<endl;
		if(user.ntest<=3)
		{
			user.dlave=0;
			user.dlsocre[user.ntest-1]=score;
			for(int i=0;i<user.ntest;i++)
			user.dlave+=user.dlsocre[i];
			user.dlave=user.dlave/user.ntest;
		 } 
		 else
		 {
		 	user.dlsocre[0]=user.dlsocre[1];
		 	user.dlsocre[1]=user.dlsocre[2];
		 	user.dlsocre[2]=score;
		 	user.dlave=0;
		 	for(int i=0;i<3;i++)
		 	user.dlave+=user.dlsocre[i];
		 	user.dlave=user.dlave/3;
		 }
		 cout<<"按任意键继续\n";
		 cout.flush();
		 cin.get();
		 cin.get();
	}
	void add()
	{
		user.nadd++;
		CComplex num1,num2,sum,zero(0,0);
		cout<<"加法计算\n"<<"最少输入两个复数,并且以零结束\n";
		cout<<"第一个复数";
		cin>>num1;
		cout<<"第二个复数";
		cin>>num2;
		sum=num1+num2;
		cout<<"第三个复数";
		cin>>num1;
		int i=4;
		while(!(num1==zero))
		{
			sum=sum+num1;
			cout<<"第"<<i<<"个复数";
			cin>>num1;
			i++;
		}
		cout<<"加法计算的结果是"<<sum<<endl;
		cout<<"按任意键继续\n";
		cout.flush();
		cin.get();
		cin.get();
	}
	void sub()
	{
		user.nsub++;
		CComplex num1,num2,sub,zero(0,0);
		cout<<"减法计算\n"<<"最少输入两个复数,并且以零结束\n";
		cout<<"第一个复数";
		cin>>num1;
		cout<<"第二个复数";
		cin>>num2;
		sub=num1-num2;
		cout<<"第三个复数";
		cin>>num1;
		int i=4;
		while(!(num1==zero))
		{
			sub=sub-num1;
			cout<<"第"<<i<<"个复数";
			cin>>num1;
			i++;
		}
		cout<<"减法运算的结果是"<<sub<<endl;
		cout<<"按任意键继续\n";
		//cout.flush();
		cin.get();
		cin.get();
	}
	void mul()
	{
		user.nmul++;
		CComplex num1,num2,mul,zero(0,0);
		cout<<"乘法计算\n"<<"最少输入两个复数,并且以零结束\n";
		cout<<"第一个复数";
		cin>>num1;
		cout<<"第二个复数";
		cin>>num2;
		mul=num1*num2;
		cout<<"第三个复数";
		cin>>num1;
		int i=4;
		while(!(num1==zero))
		{
			num1*=num1;
			cout<<"第"<<i<<"个数";
			cin>>num1;
			i++;
		}
		cout<<"乘法运算的结果是"<<mul<<endl;
		cout<<"按任意键继续\n";
		//cout.flush();
		cin.get();
		cin.get();
	 } 
	 void add1()
	 {
	 	user.nadd++;
		CComplex num1; 
		cin>>num1;
		num1+=num1;
		cout<<"自加结果为"<<num1<<endl;
		cout<<"按任意键继续\n";
		cout.flush();
		cin.get();
		cin.get(); 
	 }
	 void sub1()
	 {
	 	user.nsub++;
		CComplex num1;
		cin>>num1;
		num1-=num1;
		cout<<"自减结果为"<<num1<<endl;
		cout<<"按任意键继续\n";
		cout.flush();
		cin.get();
		cin.get(); 
	 }
	 void compare()
	 {
	 	CComplex num1,num2;
	 	cout<<"输入两个复数\n";
	 	cout<<"第一个复数:";
		cin>>num1;
		cout<<"第二个复数";
		cin>>num2;
		if(num1==num2)
		cout<<"这两个复数相等\n";
		else if(num1>num2)
		cout<<num1<<"的模大于"<<num2<<"的模\n";  
		else if(num1<num2)
		cout<<num2<<"的模大于"<<num1<<"的模\n";  
		else
		cout<<"这两个复数的模相等\n";
		cout<<"按任意键继续\n";
		cin.get();
		cin.get();
	  } 
	  void userprint()
	  {
	  	cout<<user.szname<<"使用的次数为"<<user.ntime<<endl;
	  	cout<<"其中:\t加法次数:"<<user.nadd<<"\t减去次数:"<<user.nsub<<"/t乘法次数"<<user.nmul<<endl;
	  	cout<<"\t测试次数:"<<user.ntest<<"\t平均成绩"<<user.dlave<<endl;
	  }
	  void login()
	  {
	  	char szname[20];
	  	cout<<"请输入您的姓名:";
	  	cin.getline(szname,20);
	  	ifstream infile;
	  	User user1;
	  	infile.open("user.dat",ios::binary|ios::in);
	  	if(! infile)
	  	{
	  		cout<<"没有原始记录文件,您是第一位用户!\n";
	  		strcpy(user.szname,szname);
	  		user.ntime++;
	  		return;
		  }
		  infile.read((char*)&user1,sizeof(User));
		  while(!infile.eof())
		  {
		  	if(strcmp(user1.szname,szname)==0)
		  	{
		  		user=user1;
		  		user.ntime++;
		  		cout<<"欢迎您再次使用复数计算器";
		  		userprint();
				cin.get();
				infile.close();
				return; 
			  }
			  infile.read((char *)&user1,sizeof(User));
		  }
		  strcpy(user.szname,szname);
		  user.ntime++;
		  infile.close();
		  return;
	  }
	  void savefile()
	  {
	  	userprint();
	  	fstream file;
	  	User user1;
	  	file.open("user.dat",ios::binary|ios::in|ios::out);
	  	if(!file)
	  	{
	  		cout<<"文件打开错误,不能将记录更新\n";
	  		 return ;
		  }
		file.seekp(0,ios::beg);
		while(!file.eof()) 
		{
			file.read((char*)&user1,sizeof(User));
			if(strcmp(user1.szname,user.szname)==0)
			{
			file.seekp(-(sizeof(User)),ios::cur);
			file.write((char*)&user,sizeof(User));
			file.close();
			return;
			}
		}
		file.close();
		fstream outfile;
		outfile.open("user.dat",ios::binary|ios::app);
		outfile.write((char*)&user,sizeof(User));
		outfile.close();
		return;
	  }  
}
using namespace NameCComplex;
int main(void)
{
	srand(time(NULL));
	login();
	char strChoice[20];
	do
	{
		system("cls");
		cout<<"\t这是一个简单的复数计算器程序,可以实现以下功能,请按对应的键(1~7)进入\n\n\n";
		cout<<"\t==============MENU==============\n";
		cin>>strChoice;
		if(strcmp(strChoice,"1")==0)
		add();
		else if(strcmp(strChoice,"2")==0)
		sub();
		else if(strcmp(strChoice,"3")==0)
		test();
		else if(strcmp(strChoice,"4")==0)
		mul();
		else if(strcmp(strChoice,"5")==0)
		add1();
		else if(strcmp(strChoice,"6")==0)
		sub1();
		else if(strcmp(strChoice,"7")==0)
		compare();
		else if(strcmp(strChoice,"0")==0)
		{
			cout<<"\n\n\t欢迎下次继续使用计算器!\n\n";
			break;
		}
		else
		{
			cout<<"\n\t输入错误,请按任意键后重新输入!\n";
			cin.get();
			cin.get();
		}
	}
	while((strcmp(strChoice,"0")));
	savefile();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_24163555/article/details/85450080