复数计算器课程设计_第1页
复数计算器课程设计_第2页
复数计算器课程设计_第3页
复数计算器课程设计_第4页
复数计算器课程设计_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目 录1 题目内容及设计要求12 总体设计12.1 总体功能框图12.2 类的设计说明12.3 主要算法流程图13程序清单及注释14运行结果与分析15总结26参考文献2请浏览后下载,资料供参考,期待您的好评与关注!1 题目内容及设计要求题目17 复数计算器内容及要求:(1)所设计的复数计算器可以进行+ - * += -= *= + - = = (istream &is,CComplex &com ); /重载输入friend ostream & operator(CComplex &com);int operator(CComplex &com);int operator!=(CComplex

2、 &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=rea

3、l*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 的定

4、义| -*/*- | 复数类 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 CC

5、omplex: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 已被赋值(通过下面的whlie

7、语句),表明当前读取的是虚部的符号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 + co

9、m.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)CComple

10、x 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 CCo

11、mplex: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 =

12、 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

14、;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;CCompl

15、ex 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 等于;brea

16、k;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.dlScor

17、euser.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.d

18、lScore2 = 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个复

19、数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 最少输入两个复数,输

20、入“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 乘

21、法计算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

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.ope

24、n(user.dat, ios:binary|ios:in); / 打开用户资料文件 (这个地方 若没有文件,则不会创建新文件,不知何问题if ( !infile ) / 若没有用户资料文件cout 没有原始记录文件, 您是第 1位用户!n;strcpy(user.szName, szName); / 为全局变量 user 中 szName 成员赋值user.nTime+;return; / 函数返回/ 读取用户资料文件(从该文件的第1个字节开始逐个读取信息)/ 如果用户资料中找到了当前姓名的用户,则说明是老用户,显示一些信息,并作一些使用次数的记录。infile.read( (char *)

25、&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

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|io

27、s: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); /

28、 文件指针退回到该用户资料信息的首位置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) ); / 将

29、当前用户的资料添加在用户资料文件中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

30、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()

31、; 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;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论