复数计算器课程设计

上传人:jun****875 文档编号:23766460 上传时间:2021-06-10 格式:DOC 页数:26 大小:299.91KB
返回 下载 相关 举报
复数计算器课程设计_第1页
第1页 / 共26页
复数计算器课程设计_第2页
第2页 / 共26页
复数计算器课程设计_第3页
第3页 / 共26页
点击查看更多>>
资源描述
目 录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=(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*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 的声明和定义,以及结构体类型 用户 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 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 语句中得到确定的值 / 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 已被赋值(通过下面的whlie语句),表明当前读取的是虚部的符号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 之间,则将数字字符转换成数字数值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 + 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)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; / 实部与虚部部分相等,则返回 1elsereturn 0;/*-|部分B:|测试函数 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;double 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(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: / 乘法运算,用实部和虚部都是 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.dlScoreuser.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.dlScore2 = 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个复数cout 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”结束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 最少输入两个复数,输入“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 自减结果为 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();/ 输出本次用户使用计算器的情况记录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(user.dat, ios:binary|ios:in); / 打开用户资料文件 (这个地方 若没有文件,则不会创建新文件,不知何问题if ( !infile ) / 若没有用户资料文件cout 没有原始记录文件, 您是第 1位用户!n;strcpy(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 = user1; / 若该用户以前使用计算器,将原资料赋值给全局变量 useruser.nTime+; / 用户使用次数加 1cout 欢迎您再次使用复数计算器!;userprint(); / 输出用户资料中的信息cin.get();infile.close();return;infile.read( (char *)&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 ( strcmp(user1.szName, user.szName)=0 ) / 若在用户资料文件中找到该用户file.seekp(-(sizeof(User), ios:cur); / 文件指针退回到该用户资料信息的首位置file.write( (char *)&user, sizeof(User) ); / 将全局变量 user 的内容写到用户资料文件中,即更新该用户的资料file.close();return; / 程序返回file.close();fstream outfile;/ 若在用户资料文件中找不到当前用户的资料,表明当前用户是第 1次使用计算器outfile.open(user.dat, ios:binary|ios:app); / 以添加的方式打开用户资料文件outfile.write( (char *)&user, sizeof(User) ); / 将当前用户的资料添加在用户资料文件中outfile.close();return;using namespace NameCComplex; / 使用标准命名空间 NameCComplex/*-| | 主函数部分| -*/int main(void)srand( time(NULL) ); / 初始化随机数种子Login(); / 打开文件,登记用户int Choice;dosystem(cls); / 系统执行命令:cls 为清屏cout 这是一个简单的复数计算器程序,可以实现以下功能,请按下对应的键(1 7)进入nnn;cout t=主菜单=n;cout t 1:多复数加法n;cout t 2:多复数减法n;cout t 3:测试 100以内的复数加减乘法运算,1次测试10道题n;cout t 4:多复数乘法n;cout t 5:复数自加n;cout t 6:复数自减n;cout t 7:复数比较n;cout t 0:退出计算器程序nn;cout Choice;/ 下面用 switch - case 语句实现多现选择,当然也可以用 if - else 语句实现多项选择switch(Choice)case 1:Add(); break;case 2:Sub(); break;case 3:Test(); break;case 4:Mul(); break;case 5:Add1(); break;case 6:Sub1(); break;case 7:Compare(); break;case 0:cout nt 欢迎下次继续使用复数计算器!nn;break;default:cout nt 输入错误,请按任意键后重新输入!n;cin.get();cin.get();while(Choice); / 当 Choice 值为 0时, 结束循环SaveFile(); / 退出程序前,保存或更新当前用户的使用情况system(pause);return 0;/* 书上的主函数写法:int main(void)srand( time(NULL) ); / 初始化随机数种子Login(); / 打开文件,登记用户char strChoice20;dosystem(cls); / 系统执行命令:cls 为清屏cout 这是一个简单的复数计算器程序,可以实现以下功能,请按下对应的键(17)进入nnn;cout t=主菜单=n;cout t 1:多复数加法n;cout t 2:多复数减法n;cout t 3:测试 100以内的复数加减乘法运算,1次测试10道题n;cout t 4:多复数乘法n;cout t 5:复数自加n;cout t 6:复数自减n;cout t 7:复数比较n;cout t 0:退出计算器程序nn;cout strChoice;/ 下面用 if - else 语句实现多现选择,当然也可以用 switch - case 语句实现多项选择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 nt 欢迎下次继续使用复数计算器!nn;break;elsecout nt 输入错误,请按任意键后重新输入!n;cin.get();cin.get();while( (strcmp(strChoice, 0) );SaveFile(); / 退出程序前,保存或更新当前用户的使用情况system(pause);return 0;*/4 运行结果与分析5 总结1. 明确实验操作对象和目的。2. 针对目的和对象进行总体设计。3. 细化流程:书写程序,编译、运行并调试。4. 一开始错误的将复数的两个部分一起声明,在后来的编程过程中遇到了计算上的错误,于是将复数的实部和虚部分开声明,问题得到了解决5. 计算器还可扩充用户输入错误算式时提示用户的功能6. 计算器还可以扩充带有括号的功能(课程设计过程中出现的问题及其解决方案,可扩充的功能及设计等。)6 参考文献1李爱华,程磊著. 面向对象程序设计(C+语言) .北京:清华大学出版社,20102刘振安,刘燕君著. C+程序设计课程设计. 北京: 机械工业出版社,20043谭浩强著. C+程序设计实践指导. 北京:清华大学出版社,2005
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 中学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!