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

下载本文档

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

文档简介

1、C+课程设计实验报告姓名 学号 班级 合作者 学号 班级 任课教师 时间 教师指定题目 复数计算器 评定难易级别 A级 实验报告成绩 复数计算器程序功能设计1 程序功能的总体结构复数计算器的程序总体功能可设计成如图所示,可以看出,复数计算器的各种功能都用菜单选项列出,用户可以根据需要选择相应的菜单项,从而执行不同的子程序以完成相应的功能。2课程设计要求(1) 一开始运行程序,要有详细的菜单选项界面,用户不选择退出就可以反复运算。(2) 可以进行多个操作数的复数运算,输入00i时为止。(3) 编写可以对输入的复数求模的成员函数。(4) 编写具有测试功能的函数,即计算机能够自动出题,并要求用户计算

2、,同时计算机判断用户计算的对错并打分,要求十题为一个单元,每题一个运算符,运算符包括,三种,参与加减运算实部虚部为一位数。(5) 重载输入输出运算符,对复数的输入既可采用实部虚部分开提示输入,也可直接输入诸如或这种形式,对复数的输出要考虑实部虚部的正负号,通过判断给出的输出结果。开始输出菜单及提示信息输入选择是否做加法 N是否做减法 N Y是否进行测试 N加法子程序Add() Y . . . . . . 减法子程序 Y测试子程序是否退出 N Y结束 2 程序设计思想1)类的封装程序中将复数形式的数据定义成一个复数类CComplex,重载了加法及减法等运算符,使函数的加减等运算像一般数据一样方便

3、.每个运算符重载都用一个函数去实现。参考类的定义如下: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<<(ostream&os,CComplex&com); /重载输出CComplex o

4、perator+(CComplex&com); CComplex operator-(CComplex&com); /减法重载CComplex operator*(CComplex&com); /乘法重载CComplex operator/(CComplex&com); /除法重载 int operator=(CComplex&com); int operator!=(CComplex&com); int operator>(CComplex&com);int operator<(CComplex&com); floa

5、t Module(void); /复数求模;(2)设计的任务要求1在实际应用中,输入复数可能为a+bi, a, bi, -a, -bi, +i. i. I等形式。重载输入运算符应该能识别这样形式多样的复数。所以在重载输入函数时要综合考虑上述各种输入形式。可行的处理方式是:在重载输入函数中,设计用(3)设计的任务要求2在程序中设计一个复数运算的测试函数Test(),其功能是让计算机随机出10道运算题,用户给出答案,同时计算机实时判断对错并可以打分。这个函数的关键是让计算机随机产生复数对象和运算符,计算机内部有一个随机数发生器,可以产生一个固定顺序的整型随机数序列,调用语句为“int a = ra

6、nd();”这时,a就是该随机数发生器产生的随机数。由于产生的随机书数在整数范围内,为测试方便,按程序设计要求,产生的随机复数对象实部和虚部在100以内,运算符只有加减两种。因此,需要对产生的随机数进行进一步的处理,用随机数模除以除以100,产生出100以内的随机整数;同样,用随机数模除以3,可以产生出0、 1、3三个随机数据,定义0为加法,1为减法,2为乘法,这样就可以产生出随机的复数对象的加减乘运算了。可以参见图2测试子程序Test()结构框图。设置循环次数为10用两个随机数初始复数对象3产生8个100以内的随机数随机数最后两个随机数初始复数对象4前两个随机数初始复数对象1用户输入结果两对

7、象相乘后两个随机数初始复数对象2结果是否正确产生2以内的随机数op N Y总分加10Op为0两对象相减两对象相加用户输入结果用户输入结果结果是否正确结果是否正确 N N输出出错信息输出出错信息输出出错信息 Y Y总分加10总分加10 输出总分结束(4)设计的任务要求3在程序中重载了>>运算符,其功能是让用户能够直接输入a+bi,a+b*i两种形式的复数,其结构框图如图3所示。 以字符串的形式接受复数对象求字符串长度初试化当前数值n=0,字符变量 sign=1字符串是否存在非法字符 Y输出错误信息,函数返回是否判别完字符串中所有字符 N Y最后一个字符不是i且n!=0当前字符为+、号

8、,同时n!=0 N复数对象只有实部,前面取出的数值赋给实部 N前面取出的数值赋给实部,n=0 N结束当前字符是否是+ NSign=1,k+当前字符是否是 NSign=1,k+当前字符是否是为i i是否是最后一个字符 N YYN输出错误信息,函数返回 当前字符是否是数字字符NN将字符转变为数值NY3 程序界面开始界面运行结果界面4程序源代码及详细注解:# include<iostream.h># include<math.h># include<stdlib.h># include<string.h>#define Z 1e-6class CCom

9、plexprivate: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<<(ostream&os,CComplex&com); /重载输出CComplex operator+(CComplex&com); CComplex

