《复数计算器课程设计.doc》由会员分享,可在线阅读,更多相关《复数计算器课程设计.doc(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
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 o
2、perator!=(CComplex &com);int operator=(CComplex &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*
3、c2.imag;c.imag=real*c2.imag+imag*c2.real;Sqrt(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 的声明和定义,以及结构
4、体类型 用户 User 的定义 | 复数类 CComplex 的声明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
5、 CComplex:operator (CComplex & com)if ( 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 语句中得
6、到确定的值 / sign 为状态变量,表示数值的正负符号,以辅助辨认正负值com.Image = 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 已被赋值(通过下面的wh
7、lie语句),表明当前读取的是虚部的符号n = 0; / 将原 n*sign 值(带正负号的数值)赋给实部后,将 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 之间,则将数字字
8、符转换成数字数值n = n * 10 + sk - 0;k+;if ( slen-1!=i & n!=0 ) / 如果最后一个字符不是 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 +
9、 com.Image i; / 虚部为正elseos com.Real com.Image i; / 如 实部为 3,虚部为 -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)CCom
10、plex 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
11、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 nRea
12、l = 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; / 实部与虚部部分相等,则返回 1elsereturn 0;|部分B:|测试
13、函数 void Test(void)|实现复数的加法函数 void Add()|实现复数的减法函数 void Sub()|实现复数的乘法函数 void Mul()|实现复数的自加函数 void Add1()|比较两个复数的大小函数 void Compare()|输出本次用户使用计算器的情况记录 void userprint()|当前用户使用完计算器,保存或更新用户资料函数 void SaveFile()/ 测试函数,随机出 10 道运算题,可以打分void Test(void)user.nTest+; / 用户测试次数加 1cout 共10道题,作10以内的加减运算,满分 100分:n;dou
14、ble real1, real2, image1, image2, real3, real4, image3, image4; / 1 和 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
15、(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;ca
16、se 1:answer = a - b;cout a 减去 b 等于;break;case 2: / 乘法运算,用实部和虚部都是 1 位数的对象操作answer = 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.dlScoreuse
17、r.nTest-1 = score; / 将本次测试成绩添加进记录中for(int i=0; iuser.nTest; i+)user.dlAve += user.dlScorei; / 若以前有记录,将其与本次记录累计相加起来,用以计算平均分user.dlAve = user.dlAve / user.nTest; / 计算平均分,user.dlAve 从累计的分数 变成了平均分else / 如果累计测试超过 3次user.dlScore0 = user.dlScore1; / 最前面的一次记录将被覆盖,即:删除user.dlScore1 = user.dlScore2;user.dlSco
18、re2 = score; / 将本次记录添加进测试记录的尾部user.dlAve=0;for(int i=0; i3; i+) / 计算最新 3次的平均分user.dlAve += user.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个复数cou
19、t num2; / 输入第 2个复数sum = num1 + num2;cout num1; / 输入第 3个复数int i = 4;while ( !(num1=Zero) )sum = sum + 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”
20、结束n;cout num1; / 输入第 1个复数cout num2; / 输入第 2个复数sub = num1 - num2;cout num1; / 输入第 3个复数int i = 4;while ( !(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
21、 最少输入两个复数,输入“0”结束n;cout num1; / 输入第 1个复数cout num2; / 输入第 2个复数mul = num1 + num2;cout num1; / 输入第 3个复数int i = 4;while ( !(num1=Zero) )mul *= num1; / 实现复数的减法cout 第 i num1; / 输入第 i个复数cout 结果是: mul endl;cout num1; / 这里 输入的数可能是虚部为0的数,原书代码未作判断num1+; / 实部与虚部分别加 1cout 自加结果为 num1 endl;cout num1;num1-;cout 自减结
22、果为 num1 endl;cout 按任意键继续n;cout.flush();cin.get();cin.get();/ 比较两个复数的大小void Compare()CComplex num1, num2;cout 输入两个复数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();/ 输出本次用户使用计算器的情
23、况记录void userprint()cout user.szName 使用的次数为: user.nTime 次 endl;cout 其中:t 加法次数: user.nAdd 次n t 减法次数: user.nSub 次n t 乘法次数: 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(us
24、er.dat, ios:binary|ios:in); / 打开用户资料文件 (这个地方 若没有文件,则不会创建新文件,不知何问题if ( !infile ) / 若没有用户资料文件cout 没有原始记录文件, 您是第 1位用户!n;strcpy(user.szName, szName); / 为全局变量 user 中 szName 成员赋值user.nTime+;return; / 函数返回/ 读取用户资料文件(从该文件的第1个字节开始逐个读取信息)/ 如果用户资料中找到了当前姓名的用户,则说明是老用户,显示一些信息,并作一些使用次数的记录。infile.read( (char *)&use
25、r1, sizeof(User) ); while ( !infile.eof() ) / 只要没到文件末尾(未遇文件结束符),则一直进行此循环if ( strcmp(user.szName, szName)=0 ) / 将用户资料文件中的用户名与读取的用户名进行比较user = user1; / 若该用户以前使用计算器,将原资料赋值给全局变量 useruser.nTime+; / 用户使用次数加 1cout 欢迎您再次使用复数计算器!;userprint(); / 输出用户资料中的信息cin.get();infile.close();return;infile.read( (char *)&
26、user1, sizeof(User) );/ 如果用户资料中没有当前用户,表明该用户是第 1次使用计算器cout 欢迎您使用复数计算器!;strcpy(user.szName, szName); / 为全局变量 user 中 szName 成员赋值user.nTime+; /用户使用次数加 1infile.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.seekg(0, ios:beg); / 文件指针指向文件头while( !file.eof() )file.read( (char *)&user1, sizeof(User) ); / 逐个读取用户资料文件中的用户信息/ 将用户资料文件中的用户名依次与当前用户名进行比较if