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

下载本文档

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

文档简介

1、1 题目容及设计要求 12总体设计2.1总体功能框图 错误!未定义书签2.2 类的设计说明 12.3 主要算法流程图 23程序清单及注释 44运行结果与分析 215总结256参考文献251题目容及设计要求题目17复数计算器容及要求:(1) 所设计的复数计算器可以进行+ - * += -= *= + - >= <= = !=运算符,其中>= <=是针对复数的模进行运算。(2) 设计输入重载函数,要求能接收从键盘输入a+bi形式的复数,在程序中可以识别 出实部虚部并正确赋值。(3) 设计计算器测试程序,对加减法进行测试,要求在两位数以进行,对乘法进行测 试,乘法要求为一位数

2、的运算。(4) 设计记录功能,可以记录下不同用户使用计算器的情况,记录以文件的形式保存在:计算机,开机时要求用户输入用户名,显示该名户以前的记录。用户记录用包括:做了多少次加减法、乘法、进行测试的次数,后3次的测试平均分等,在退出计算器程序时用心的1用户记录代替原有的记录。2总体设计2.1总体功能框图根据题中任务的功能,首先要搞清复数的运算法则,并使用C+语言表达。复数包含实部与虚部,如何将这两部分表达出来也使关键 定义一个复数类 complex。声明所需成员函数和友元函数对各运算符进行重载。定义各成员函数。定义主函数,实现对整个程序的控制。编译、运行并调试定义命名空间 NameCComple

