 
         
         
         
         
        版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、沈阳理工大学课程设计专用纸Noi目录1题目内容及设计要求.12总体设计 .12.1总体功能框图 .12.2类的设计说明 .12.3主要算法流程图. 23程序清单及注释 .44运行结果与分析 .215总结 .256参考文献 .25沈阳理工大学沈阳理工大学课程设计专用纸1 题目内容及设计要求No1题目 17复数计算器内容及要求:( 1)所设计的复数计算器可以进行+ - * += -= *= + - >= <= = !=运算符,其中>= <= 是针对复数的模进行运算。( 2)设计输入重载函数,要求能接收从键盘输入a+bi 形式的复数,在程序中可以识别出实部虚部并正确赋值。(3
2、) 设计计算器测试程序,对加减法进行测试,要求在两位数以内进行,对乘法进行测试,乘法要求为一位数的运算。(4) 设计记录功能,可以记录下不同用户使用计算器的情况,记录以文件的形式保存在计算机内,开机时要求用户输入用户名,显示该名户以前的记录。用户记录用包括:做了多少次加减法、乘法、进行测试的次数,后 3 次的测试平均分等,在退出计算器程序时用心的用户记录代替原有的记录。2 总体设计2.1 总体功能框图根据题中任务的功能,首先要搞清复数的运算法则,并使用 c+语言表达。复数包含实部与虚部,如何将这两部分表达出来也使关键定义一个复数类complex 。声明所需成员函数和友元函数对各运算符进行重载。
3、定义各成员函数。定义主函数,实现对整个程序的控制。编译、运行并调试2.2类的设计说明class CComplex/ 定义命名空间NameCComplexprivate:沈阳理工大学沈阳理工大学课程设计专用纸No2double Real,Image;public:CComplex(double real=0,double image =0)/ 构造函数Real=real;Image=image;friend istream & operator>>(istream &is,CComplex &com );/ 重载输入friend ostream & o
4、perator<<(ostream &os,CComplex &com);/ 重载输出CComplex operator+(CComplex &com);/ 加法重载CComplex operator-(CComplex &com);/ 减法重载CComplex operator*(CComplex &com);/ 乘法重载CComplex operator+=(CComplex &com);/ 加法赋值重载CComplex operator-=(CComplex &com);/ 减法赋值重载CComplex operator
5、*=(CComplex &com);/ 乘法赋值重载CComplex operator+();/ 自加CComplex operator-();/ 自减double mod (void);/ 求复数的模int operator>(CComplex &com);int operator<(CComplex &com);int operator!=(CComplex &com);int operator=(CComplex &com);2.3主要算法流程图沈阳理工大学沈阳理工大学课程设计专用纸No3开始声明一个complex 类,并定义 doub
6、le,real,image;声明类的函数,构造函数,加减乘除和取模运算c.real=real+c2.realc.real=real-c2.realc.real=(real*c2.real+imag*c2.imag)/a;c.imag=imag+c2.;c.imag=imag-c2.i;c.imag=(imag*c2.real-real*c2.imag)/imag;mag;ac.real=real*c2.real-imag*c2.imag; Sqrt(real*real=imag*imag); c.imag=real*c2.imag+imag*c2.real;输出 c1,c2,c1+c2,c1-
7、c2,c1*c2,c1/c2,c1的值终止。沈阳理工大学沈阳理工大学课程设计专用纸No4图 2 1算法流程图3 程序清单及注释#include <iostream>#include <cmath>#include <cstdlib>#include <cstring>#include <fstream>#include <ctime>/#define EPS len-5/ 定义精度常数using namespace std;namespace NameCComplex/定义命名空间NameCComplex/*-|部分 A:
8、|复数类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 & op
9、erator << (ostream & os, CComplex & com);/ 重载输出CComplex operator + (CComplex & com);/ 加法重载CComplex operator - (CComplex & com);/ 减法重载CComplex operator * (CComplex & com);/ 乘法重载沈阳理工大学沈阳理工大学课程设计专用纸No5CComplex operator += (CComplex & com);/ 加法赋值重载CComplex operator -= (CCom
10、plex & com);/ 减法赋值重载CComplex operator *= (CComplex & com);/ 乘法赋值重载CComplex operator + ();/自加CComplex operator - ();/ 自减double mod(void);int operator > (CComplex & com);int operator < (CComplex & com);int operator != (CComplex & com);int operator = (CComplex & com);/*-|结
11、构体类型用户 User 的定义-*/struct Userchar szName20;/用户名int nTime;/使用次数int nTest;/测试次数double dlA ve;/平均成绩int nAdd;/ 加法次数int nSub;/减法次数int nMul;/ 乘法次数double dlScore3;/ 3 次测试得分 user;/*-|复数类CComplex 的类外定义部分-*/ 重载运算符“ + ”,实部与虚部均加 1CComplex CComplex:operator + ()Real+;Image+;return *this;/ 重载运算符“ - ”,实部与虚部均减 1CCo
12、mplex CComplex:operator - ()Real-;沈阳理工大学沈阳理工大学课程设计专用纸No6Image-;return *this;/求复数的模,返回实部 2 + 虚部 2double CComplex:mod()return Real * Real + Image * Image;/ 重载运算符“ >”,比较模的大小int CComplex:operator > (CComplex & com)if ( mod() > com.mod() )return 1;/ 若大,则返回1elsereturn 0;/ 重载运算符“ <”,比较模的大小i
13、nt CComplex:operator < (CComplex & com)if ( mod() < com.mod() )return 1;/ 若小,则返回1elsereturn 0;/ 重载运算符“ != ”,分别判断复数的实部与虚部int CComplex:operator != (CComplex & com)if ( *this=com )return 0;elsereturn 1;/ 重载复数的输入, a+bi 的形式istream & operator >> (istream & is, CComplex & co
14、m)cout << " 输入复数: "char s80;is >> s;/ 用字符串的形式接收复数沈阳理工大学沈阳理工大学课程设计专用纸7Noint len = strlen(s);/ 求出字符串的长度int n = 0, sign = 1;/ 其中的 n 值 为当前从字符串中提取出的数字,会在下面的while语句中得到确定的值/ sign 为状态变量,表示数值的正负符号,以辅助辨认正负值com.Image = com.Real = 0;/ 判断接收的字符串是否合法for(int k=0; k<len; k+)if ( (sk<'
15、0' | sk>'9') && (sk!='+' && sk!='-' && sk!='i') )cout << "error" << endl;return is;/ 错误,输出出错信息并返回/ 顺序识别字符串中各字符for(int k=0; k<len;)if ( n!=0 && (sk='-' | sk='+') )/ 当前字符是否为符号位com.Real = sig
16、n * 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 )/ 判断
17、字符'i' 是否为字符串中最后一个字符cout << "errorn"/ 如果不是,说明复数数据格式错误elsecom.Image = sign * n;/ 是最后一个字符,复数对象已接收完,用sign*n为虚部赋值break;沈阳理工大学沈阳理工大学课程设计专用纸No8while ( sk>='0' && sk<='9' )/ 当前字符若在09 之间,则将数字字符转换成数字数值n = n * 10 + sk - '0'k+;if ( slen-1!='i'
18、; && 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 <<
19、 "i"/只输出虚部else if ( 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 & co
20、m)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;/ 乘积实部沈阳理工大学沈阳理工大学课程设计专用纸No9multi.Image = Real * com.Image + Image * com.Real;/乘积虚部retu
21、rn 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;/ 减法赋值重载CComple
22、x 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;Im
23、age = nImage;return *this;/重载 = 运算符,分别比较两个复数对象的实部和虚部int CComplex:operator = (CComplex & com)if ( Real=com.Real && Image=com.Image )沈阳理工大学沈阳理工大学课程设计专用纸No10return 1;/ 实部与虚部部分相等,则返回1elsereturn 0;/*-|部分 B:|测试函数 void Test(void)|实现复数的加法函数void Add()|实现复数的减法函数void Sub()|实现复数的乘法函数void Mul()|实现复数的
24、自加函数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
25、 和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
26、()%20 - 10; / 产生的随机数是一位数,可以是正数或负数 image3 = rand()%20 - 10;real4 = rand()%20 - 10;沈阳理工大学沈阳理工大学课程设计专用纸No11image4 = rand()%20 - 10;CComplex c(real3, image3), d(real4, image4);op = rand()%3;/ 随机产生3 种运算符switch(op)case 0:answer = a + b;cout << a << " 加上 " << b << " 等
27、于 "break;case 1:answer = a - b;cout << a << " 减去 " << b << " 等于 "break;case 2:/ 乘法运算,用实部和虚部都是1 位数的对象操作answer = c * d;cout << c << " 乘以 " << d << " 等于 "break;cin >> temp;/ 接收用户输入的结果if ( answer=temp )sco
28、re+=10;/ 正确则加10 分elsecout << " 此题做错了 n"cout << " 正确答案为:" << answer << endl;cout << " 你的最后得分是:" << score << endl;/ 计算最后 3 次的平均分if ( user.nTest<=3 )/ 若累计次数没有超过3 次user.dlAve = 0;user.dlScoreuser.nTest-1 = score;/ 将本次测试成绩添加进记录中fo
29、r(int i=0; i<user.nTest; i+)user.dlAve +=user.dlScorei;/ 若以前有记录,将其与本次记录累计相加起来,用以计算平均分user.dlAve = user.dlAve / user.nTest;/ 计算平均分, user.dlAve 从累计的分数变成了平均分else/ 如果累计测试超过3 次沈阳理工大学沈阳理工大学课程设计专用纸No12user.dlScore0 = user.dlScore1;/ 最前面的一次记录将被覆盖,即:删除user.dlScore1 = user.dlScore2;user.dlScore2 = score;/
30、将本次记录添加进测试记录的尾部user.dlAve=0;for(int i=0; i<3; 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" <<
31、" 最少输入两个复数,输入“0”结束 n"cout << " 第 1个复数: "cin >> num1;/ 输入第1个复数cout << " 第 2个复数: "cin >> num2;/ 输入第2个复数sum = num1 + num2;cout << " 第 3个复数: "cin >> num1;/ 输入第3个复数int i = 4;while ( !(num1=Zero) )sum = sum + num1;/ 实现复数相加cout <
32、;< " 第 " << i << " 个复数: "cin >> num1;/ 输入第 i 个复数i+;cout << " 结果是: " << sum << endl;cout << " 按任意键继续n"cout.flush();cin.get();cin.get();沈阳理工大学沈阳理工大学课程设计专用纸No13/ 实现复数的减法void Sub()user.nSub+;CComplex num1, num2, sub, Ze
33、ro(0, 0);cout << " 减法计算 n" << " 最少输入两个复数,输入“0”结束 n"cout << " 第 1个复数: "cin >> num1;/ 输入第1个复数cout << " 第 2个复数: "cin >> num2;/ 输入第2个复数sub = num1 - num2;cout << " 第 3个复数: "cin >> num1;/ 输入第3个复数int i = 4;whi
34、le ( !(num1=Zero) )sub = sub - num1;/ 实现复数减法cout << " 第 " << i << " 个复数: "cin >> num1;/ 输入第 i 个复数i+;cout << " 结果是: " << sub << endl;cout << " 按任意键继续n"cin.get();cin.get();/ 实现复数的乘法void Mul()user.nMul+;CComplex num
35、1, num2, mul, Zero(0, 0);cout << " 乘法计算 n" << " 最少输入两个复数,输入“0”结束 n"cout << " 第 1个复数: "cin >> num1;/ 输入第1个复数cout << " 第 2个复数: "cin >> num2;/ 输入第2个复数mul = num1 + num2;cout << " 第 3个复数: "cin >> num1;/ 输入第3
36、个复数int i = 4;while ( !(num1=Zero) )沈阳理工大学沈阳理工大学课程设计专用纸No14mul *= num1;/ 实现复数的减法cout << " 第 " << i << " 个复数: "i+;cin >> num1;/ 输入第i 个复数cout << " 结果是: " << mul << endl;cout << " 按任意键继续n"cin.get();cin.get();/实现复数的自加
37、,实部与虚部均自加1void Add1()user.nAdd+;/ 用户加法记录次数加1CComplex num1;cin >> num1;/ 这里输入的数可能是虚部为0 的数,原书代码未作判断num1+;/ 实部与虚部分别加1cout << " 自加结果为 " << num1 << endl;cout << " 按任意键继续n"cout.flush();cin.get();cin.get();/实现复数的自减void Sub1()user.nSub+;/ 用户减法记录次数加1CComplex
38、num1;cin >> num1;num1-;cout << " 自减结果为 " << num1 << endl;cout << " 按任意键继续n"cout.flush();cin.get();cin.get();/ 比较两个复数的大小 void Compare()CComplex num1, num2;沈阳理工大学沈阳理工大学课程设计专用纸No15cout << " 输入两个复数n"cout << " 第 1 个复数: "cin
39、 >> num1;cout << " 第 2 个复数: "cin >> num2;if ( num1=num2 )cout << "这两个复数相等n"else if ( num1>num2 )cout << num1 << " 的模大于 " << num2 << " 的模 n"else if ( num1<num2 )cout << num2 << " 的模大于 "
40、 << num1 << " 的模 n"elsecout << " 这两个复数的模相等n"cout << " 按任意键继续n"cin.get();cin.get();/ 输出本次用户使用计算器的情况记录void userprint()cout << user.szName << " 使用的次数为:" << user.nTime << " 次" << endl;cout << &q
41、uot; 其中: t 加法次数: " << user.nAdd << " 次 n"<< "t 减法次数: " << user.nSub << " 次 n"<< "t 乘法次数: " << user.nMul << " 次 n"<< "t 测试次数: " << user.nTest << " 次 n"<<
42、"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 ( !
43、infile )/ 若没有用户资料文件cout << " 没有原始记录文件,您是第1 位用户! n"沈阳理工大学沈阳理工大学课程设计专用纸No16strcpy(user.szName, szName);/ 为全局变量user 中 szName 成员赋值user.nTime+;return;/ 函数返回/ 读取用户资料文件(从该文件的第1 个字节开始逐个读取信息)/ 如果用户资料中找到了当前姓名的用户,则说明是老用户,显示一些信息,并作一些使用次数的记录。infile.read( (char *)&user1, sizeof(User) );while (
44、 !infile.eof() )/只要没到文件末尾(未遇文件结束符),则一直进行此循环if ( strcmp(user.szName, szName)=0)/ 将用户资料文件中的用户名与读取的用户名进行比较user = user1;/ 若该用户以前使用计算器,将原资料赋值给全局变量useruser.nTime+;/ 用户使用次数加1cout << " 欢迎您再次使用复数计算器!"userprint();/ 输出用户资料中的信息cin.get();infile.close();return;infile.read( (char *)&user1, size
45、of(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",
46、 ios:binary|ios:in|ios:out);/ 打开用户资料if (!file)cout << " 文件打开错误,不能将记录更新n"沈阳理工大学沈阳理工大学课程设计专用纸No17return;file.seekg(0, ios:beg);/ 文件指针指向文件头while( !file.eof() )file.read( (char *)&user1, sizeof(User) );/逐个读取用户资料文件中的用户信息/ 将用户资料文件中的用户名依次与当前用户名进行比较if ( strcmp(user1.szName, user.szName)=
47、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;/ 使用标准命名空间NameCCompl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 入院评估与安全监测体系建设
- 水利工程施工技术考核试题汇编
- 医疗机构感染控制方案及监测报告
- 中学规范办学实施方案与案例分析
- 风电场冬季防寒保养重点措施
- 次氯酸钠投加系统设计及运行维护方案
- 函数的奇偶性专业方案教案(2025-2026学年)
- 黑河高铝聚轻砖施工方案
- 柬埔寨火锅营销方案
- 晚餐场景营销方案
- 赌场管理制度
- 美团客服接待流程
- 本科大课骨折概论()精简课件
- 《医疗机构质量管理培训》课件
- DB33/T 1134-2017 静钻根植桩基础技术规程
- 中国高血压防治指南(2024年修订版)
- 【MOOC】航空航天材料概论-南京航空航天大学 中国大学慕课MOOC答案
- 外研版九年级英语上册单元模块满分必刷题 Module 7【刷速度】(模块过关检测练)同步练习(含答案)
- 消控室用工合同范例
- 工程管理服务合同模板范本
- ASTM-D3359-(附著力测试标准)-中文版
 
            
评论
0/150
提交评论