⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calculator.cpp

📁 一个简单的复数计算器程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <fstream>
#include <ctime>

#define EPS 1e-5          //定义精度常数
using namespace std;      //使用标准命名空间

namespace NameCComplex{   //定义命名空间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 dlScore[3];   //3次测试得分
	}user;                   //定义全局变量

	CComplex CComplex::operator++()        //重载运算符“++”,实部与虚部均加1
	{
		Real ++;
		Image ++;
		return *this;
	}
	CComplex CComplex::operator--()        //重载运算符“--”,实部与虚部均减1
	{
		Real --;
		Image --;
		return *this;
	}
	double CComplex::mod()                 //求复数的模,返回实部^2+虚部^2
	{
		return Real*Real+Image*Image;
	}
	int CComplex::operator>(CComplex &com) //重载运算符“〉”,比较模的大小
	{
		if (mod()>com.mod()) 
			return 1;                      //若大,则返回1
		else
			return 0;                        
	}
	int CComplex::operator<(CComplex &com) //重载运算符“<”,比较模的大小
	{
		if(mod()<com.mod())
			return 1;                      //若小,则返回1
		else
			return 0;
	}
	int CComplex::operator !=(CComplex &com)//重载运算符“!=”,分别判断复数的实部与虚部
	{
		if(*this==com)
			return 0;
		else
			return 1;
	}
	istream &operator >>(istream &is,CComplex &com) //重载输入,可以输入a+bi的形式
	{
		cout<<"输入复数:";
		char s[80];
		is >>s;                      //用字符串的形式接收复数
		int len=strlen(s);           //求出字符串的长度
		int n=0,sign=1;
	//n为当前从字符串中提取出来的数字,初始化为0;sign是n的符号,初始化为正
		com.Image=com.Real=0;
		for(int k=0;k<len;k++)      //判断接收的字符串是否合法
/*
 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(k=0;k<len;)              //顺序识别字符串中各字符
		{
			if(n!=0&&(s[k]=='-'||s[k]=='+'))   //当前字符是否为符号位
			{
				com.Real=sign*n;
			//是符号位,且n!=0,即n已被赋值,表明当前读取的是虚部的符号
				n=0;                 //将原n*sign值赋给实部,将n清零,准备接收虚部的值
			}
			if(s[k]=='-')            //当前字符为负号
			{
				sign=-1;             //给符号标志赋值
				k++;
			}
			if(s[k]=='+')            //当前字符为正号
			{
				sign=1;              //给符号标志赋值
				k++;
			}
			if(s[k]=='i')            //当前字符为‘i’
			{
				if(k!=len-1)         //判断i 是否为最后一个字符
					cout<<"error\n"; //如果不是,复数数据错误
				else
					com.Image=sign*n;
			//是最后一个字符,复数对象已接收完,用sign*n为虚部赋值
				break;
			}
			while(s[k]>='0'&&s[k]<='9')
			//当前字符在0~9之间,将数字字符转换成数字数值
			{
				n=n*10+s[k]-'0';
				k++;
			}
		}
		if(s[len-1]!='i'&&n!=0)
		//如果最后一个字符不是‘i’,表示复数对象内只有实部,没有虚部
			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";
/*
 *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;                                  //实部与虚部分别相等返回1
		else
			return 0;
	}
	void Test(void)                  //测试函数,随机出10道运算题,可以打分
	{
		user.nTest ++;               //用户测试次数加1
		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;    //产生的随机数是1位数的正数或负数
			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;             //随机产生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)          //正确加10分
			{
				score+=10;
			}
			else
			{
				cout<<"此题做错了\n";
				cout<<"正确答案为:"<<answer<<endl;
			}
		}
		cout<<"你的最后得分是:"<<score<<endl;  //计算最后3次的平均分
		if(user.nTest<=3)                       //若累计测试没有超过3次
		{
			user.dlAve=0;
			user.dlScore[user.nTest-1]=score;   //将本次测试成绩添加到纪录中
			for(int i=0;i<user.nTest;i++)
			{
				user.dlAve+=user.dlScore[i];    //若以前有纪录,则添加本次测试算平均值
			}
			user.dlAve=user.dlAve/user.nTest;
		}
		else                                    //若累计次数超过3
		{
			user.dlScore[0]=user.dlScore[1];    //将最前面一条记录删除
			user.dlScore[1]=user.dlScore[2];
			user.dlScore[2]=score;              //添加本次记录

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -