1、目 录1 题目内容及设计规定12 总体设计12.1 总体功能框图12.2 类设计阐明12.3 重要算法流程图13程序清单及注释14运营成果与分析15总结26参照文献21 题目内容及设计规定题目17 复数计算器内容及规定:(1)所设计复数计算器可以进行+ - * += -= *= + - = = (istream &is,CComplex &com ); /重载输入friend ostream & operator(CComplex &com);int operator(CComplex &com);int operator!=(CComplex &com);int operator=(CCom
2、plex &com);2.3 重要算法流程图开始声明一种complex类,并定义double,real,image;声明类函数,构造函数,加减乘除和取模运算c.real=real+c2.real;c.imag=imag+c2.imag;c.real=real-c2.real;c.imag=imag-c2.imag;c.real=(real*c2.real+imag*c2.imag)/a;c.imag=(imag*c2.real-real*c2.imag)/ac.real=real*c2.real-imag*c2.imag;c.imag=real*c2.imag+imag*c2.real;Sqr
3、t(real*real=imag*imag);输出c1,c2,c1+c2,c1-c2,c1*c2,c1/c2,c1值终结。图21 算法流程图3 程序清单及注释#include #include #include #include #include #include /#define EPS len-5 / 定义精度常数using namespace std;namespace NameCComplex / 定义命名空间 NameCComplex/*-|某些A:| 复数类 CComplex 声明和定义,以及构造体类型 顾客 User 定义| -*/*- | 复数类 CComplex 声明 -*/
4、class CComplexprivate: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 (CComplex & com);int operator ”,比较模大小int CComplex:operator (CComplex & com)if (
5、 mod() com.mod() )return 1; / 若大,则返回 1elsereturn 0;/ 重载运算符“”,比较模大小int CComplex:operator (CComplex & com)if ( mod() (istream & is,CComplex & com) cout s; / 用字符串形式接受复数int len = strlen(s); / 求出字符串长度int n = 0,sign = 1; / 其中 n 值 为当前从字符串中提取出数字,会在下面 while 语句中得到拟定值 / sign 为状态变量,表达数值正负符号,以辅助辨认正负值com.Image =
6、com.Real = 0;/ 判断接受字符串与否合法for(int k=0;klen;k+)if ( (sk9) & (sk!=+ & sk!=- & sk!=i) )cout error endl;return is; / 错误,输出出错信息并返回/ 顺序辨认字符串中各字符for(int k=0;klen;)if ( n!=0 & (sk=- | sk=+) ) / 当前字符与否为符号位com.Real = sign * n; / 是符号位,且 n!=0,即 n 已被赋值(通过下面whlie语句),表白当前读取是虚部符号n = 0; / 将原 n*sign 值(带正负号数值)赋给实部后,将
7、n 清零,准备下一次继续接受并判断与否为虚部值if ( sk = -) / 当前字符若为负号sign = -1; k+; / 给符号标志变量 sign 赋值,表达为负数if ( sk = +) / 当前字符若为正号sign = 1; k+; / 给符号标志变量 sign 赋值,表达为正数if ( sk=i ) / 若当前字符为“i”if ( k!=len-1 ) / 判断字符 i 与否为字符串中最后一种字符cout =0 & sk=9 ) / 当前字符若在 09 之间,则将数字字符转换成数字数值n = n * 10 + sk - 0;k+;if ( slen-1!=i & n!=0 ) / 如
8、果最后一种字符不是 i,表达复数对象内只有实部,没有虚部,如:-acom.Real = n * sign;return is;/ 重载复数输出ostream & operator (ostream & os,CComplex & com)if ( fabs(com.Image)=0 ) / 如果虚部为 0os com.Real; / 只输出实部else if ( fabs(com.Real)=0 ) / 如果实部为 0os com.Image 0 )os com.Real + com.Image i; / 虚部为正elseos com.Real com.Image i; / 如 实部为 3,虚
9、部为 -6i,就变为 3 - 6i,而不是 3 + -6ireturn 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;
10、 / 乘积实部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;
11、 / 实部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
12、 = 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; / 实部与虚部某些相等,则返回 1elsereturn 0;/*-|某些B:|测试函数 void Test(void)|实现复数加法函数 void Add()|实现复数减法函数 void Sub()
13、|实现复数乘法函数 void Mul()|实现复数自加函数 void Add1()|比较两个复数大小函数 void Compare()|输出本次顾客使用计算器状况记录 void userprint()|当前顾客使用完计算器,保存或更新顾客资料函数 void SaveFile()| -*/ 测试函数,随机出 10 道运算题,可以打分void Test(void)user.nTest+; / 顾客测试次数加 1cout 共10道题,作10以内加减运算,满分 100分:n;double real1,real2,image1,image2,real3,real4,image3,image4; / 1
14、和 2 分别代表两个待相加复数实部和虚部,3 和 4 则为相乘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 - 1
15、0; / 产生随机数是一位数,可以是正数或负数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: / 乘法运算,用实部和虚部都是 1 位数对象操作answer =
16、c * d;cout c 乘以 d temp; / 接受顾客输入成果if ( answer=temp ) score+=10; / 对的则加 10分elsecout 此题做错了n;cout 对的答案为: answer endl;cout 你最后得分是: score endl;/ 计算最后 3次平均分if ( user.nTest=3 ) / 若合计次数没有超过 3次user.dlAve = 0;user.dlScoreuser.nTest-1 = score; / 将本次测试成绩添加进记录中for(int i=0;iuser.nTest;i+)user.dlAve += user.dlScor
17、ei; / 若此前有记录,将其与本次记录合计相加起来,用以计算平均分user.dlAve = user.dlAve / user.nTest; / 计算平均分,user.dlAve 从合计分数 变成了平均分else / 如果合计测试超过 3次user.dlScore0 = user.dlScore1; / 最前面一次记录将被覆盖,即:删除user.dlScore1 = user.dlScore2;user.dlScore2 = score; / 将本次记录添加进测试记录尾部user.dlAve=0;for(int i=0;i3;i+) / 计算最新 3次平均分user.dlAve += use
18、r.dlScorei;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 至少输入两个复数,输入“0”结束n;cout num1; / 输入第 1个复数cout num2; / 输入第 2个复数sum = num1 + num2;cout num1; / 输入第 3个复数int i = 4;while ( !(num1=Zero) )sum = sum
19、+ num1; / 实现复数相加cout 第 i num1; / 输入第 i个复数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 至少输入两个复数,输入“0”结束n;cout num1; / 输入第 1个复数cout num2; / 输入第 2个复数sub = num1 - num2;cout num1; / 输入第 3个复数int i = 4;while ( !
20、(num1=Zero) )sub = sub - num1; / 实现复数减法cout 第 i num1; / 输入第 i个复数i+;cout 成果是: sub endl;cout 按任意键继续n;cin.get();cin.get();/ 实现复数乘法void Mul()user.nMul+;CComplex num1,num2,mul,Zero(0,0);cout 乘法计算n 至少输入两个复数,输入“0”结束n;cout num1; / 输入第 1个复数cout num2; / 输入第 2个复数mul = num1 + num2;cout num1; / 输入第 3个复数int i = 4
21、;while ( !(num1=Zero) )mul *= num1; / 实现复数减法cout 第 i num1; / 输入第 i个复数cout 成果是: mul endl;cout num1; / 这里 输入数也许是虚部为0数,原书代码未作判断num1+; / 实部与虚某些别加 1cout 自加成果为 num1 endl;cout num1;num1-;cout 自减成果为 num1 endl;cout 按任意键继续n;cout.flush();cin.get();cin.get();/ 比较两个复数大小void Compare()CComplex num1,num2;cout 输入两个复
22、数n;cout num1;cout num2;if ( num1=num2 )cout num2 )cout num1 模不不大于 num2 模n;else if ( num1num2 )cout num2 模不不大于 num1 模n;elsecout 这两个复数模相等n;cout 按任意键继续n;cin.get();cin.get();/ 输出本次顾客使用计算器状况记录void userprint()cout user.szName 使用次数为: user.nTime 次 endl;cout 其中:t 加法次数: user.nAdd 次n t 减法次数: user.nSub 次n t 乘法次
23、数: user.nMul 次n t 测试次数: user.nTest 次n t 平均成绩: user.dlAve 次 endl;/ 顾客登陆,开始启动计算器void Login()char szName20;cout 请输入您姓名:;cin.getline(szName,20);ifstream infile;User user1;infile.open(user.dat,ios:binary|ios:in); / 打开顾客资料文献 (这个地方 若没有文献,则不会创立新文献,不知何问题if ( !infile ) / 若没有顾客资料文献cout 没有原始记录文献, 您是第 1位顾客!n;str
24、cpy(user.szName,szName); / 为全局变量 user 中 szName 成员赋值user.nTime+;return; / 函数返回/ 读取顾客资料文献(从该文献第1个字节开始逐个读取信息)/ 如果顾客资料中找到了当前姓名顾客,则阐明是老顾客,显示某些信息,并作某些使用次数记录。infile.read( (char *)&user1,sizeof(User) ); while ( !infile.eof() ) / 只要没到文献末尾(未遇文献结束符),则始终进行此循环if ( strcmp(user.szName,szName)=0 ) / 将顾客资料文献中顾客名与读取顾客名进行比较user