3、x2.2类的设计说明class CComplex / private:double Real,lmage;public:CComplex(double real=0,double image =0)/Real=real;Image=image;frie nd istream & operator»(istream & is,CComplex & ); / friend ostream & operator<<(ostream &os,CComplex &);/CComplex operator+(CComplex &

4、);/CComplex operator-(CComplex &);/CComplex operator*(CComplex &);/CComplex operator+=(CComplex &);/CComplex operator-=(CComplex &);/CComplex operator*=(CComplex &);/CComplex operator+();/CComplex operator-。;/double mod (void);/int operator>(CComplex &);int operator<(CC

5、omplex &);int operator!=(CComplex &);int operator=(CComplex &);构造函数重载输入 重载输出 加法重载 减法重载 乘法重载 加法赋值重载 减法赋值重载 乘法赋值重载 自加 自减 求复数的模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.i mag;Sqrt(real*r

6、eal=imag*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.re al;o o o o o o图2- 1算法流程图3程序清单及注释#in elude <iostream>#in elude <cmath>#in elude <estdlib>#in elude <estri ng>#in elude <f

7、stream>定义精度常数#in elude <etime>/#defi ne EPS len-5 / using n amespaee std;n amespaee NameCComplex / 定义命名空间 NameCComplex/*|部分A:|复数类CComplex的声明和定义,以及结构体类型用户User的定义I*/*|复数类CComplex的声明*/elass CComplexprivate:double Real, Image; /分别为复数的实部和虚部publie:CComplex(double real=0, double image=0) /构造函数Real

8、 = real; Image = image;重载输入 重载输出 加法重载 减法重载 乘法重载 加法赋值重载 减法赋值重载friend istream & operator >> (istream & is, CComplex & );/friend ostream & operator << (ostream & os, CComplex & );/CComplex operator + (CComplex & );/CComplex operator - (CComplex & );/CComplex

9、operator * (CComplex & );/CComplex operator += (CComplex & );/CComplex operator -= (CComplex & );/乘法赋值重载自加自减CComplex operator *= (CComplex & );CComplex operator + ();/CComplex operator - ();/double mod(void);int operator > (CComplex & );int operator < (CComplex & );int

10、operator != (CComplex & );int operator = (CComplex & );/*结构体类型用户User的疋义-*/struct Userchar szName20;/用户名int n Time;/使用次数int n Test;/测试次数double dlAve;/平均成绩int nAdd;/加法次数int nSub;/减法次数int nMul;/乘法次数double dlScore3;/ 3次测试得分 user;/*|复数类CComplex的类外定义部分*/重载运算符“ +”,实部与虚部均加1CComplex CComplex:operator

11、 + () Real+;Image+; return *this; /重载运算符“-”,实部与虚部均减1CComplex CComplex:operator -() Real-;Image-; return *this;/求复数的模,返回实部A2 +虚部A2double CComplex:mod()return Real * Real + Image * Image;/重载运算符“ >”,比较模的大小int CComplex:operator > (CComplex & )if ( mod() > .mod()return 1;/若大,则返回 1elsereturn

12、0;/重载运算符“ <”,比较模的大小int CComplex:operator < (CComplex & )if ( mod() < .mod()return 1;/若小,则返回 1elsereturn 0; /重载运算符“ != ”,分别判断复数的实部与虚部int CComplex:operator != (CComplex & )if ( *this=)return 0;elsereturn 1; /重载复数的输入,a+bi的形式cout << "输入复数:” char s80;is >> s;/int len = s

13、trle n( s);/int n = 0, sig n = 1;/while语句中得到确定的值/istream & operator >> (istream & is, CComplex & )用字符串的形式接收复数求出字符串的长度其中的n值 为当前从字符串中提取出的数字,会在下面的sig n为状态变量,表示数值的正负符号,以辅助辨认正负值m age = .Real = 0;/判断接收的字符串是否合法for(int k=0; k<len; k+)if ( (sk<'0' | sk>'9') &&am

14、p; (sk!='+' && sk!='-' && sk!='i') cout << "error" << en dl;return is; /错误,输出出错信息并返回/顺序识别字符串中各字符for(int k=0; k<le n;)if ( n!=0 && (sk='-' | sk='+') ) /当前字符是否为符号位.Real = sig n * n;/过下面的whlie语句),表明当前读取的是虚部的符号n = 0

15、;/是符号位,且n !=0,即n已被赋值(通将原n*sign值(带正负号的数值)赋给实部后,将n清零,准备下一次继续接收并判断是否为虚部的值if ( sk='-')/sig n :=-1;:k+;/if ( sk='+')/sig n :=1;k+;/if ( sk='i')/if ( k!=le n-1 )/cout << "error、n"/elsem age = sig n * n; / 虚部赋值break;while ( sk>='0' && sk<='9

16、')字字符转换成数字数值当前字符若为负号给符号标志变量sig n赋值,表示为负数当前字符若为正号给符号标志变量sig n赋值,表示为正数若当前字符为“ i ”判断字符'i'是否为字符串中最后一个字符如果不是,说明复数数据格式错误是最后一个字符,复数对象已接收完,用sig n*n为/当前字符若在09之间,则将数n = n * 10 + sk - 'O' k+;if ( sle n-1!='i' && n!=0 )/部,没有虚部,如:-a.Real = n * sig n;return is;如果最后一个字符不是'i&

17、#39;,表示复数对象只有实/重载复数的输出ostream & operator << (ostream & os, CComplex & )if ( fabs(.lmage)=O )/os << .Real;/else if ( fabs(.Real)=0 )/os <<m age << "i"/else if ( .Im age>0 )如果虚部为0只输出实部如果实部为0只输出虚部os << .Real << "+" << .Image &

18、lt;< "i" / elseos << .Real <<mage << "i"/而不是3 + -6ireturn os;虚部为正如实部为3,虚部为-6i ,就变为3 - 6i,/加法重载CComplex CComplex:operator + (CComplex & )CComplex sum;sum.Real = Real + .Real; /实部相加sum.lm age = Image +m age; /虚部相力口return sum;/乘法重载CComplex CComplex:operator

19、* (CComplex & )CComplex multi;multi.Real = Real * .Real - Image *m age; / multi.lmage = Real *m age + Image * .Real; / return multi;乘积实部乘积虚部/减法重载CComplex CComplex:operator - (CComplex & )CComplex sub;实部相减虚部相减sub.Real = Real - .Real; / sub .Im age = Image - .Im age;/retur n sub; /加法赋值重载CCompl

20、ex CComplex:operator += (CComplex & ) Real = Real + .Real; /实部Image = Image +m age; /虚部return *this; /减法赋值重载CComplex CComplex:operator -= (CComplex & ) Real = Real - .Real; /实部Image = Image - .Im age; /虚部return *this; /乘法赋值重载CComplex CComplex:operator *= (CComplex & )乘积实部乘积虚部double n Rea

21、l = Real * .Real - Image *m age; / double nl mage = Real *m age - Image * .Real; / Real = n Real;Image = nl mage;return *this; /重载=运算符,分别比较两个复数对象的实部和虚部int CComplex:operator = (CComplex & )if ( Real=.Real && lmage=.Im age )return 1;/实部与虚部部分相等,则返回elsereturn 0;|部分B:|测试函数 void Test(void)|实现复

22、数的加法函数voidAdd()|实现复数的减法函数voidSub()|实现复数的乘法函数voidMul()|实现复数的自加函数voidAdd1()|比较两个复数的大小函数void Compare。|输出本次用户使用计算器的情况记录void userpri nt()|当前用户使用完计算器,保存或更新用户资料函数void SaveFile()I*/ /测试函数,随机出10道运算题,可以打分void Test(void)user. nTest+; /用户测试次数加 1cout << "共10道题,作10以的加减运算,满分100分:n"double real1, rea

23、l2, image1, image2, real3, real4, image3, image4; / 1禾口 2 分别代表两个待相加的复数的实部和虚部,3和4则为相乘CComplex an swer, temp;int score = 0;char op;for(i nt i=0; i<=9; i+)real1 = ran d()%200 - 100; /产生的随机数是两位数,可以是正数或负数image1 = ran d()%200 - 100;real2 = ran d()%200 - 100;image2 = ran d()%200 - 100;CComplex a(real1,

24、image1), b(real2, image2); /用产生的随机数对象分别初始化两个复数对象real3 = ran d()%20 - 10;II产生的随机数是一位数,可以是正数或负数image3 = ran d()%20 - 10;real4 = ran d()%20 - 10;image4 = ran d()%20 - 10;CComplex c(real3, image3), d(real4, image4);op = rand()%3;II随机产生3种运算符switch(op)case 0:an swer = a + b;cout << a << "

25、加上"<< b << "等于”; break;case 1:an swer = a - b;cout << a << "减去"<< b << "等于" break;case 2: /乘法运算,用实部和虚部都是1位数的对象操作an swer = c * d;cout << c << " 乘以"<< d << " 等于" break;cin >> temp; II接收用

26、户输入的结果if ( answer=temp ) score+=10; II正确则加 10 分elsecout << " 此题做错了 n"cout << " 正确答案为:"<< an swer << en dl;cout << " 你的最后得分是:"<< score << endl;II计算最后3次的平均分若累计次数没有超过 3次if ( user. nTest<=3 ) IIuser.dlAve = 0;user.dlScoreuser. nT

27、est-1 = score;IIfor(i nt i=0; i<user. nTest; i+)user.dlAve += user.dlScorei; II 加起来,用以计算平均分user.dlAve = user.dlAve I user. nTest; II数变成了平均分else II如果累计测试超过 3次user.dlScore0 = user.dlScore1; IIuser.dlScore1 = user.dlScore2;user.dlScore2 = score;II将本次测试成绩添加进记录中若以前有记录,将其与本次记录累计相计算平均分,user.dlAve 从累计的分最

28、前面的一次记录将被覆盖,即:删除将本次记录添加进测试记录的尾部user.dlAve=O;计算最新3次的平均分for(i nt i=0; i<3; i+) IIuser.dlAve += user.dlScorei;user.dlAve = user.dlAve I 3;0”结束n"0”结束n"cout << "按任意键继续n"cout .flush();cin .get();cin .get();/实现复数的加法void Add()user. nAdd+;CComplex nu ml, nu m2, sum, Zero(0, 0);co

29、ut << "加法计算n" << "最少输入两个复数,输入"cout << " 第1个复数:"cin >> nu m1;/输入第1个复数cout << "第2个复数:"5cin >> nu m2;/输入第2个复数sum = num1 + nu m2;cout << "第3个复数:"5cin >> nu m1;/输入第3个复数int i = 4;while ( !(nu m1=Zero)sum = su

30、m + num1; /实现复数相加cout << "第"<< i << "个复数:"cin >> num1;/输入第i个复数i+;cout << " 结果是:"<< sum << en dl;cout << "按任意键继续n"cout.flush();cin .get();cin .get();/实现复数的减法void Sub()user. nSub+;CComplex nu m1, nu m2, sub, Zero(0

31、, 0);cout << "减法计算n" << "最少输入两个复数,输入" cout << " 第1个复数:"cin >> num1;/输入第1个复数cout << " 第2个复数:"cin >> num2;/输入第2个复数输入第3个复数sub = numl - nu m2; cout << " 第3个复数:" cin >> nu ml;/int i = 4;while ( !(nu m1=Zero)

32、sub = sub - nu m1;/cout << "第"<< i << "cin >> nu ml;i+;/实现复数减法个复数:"输入第i个复数cout << " 结果是:"<< sub << en dl; cout << "按任意键继续n"cin .get();cin .get();/实现复数的乘法void Mul()user. nM ul+;CComplex numl, num2, mul, Zero(0, 0)

33、;cout << "乘法计算n" << "最少输入两个复数, cout << "第1个复数:输入“0”结束n"II.cin >> nu ml;/cout << "第2个复数: cin >> nu m2;/输入第个复数II.输入第个复数mul = num1 + nu m2; cout << "第3个复数: cin >> nu m1;/int i = 4;while ( !(nu m1=Zero) II.输入第个复数mul *= nu

34、 ml; / cout << "第"<< i << "实现复数的减法个复数:"i+;cin >> nu m1;/输入第i个复数cout << " 结果是:"<< mul << en dl; cout << "按任意键继续n"cin .get();cin .get();/实现复数的自加,实部与虚部均自加1void Add1()user. nAdd+;/用户加法记录次数加 1CComplex nu m1;cin >&g

35、t; nu m1;/这里输入的数可能是虚部为0的数,原书代码未作判断nu m1+;/实部与虚部分别加1cout << " 自加结果为"<< numl << endl;cout << "按任意键继续n"cout.flush();cin .get();cin .get();/实现复数的自减void Sub1()user. nSub+;/用户减法记录次数加1CComplex nu m1;cin >> nu m1;nu m1-;cout << " 自减结果为"<&l

36、t; num1 << endl;cout << "按任意键继续n"cout.flush();cin .get();cin .get();/比较两个复数的大小void Compare。CComplex nu m1, nu m2;cout << "输入两个复数n"cout << " 第1个复数:"cin >> nu m1;cout << " 第2个复数:"cin >> nu m2;if ( nu m仁=num2 )cout <&l

37、t; "这两个复数相等n"else if ( nu m1> num2 )cout << num1 << "的模大于"<< num2 << " 的模 n"else if ( nu m1< num2 )cout << num2 << "的模大于"<< num1 << " 的模 n"elsecout << "这两个复数的模相等n" cout << &q

38、uot;按任意键继续n"cin .get();cin .get(); /输出本次用户使用计算器的情况记录void userpri nt()cout << user.szName << " 使用的次数为:"<< user. nTime << "次"<< endl;cout << " 其中:t 加法次数:"<< user.nAdd << " 次n"<< "t减法次数:"<<

39、; user. nSub << "次n"<< "t乘法次数:"<< user. nMul << "次n"<< "t测试次数:"<< user. nTest << "次n"<< "t平均成绩:"<< user.dlAve << "次"<< endl;/用户登陆,开始启动计算器void Logi n()char szName20;

40、cout << " 请输入您的:” cin.getline(szName, 20); ifstream in file;User user1;打开用户资料文件(这个in file.ope n("user.dat", ios:b in ary|ios:i n);/地方 若没有文件,则不会创建新文件,不知何问题if ( !infile )/若没有用户资料文件cout << "没有原始记录文件,您是第1位用户! n"strcpy(user.szName, szName); /为全局变量 user 中 szName 成员赋值us

41、er. nTime+;return;/函数返回/读取用户资料文件(从该文件的第1个字节开始逐个读取信息)/如果用户资料中找到了当前的用户,则说明是老用户,显示一些信息,并作一些使用次数的记录。in file.read( (char *)&user1, sizeof(User);while ( !infile.eof()/只要没到文件末尾(未遇文件结束符),则一直进行此循环if ( strcmp(user.szName, szName)=0 )/将用户资料文件中的用户名与读取的用户名进行比较user = userl; /若该用户以前使用计算器,将原资料赋值给全局变量 useruser.

42、nTime+; /用户使用次数加1cout << "欢迎您再次使用复数计算器!"userpri nt();/输出用户资料中的信息ci n. get();in file.close();return;in file.read( (char *)&userl, sizeof(User); /如果用户资料中没有当前用户,表明该用户是第 1次使用计算器 cout << "欢迎您使用复数计算器!strcpy(user.szName, szName); / user. nTime+;/in file.close();为全局变量 user用户使用

43、次数加1中szName成员赋值return;/当前用户使用完计算器后,保存或更新用户资料void SaveFile()userpri nt();/输出当前用户使用计算器的详细信息fstream file;User user1;file.ope n("user.dat", ios:b in ary|ios:i n|ios:out);/if (!file)cout << "文件打开错误,不能将记录更新n"return;file.seekg(0, ios:beg); /文件指针指向文件头while( !file.eof()file.read( (c

44、har *)&user1, sizeof(User) );/用户信息打开用户资料逐个读取用户资料文件中的用户信息的首位置/将用户资料文件中的用户名依次与当前用户名进行比较if ( strcmp(user1.szName, user.szName)=0 )/file.seekp(-(sizeof(User), ios:cur); /若在用户资料文件中找到该文件指针退回到该用户资料将全局变量user的容写到file.write( (char *)&user, sizeof(User) );/用户资料文件中,即更新该用户的资料file.close();程序返回return; / fi

45、le.close();fstream outfile;1次使用计算器以添加的方式打开用户资料/若在用户资料文件中找不到当前用户的资料,表明当前用户是第outfile.ope n("user.dat", ios:b in ary|ios:app);/文件将当前用户的资料添加在用户outfile.write( (char *)&user, sizeof(User) );/资料文件中outfile.close();return;using n amespace NameCComplex;/使用标准命名空间NameCComplex/*|主函数部分*/int mai n(vo

46、id)srand( time(NULL);Logi n();/int Choice;do/初始化随机数种子 打开文件,登记用户system("cls");cout << "这是进入 nnn"/-个简单的复数计算器程序,可以实现以下功能,请按下对应的键(系统执行命令:cls为清屏cout<<"t:cout << "t 1cout << "t 2cout << "t 3:=n"多复数加法n"多复数减法n"测试100以的复数加减乘法

47、运算,1次测试10道题n"cout <<"t4:多复数乘法n"cout <<"t5:复数自加 n"cout <<"t6:复数自减 n"cout <<"t7:复数比较 n"cout <<"t0:退出计算器程序nn"cout << "t请输入您的选择:"cin >> Choice;语句实现多项选择/下面用switch - case语句实现多现选择,当然也可以用if - elseswitc

48、h(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:case 0:cout << "nt break;default:cout << "nt cin .get();cin .get();while(Choice); /Compare(); break;欢迎下次继续使用复数计算器!nn"输入错误,请按任意键后重新输入!n

49、"当Choice 值为0时, 结束循环SaveFile(); /退出程序前,保存或更新当前用户的使用情况system("pause"); return 0;int mai n(void)初始化随机数种子 打开文件,登记用户srand( time(NULL) );/Logi n();/char strChoice20;dosystem("cls"); II系统执行命令:cls为清屏cout << "这是一个简单的复数计算器程序,可以实现以下功能,请按下对应的键(17)进入 nnn"cout<<%=主菜单

50、=n";cout << "t1:多复数加法n"cout << "t2:多复数减法n"cout << "t3:测试100以的复数加减乘法运算, 1次测试10道题n"cout << "t4:多复数乘法n"cout << "t5:复数自加 n"cout << "t6:复数自减 n"cout << "t7:复数比较 n"cout << "t0:退出计

51、算器程序nn"cout << "t请输入您的选择:"cin >> strChoice;II下面用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,

52、"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 << &

53、quot;nt输入错误,请按任意键后重新输入!n"cin .get();cin .get();while( (strcmp(strChoice, "0");SaveFile(); II退出程序前,保存或更新当前用户的使用情况system("pause");return 0;*/4运行结果与分析c c "C;ProErai Files Micros oft Visual Studi 叭亦WqD&tni叭q ex gX这是一个简单的复数计算器程序,可以实现以卜用能.请按下对应的锥1刀进人Mui主- V 去去以去 加關00解加减较算数数1数自臭计 复盡复数数数岀123-5670请输入您的选择;cC

温馨提示

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

评论

0/150

提交评论