1、C小型复数计算器#include#include#include#include#include#include#define EPS 1e-5 /定义精度常数using namespace std; /使用标准空间命名stdnamespace NameCComplex /定义命名空间NameCComplexclass CComplex /定义一个CComplex类private:double Real,Image;public:CComplex(double real=0,double image=0) /构造函数Real=real;Image=image;friend istream &
2、operator(istream &is,CComplex &com); /重载输入friend ostream & operator(CComplex &com);int operator(CComplex &com) /重载运算符,比较模的大小if(mod()com.mod()return 1;elsereturn 0;int CComplex:operator(CComplex &com)if(mod()(istream &is,CComplex &com) /重载输入,可以输入a+bi的形式couts; /用字符串的形式接受复数int len=strlen(s); /求出字符串的长度i
3、nt n=0,sign=1;/n为当前从字符串中提取出来的数字,初始化为0;sign是难道符号,初始化为正com.Image=com.Real=0;for(int k=0;klen;k+) /判断接受的字符串是否合法if(sk 9) & (sk!=+ & sk!=- & sk!=i)couterrorendl;return is; /错误,输出出错信息并返回for(k=0;klen;) /顺序识别字符串中各字符if(n!=0 &(sk=-|sk=+) /当前字符是否是符号位com.Real=sign*n;/是符号位,且n!=0,即n已被赋值,表明当前读取的是虚部的符号n=0; /将原n*sig
4、n值赋给实部,将n清零,准备接受虚部的值if(sk=-) /当前字符为负号sign=-1;k+; /给符号标志赋值if(sk=+) /当前字符为正号sign=1;k+; /给符号标志赋值if(sk=i) /当前字符为Iif(k!=len-1) /判断字符I是否为字符串中作后一个字符cout=0 & sk=9)/当前字符在09之间,将数字字符转换成数字数值n=n*10+sk-0;k+;if(slen-1!=i & n!=0)/如果最后一个字符不是I,表示复数对象内只有实部,没有虚部com.Real=n*sign;return is;ostream & operator(ostream &os,C
5、Complex &com) /重载输入if(fabs(com.Image)EPS) / 如果虚部为0oscom.Real; /只输出实部else if(fabs(com.Real)EPS) /如果实部为0oscom.Image0)oscom.Real+com.Imagei;elseoscom.Realcom.Imagei; /虚部为正return os;CComplex CComplex:operator+(CComplex &com) /加法重载CComplex sum;sum.Real=Real+com.Real; /实部相加sum.Image=Image+com.Image; /虚部相加
6、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 s
7、ub;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
8、.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;elsereturn 0;void Test(void) /测试函数user.nTest+;cout共10道题,做100以内的加减运算,满分100分:n;double real1,real2,image1,image2,real3,real4,ima
9、ge3,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(real
10、3,image3),d(real4,image4);op=rand()%3; /产生随机加减乘法运算的三个值switch(op)case 0:answer=a+b;couta加上b等于;break;case 1:answer=a-b;couta减去b等于;break;case 2:answer=c*d;coutc乘以dtemp; /输入用户计算值if(answer=temp) /比较用户计算值score+=10;elsecout此题做错了n;cout正确答案为:answerendl;cout你的最后得分是:scoreendl;if(user.nTest=3)user.alAve=0;user.
11、dlScoreuser.nTest-1=score;for(int i=0;iuser.nTest;i+)user.alAve+=user.dlScorei;user.alAve=user.alAve/user.nTest;elseuser.dlScore0=user.dlScore1;user.dlScore1=user.dlScore2;user.dlScore2=score;for(i=0,user.alAve=0;i3;i+)user.alAve+=user.dlScorei;user.alAve=user.alAve/3;cout请按任意键继续n;cout.flush();cin.g
12、et();cin.get();void Add() /复数加法运算函数user.nAdd+;CComplex num1,num2,sum,Zero(0,0);cout加法计算n最少输入两个复数,并且以0结束n;coutnum1;coutnum2;sum=num1+num2;coutnum1;int i=4;while(!(num1=Zero)sum=sum+num1;cout第inum1;i+;cout加法结果是:sumendl;cout请按任意键继续n;cout.flush();cin.get();cin.get();void Sub() /复数减法预算函数user.nSub+;CCompl
13、ex num1,num2,sub,Zero(0,0);cout最少输入两个复数,并且以0结束n;coutnum1;coutnum2;sub=num1-num2;coutnum1;int i=4;while(!(num1=Zero)sub=sub-num1;cout第inum1;i+;cout减法结果是:subendl;cout请按任意键继续n;cout.flush();cin.get();cin.get();void Mul() /复数乘积函数user.nMul+;CComplex num1,num2,mul,Zero(0,0);cout乘法计算n最少输入两个复数,并且以零结束n;coutnu
14、m1;coutnum2;mul=num1*num2;coutnum1;int i=4;while(!(num1=Zero)mul*=num1;cout第inum1;i+;cout乘法结果是:mulendl;coutnum1;+num1;cout自加的结果为num1endl;coutnum1;-num1;cout自减的结果为num1endl;cout按任意键结束n;cout.flush();cin.get();cin.get();void compare() /两复数比较函数CComplex num1,num2;cout输入两个复数n;coutnum1;coutnum2;if(num1=num2
15、)coutnum2)coutnum1的模大于num2的模n;else if(num1num2)coutnum2的模大于num1的模n;elsecout这两个复数的模相等n;cout按任意键继续n;cin.get();cin.get();void userprint() /输出用户信息函数coutuser.szName使用的次数为:user.nTimeendl;cout其中:t加法的次数:user.nAddt减法的次数:user.nSubt乘法的次数:user.nMulendl;coutt测试次数:user.nTestt平均成绩:user.alAveendl;void Login() /当前用户
16、信息函数char szName20;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.nTest+;return;infile.read(char *)&user1,sizeof(User);while(!infile.eof()if(strcmp(user1.szName,szName)=0)user=use
17、r1;user.nTime+;cout欢迎您再次使用复数计算器!;userprint();cin.get();infile.close();return;infile.read(char *) &user1,sizeof(User);cout欢迎您再次使用复数计算器!;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:ou
18、t);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:
19、binary|ios:app);outfile.write(char *)&user,sizeof(User);outfile.close();return;using namespace NameCComplex;int main(void) /主函数开始srand(time(NULL); /初始化随机数“种子”语句Login(); /当前用户信息函数char strChoise20; /定义字符串名dosystem(cls);coutt这是一个简单的复数计算器程序,可以实现以下功能,请按对应的按键(1-7)nnn;coutt=MENU=n;coutt1:多复数加法,以0结束n;coutt2
20、:多复数减法,以0结束n;coutt3:测试100以内的复数加减乘法运算,1次测试10道题n;coutt4:多复数乘法,以0结束n;coutt5:复数自加n:;coutt6:复数自减n:;coutt7:复数比较n:;coutt0:退出程序nn:;coutstrChoise;if(strcmp(strChoise,1)=0) /用户选1则调用Add()函数Add();else if(strcmp(strChoise,2)=0) /用户选2则调用Sub()函数Sub();else if(strcmp(strChoise,3)=0) /用户选3则调用Test()函数Test();else if(st
21、rcmp(strChoise,4)=0) /用户选4则调用Add()函数Mul();else if(strcmp(strChoise,5)=0) /用户选5调用Add1()函数Add1();else if(strcmp(strChoise,6)=0) /用户选6则调用Sub1()函数Sub1();else if(strcmp(strChoise,7)=0) /用户选7则调用Compare()函数compare();else if(strcmp(strChoise,0)=0) /用户选0则结束调用函数coutnnt欢迎下次继续使用复数计算器!nn;break;elsecoutnt输入错误,请按任意键继续!n;cin.get();cin.get();while(strcmp(strChoise,0);SaveFile(); /调用用户资料保存函
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1