C专业课程设计复数计算器.doc
C+课程设计试验汇报姓名 学号 班级 合作者 学号 班级 任课老师 时间 老师指定题目 复数计算器 评定难易等级 A级 试验汇报成绩 复数计算器程序功效设计1 程序功效总体结构复数计算器程序总体功效可设计成图所表示,能够看出,复数计算器多种功效全部用菜单选项列出,用户能够依据需要选择对应菜单项,从而实施不一样子程序以完成对应功效。2课程设计要求(1) 一开始运行程序,要有具体菜单选项界面,用户不选择退出就能够反复运算。(2) 能够进行多个操作数复数运算,输入00i时为止。(3) 编写能够对输入复数求模组员函数。(4) 编写含有测试功效函数,即计算机能够自动出题,并要求用户计算,同时计算机判定用户计算对错并打分,要求十题为一个单元,每题一个运算符,运算符包含,三种,参与加减运算实部虚部为一位数。(5) 重载输入输出运算符,对复数输入既可采取实部虚部分开提醒输入,也可直接输入诸如或这种形式,对复数输出要考虑实部虚部正负号,经过判定给出输出结果。开始输出菜单及提醒信息输入选择是否做加法 N是否做减法 N Y是否进行测试 N加法子程序Add() Y . . . . . . 减法子程序 Y测试子程序是否退出 N Y结束 2 程序设计思想1)类封装程序中将复数形式数据定义成一个复数类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<<(ostream&os,CComplex&com); /重载输出CComplex operator+(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); float Module(void); /复数求模;(2)设计任务要求1在实际应用中,输入复数可能为a+bi, a, bi, -a, -bi, +i. i. I等形式。重载输入运算符应该能识别这么形式多样复数。所以在重载输入函数时要综合考虑上述多种输入形式。可行处理方法是:在重载输入函数中,设计用(3)设计任务要求2在程序中设计一个复数运算测试函数Test(),其功效是让计算机随机出10道运算题,用户给出答案,同时计算机实时判定对错并能够打分。这个函数关键是让计算机随机产生复数对象和运算符,计算机内部有一个随机数发生器,能够产生一个固定次序整型随机数序列,调用语句为“int a = rand();”这时,a就是该随机数发生器产生随机数。因为产生随机书数在整数范围内,为测试方便,按程序设计要求,产生随机复数对象实部和虚部在100以内,运算符只有加减两种。所以,需要对产生随机数进行深入处理,用随机数模除以除以100,产生出100以内随机整数;一样,用随机数模除以3,能够产生出0、 1、3三个随机数据,定义0为加法,1为减法,2为乘法,这么就能够产生出随机复数对象加减乘运算了。能够参见图2测试子程序Test()结构框图。设置循环次数为10用两个随机数初始复数对象3产生8个100以内随机数随机数最终两个随机数初始复数对象4前两个随机数初始复数对象1用户输入结果两对象相乘后两个随机数初始复数对象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目前字符为+、号,同时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 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 operator+(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); float Module(void); /复数求模;CComplex CComplex: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&com) /乘法重载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-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;int 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&&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=a1+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();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;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<<"乘法计算"<<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<<"第"<<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<<"最少输入两个复数,并以零结束"<<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>>a1;i+;cout<<"结果:"<<div<<endl;cout<<"按任意键继续"<<endl;/cout.flush();cin.get();void Compare(void)cout<<" 复数模比较 "<<endl; CComplex a1,a2;cout<<"输入两个复数:"<<endl;cout<<"第一个复数:"cin>>a1;cout<<"第二个复数"cin>>a2;if(a1=a2)cout<<"这两个复数相等"<<endl;else if(a1>a2)cout<<a1<<"模大于"<<a2<<"模"<<endl;else if(a1<a2)cout<<a1<<"模小于"<<a2<<"模"<<endl; cout<<"按任意键继续"<<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+) /判定字符串是否正当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.Real=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给虚部赋值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!='+'&&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='-')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之间是,将数字字符转化为数字数值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<<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,image1,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; 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=f1-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");cout<<"t这是一个复数计算器程序,拥有以下功效,请根据菜单选择进入功效。"<<endl<<endl<<endl;cout<<"=MENU="<<endl;cout<<"1:复数求模"<<endl; cout<<"2:多复数连加运算"<<endl; cout<<"3:多复数连减运算"<<endl; cout<<"4:多复数连乘运算"<<endl;cout<<"5:多复数连除运算"<<endl; cout<<"6:进入复数计算测试(一次十题)"<<endl; cout<<"7:复数比较:"<<endl; cout<<"8:退出"<<endl;cout<<"请选择"<<endl;docin>>input; /接收用户选择cout<<""cout<<"="<<endl;switch(input) /用switch-case实现功效多项选择case'1':cout<<" 复数求模 "<<endl;cout<<"请输入一个复数:"cin>>a;cout<<a.Module()<<endl;break;case'2':Add();break; case'3':Sub();break;case'4': Mul();break; case'5':Div();break; case'6':Test(); break;case'7':Compare();break;case'8':exit(-1); break;default:cout<<"Bad input"<<"输入错误,请按任意键后重新输入"<<endl;break;while(input!=8);/若不输入8,则能够不退出一直使用复数计算器