10、operator-(CComplex&com); /减法重载CComplex operator*(CComplex&com); /乘法重载CComplex operator/(CComplex&com); /除法重载 int operator=(CComplex&com); int operator!=(CComplex&com); int operator>(CComplex&com);int operator<(CComplex&com); float Module(void); /复数求模;CComplex CCompl

11、ex:operator +(CComplex&com) /加法重载CComplex t; /定义类对象t.Real=Real+com.Real; /实部相加t.Image=Image+com.Image; /虚部相加return t;CComplex CComplex:operator -(CComplex&com) /减法重载CComplex t; /定义类对象t.Real=Real-com.Real; /实部相减t.Image=Image-com.Image; /虚部相减return t;CComplex CComplex:operator*(CComplex&co

12、m) /乘法重载CComplex t; /定义类对象t.Real=Real*com.Real-com.Image*Image; /乘法实部t.Image=Real*com.Image+Image*com.Real; /乘法虚部return t;CComplex CComplex:operator/(CComplex &com) /除法重载CComplex t; /定义类对象t.Real=(Real*com.Real+Image*com.Image)/(com.Real*com.Real+com.Image*com.Image);/除法实部t.Image=(Image*com.Real-

13、Real*com.Image)/(com.Real*com.Real+com.Image*com.Image);/除法虚部return t;/*int CComplex: operator!=(CComplex&com) /重载“!=”运算符,分别判断复数的实部与虚部if(*this=com)return 0;else return 1;*/int CComplex: operator>(CComplex&com) /重载“>”运算符,比较复数的模if(Module()>com.Module()return 1; /大于,则返回1else return 0;i

14、nt CComplex: operator<(CComplex&com) /重载“<”运算符,比较复数的模if(Module()<com.Module()return 1; /小于,则返回1else return 0;float CComplex:Module()float t;t=sqrt(Real*Real+Image*Image);return t;/cin.get();/cin.get();int CComplex:operator=(CComplex&com) /重载“=”运算符,分别判断两个复数对象的实部与虚部if(Real=com.Real&am

15、p;&Image=com.Image)return 1; /实部与虚部分别相等返回1else return 0;void Add()CComplex a1,a2,sum,f(0,0);cout<<"加法计算"<<endl<<"最少输入两个复数,并以零结束"<<endl;cout<<"第一个复数"<<endl;cin>>a1;cout<<"第二个复数"<<endl;cin>>a2;sum=a

16、1+a2;cout<<"第三个复数"<<endl;cin>>a1;int i=4;while(!(a1=f) sum=sum+a1; cout<<"第"<<i<<"个复数"<<endl; cin>>a1;i+;cout<<"结果"<<sum<<endl;cout<<"按任意键继续"<<endl;/cout.flush();cin.get();

17、void Sub()CComplex a1,a2,sub,f(0,0);cout<<"减法计算"<<endl<<"最少输入两个复数,并以零结束"<<endl;cout<<"第一个复数"<<endl;cin>>a1;cout<<"第二个复数"<<endl;cin>>a2;sub=a1-a2;cout<<"第三个复数"<<endl;cin>>a1

18、;int i=4;while(!(a1=f) sub=sub-a1; cout<<"第"<<i<<"个复数"<<endl; cin>>a1;i+;cout<<"结果:"<<sub<<endl;cout<<"按任意键继续"<<endl;/cout.flush();cin.get();void Mul()CComplex a1,a2,mul,f(0,0);cout<<"乘法计算&

19、quot;<<endl<<"最少输入两个复数,并以零结束"<<endl;cout<<"第一个复数"<<endl;cin>>a1;cout<<"第二个复数"<<endl;cin>>a2;mul=a1*a2;cout<<"第三个复数"<<endl;cin>>a1;int i=4;while(!(a1=f) mul=mul*a1; cout<<"第"

20、;<<i<<"个复数"<<endl; cin>>a1;i+;cout<<"结果:"<<mul<<endl;cout<<"按任意键继续"<<endl;/cout.flush();cin.get();void Div()CComplex a1,a2,div,f(0,0);cout<<"除法计算"<<endl<<"最少输入两个复数,并以零结束"<<

21、endl;cout<<"第一个复数"<<endl;cin>>a1;cout<<"第二个复数"<<endl;cin>>a2;div=a1/a2;cout<<"第三个复数"<<endl;cin>>a1;int i=4;while(!(a1=f) div=div/a1; cout<<"第"<<i<<"个复数"<<endl; cin>>a

22、1;i+;cout<<"结果:"<<div<<endl;cout<<"按任意键继续"<<endl;/cout.flush();cin.get();void Compare(void)cout<<" 复数模比较 "<<endl; CComplex a1,a2;cout<<"输入两个复数:"<<endl;cout<<"第一个复数:"cin>>a1;cout<<

23、;"第二个复数"cin>>a2;if(a1=a2)cout<<"这两个复数相等"<<endl;else if(a1>a2)cout<<a1<<"的模大于"<<a2<<"的模"<<endl;else if(a1<a2)cout<<a1<<"的模小于"<<a2<<"的模"<<endl; cout<<&q

24、uot;按任意键继续"<<endl;cin.get();istream& operator>>(istream&is,CComplex&com) /重载输入,可以输入a+bi,也可以输入a+b*ichar s100;is>>s; /字符串s用于接收复数int len=strlen(s);int n=0,sign=1; /n为当前从字符串中提取出来的数字,初始化为0;sign为n的符号,初始化为正com.Image=com.Real=0; if(len=4)for(int k=0;k<len;k+) /判断字符串是否合法

25、if(sk<'0'|sk>'9')&&(sk!='+'&&sk!='-'&&sk!='i')cout<<"Error"<<endl; /若字符串不是19的数字或“+”、“-”、“=”则错误,输出Errorreturn is;for(k=0;k<len;) /依次识别字符串中和字符if(n!=0&&(sk='-'|sk='+') /判断是否为符号位com.Rea

26、l=sign*n; /是符号,且n!=0,n已被赋值,当前读取的是虚部的符号 n=0; /将sign*n的值赋给实部,然后n清零,准备接受虚部的值 if(sk='-')sign=-1;k+; /给符号标志赋值 if(sk='+')sign=1;k+; /给符号标志赋值 if(sk='i') /若当前字符为i if(k!=len-1) /判断i是否为最后一个字符cout<<"errorn" /若不是,则复数输入格式错误elsecom.Image=sign*n;/是最后一个字符,复数对象已接收完毕,用sign*n给虚部

27、赋值break; while(sk>='0'&&sk<='9') /当字符在09之间是,将数字字符转化为数字数值n=n*10+sk-'0'k+;if(slen-1!='i'&&n!=0) /如果最后一个字符不是i,表示复数只有实部,没有虚部com.Real=n*sign;return is;elsefor(int k=0;k<len;k+) /依次识别字符串中和字符if(sk<'0'|sk>'9')&&(sk!='

28、+'&&sk!='-'&&sk!='i'&&sk!='*') /若字符串不是19的数字或“+”、“-”、“=”、“*”则错误,输出Errorcout<<"Error"<<endl;return is;for(k=0;k<len;) /依次识别字符串中和字符if(n!=0&&(sk='-'|sk='+') /判断是否为符号位com.Real=sign*n;n=0; if(sk='-'

29、;)sign=-1;k+; /给符号标志赋值 if(sk='+')sign=1;k+; /给符号标志赋值 if(sk='*') /若当前字符为*k+;com.Image=sign*n; if(sk='i') /若当前字符为i if(k!=len-1) /判断i是否为最后一个字符cout<<"errorn" /若不是,则复数输入格式错误/else/com.Image=sign*n;break; while(sk>='0'&&sk<='9') /当字符在09之

30、间是,将数字字符转化为数字数值n=n*10+sk-'0'k+;if(slen-1!='i'&&n!=0) /如果最后一个字符不是i,表示复数只有实部,没有虚部com.Real=n*sign;return is;ostream&operator<<(ostream&os,CComplex&com) /重载输出if(fabs(com.Image)<Z) /如果虚部为零 os<<com.Real; /只输出实部; else if(fabs(com.Real)<Z) /如果实部为零 os<

31、<com.Image<<"i" /只输出虚部else if(com.Image>0) os<<com.Real<<"+"<<com.Image<<"i" /虚部为正,用“+”连接实部与虚部else os<<com.Real<<com.Image<<"i" /虚部为负,虚部的符号连接实部与虚部 return os;void Test(void)double real1,real2,real3,real4,ima

32、ge1,image2,image3,image4;CComplex answer,f5;int score=0;char op;for(int i=1;i<=10;i+)real1=rand()%200-100; /产生随机的两位数,可正可负 image1=rand()%200-100; real2=rand()%200-100; image2=rand()%200-100;CComplex f1(real1,image1),f2(real2,image2); /用随机产生的两位数初始化类对象real3=rand()%20-10; /产生随机的一位数image3=rand()%20-10

33、; real4=rand()%20-10;image4=rand()%20-10;CComplex f3(real3,image3),f4(real4,image4); /用随机产生的一位数初始化类对象op=rand()%3; /随即产生3种运算符cout<<"第"<<i<<"题:"switch(op)case 0:answer=f1+f2;cout<<f1<<"加上"<<f2<<"等于"break; case 1:answer=f

34、1-f2;cout<<f1<<"减去"<<f2<<"等于"break;case 2: /乘法用实部、虚部都是一位的对象 answer=f1*f2;cout<<f1<<"乘以"<<f2<<"等于"break;cin>>f5;if(answer=f5) /判断结果是否正确cout<<"此题做对了"<<'n' cout<<"加十分:"<<'n'score+=10; /正确,加十分elsecout<<"此题做错了"<<'n' cout<<"不得分:"<<'n' /错误,不得分cout<<"你的最后得分为:"<<score<<endl;void main(void) /输出程序主菜单,并接收用户选择char input;CComplex a,b,c,d,e,f,g;system("cls&qu

温馨提示

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

评论

0/150

提交评论