C专业课程设计复数计算器.doc
《C专业课程设计复数计算器.doc》由会员分享,可在线阅读,更多相关《C专业课程设计复数计算器.doc(26页珍藏版)》请在咨信网上搜索。
C++课程设计试验汇报 姓名 学号 班级 合作者 学号 班级 任课老师 时间 老师指定题目 复数计算器 评定难易等级 A级 试验汇报成绩 复数计算器 程序功效设计 1. 程序功效总体结构 复数计算器程序总体功效可设计成图1所表示,能够看出,复数计算器多种功效全部用菜单选项列出,用户能够依据需要选择对应菜单项,从而实施不一样子程序以完成对应功效。 2.课程设计要求 (1) 一开始运行程序,要有具体菜单选项界面,用户不选择退出就能够反复运算。 (2) 能够进行多个操作数复数运算,输入0+0*i时为止。 (3) 编写能够对输入复数求模组员函数。 (4) 编写含有测试功效函数,即计算机能够自动出题,并要求用户计算,同时计算机判定用户计算对错并打分,要求十题为一个单元,每题一个运算符,运算符包含+,-,*三种,参与加减运算实部虚部为一位数。 (5) 重载输入输出运算符,对复数输入既可采取实部虚部分开提醒输入,也可直接输入诸如a+i*b或a+ib这种形式,对复数输出要考虑实部虚部正负号,经过判定给出输出结果。 开始 输出菜单及提醒信息 输入选择 是否做加法 N 是否做减法 N Y 是否进行测试 N 加法子程序Add() Y . . . . . . …… 减法子程序 Y 测试子程序 是否退出 N Y 结束 2. 程序设计思想 1)类封装 程序中将复数形式数据定义成一个复数类CComplex,重载了加法及减法等运算符,使函数加减等运算像通常数据一样方便.每个运算符重载全部用一个函数去实现。参考类定义以下: class CComplex{ private: 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 总分加10 Op为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 结束 目前字符是否是‘+’ N Sign=1,k++ 目前字符是否是‘-’ N Sign=-1,k++ 目前字符是否是为‘i’ ‘i’是否是最终一个字符 N YY N 输犯错误信息,函数返回 目前字符是否是数字字符 N N 将字符转变为数值 N Y 3. 程序界面 开始界面 运行结果界面 4.程序源代码及具体注解: # include<iostream.h> # include<math.h> # include<stdlib.h> # include<string.h> #define Z 1e-6 class CComplex{ private: 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; //大于,则返回1 else return 0; } int CComplex:: operator<(CComplex&com) //重载“<”运算符,比较复数模 { if(Module()<com.Module()) return 1; //小于,则返回1 else 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; //实部和虚部分别相等返回1 else 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*i char s[100]; 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((s[k]<'0'||s[k]>'9')&&(s[k]!='+'&&s[k]!='-'&&s[k]!='i')) { cout<<"Error"<<endl; //若字符串不是1~9数字或“+”、“-”、“=”则错误,输出Error return is; } } for(k=0;k<len;) //依次识别字符串中和字符 { if(n!=0&&(s[k]=='-'||s[k]=='+')) //判定是否为符号位 { com.Real=sign*n; //是符号,且n!=0,n已被赋值,目前读取是虚部符号 n=0; //将sign*n值赋给实部,然后n清零,准备接收虚部值 } if(s[k]=='-') { sign=-1;k++; //给符号标志赋值 } if(s[k]=='+') { sign=1;k++; //给符号标志赋值 } if(s[k]=='i') //若目前字符为i { if(k!=len-1) //判定i是否为最终一个字符 cout<<"error\n"; //若不是,则复数输入格式错误 else com.Image=sign*n; //是最终一个字符,复数对象已接收完成,用sign*n给虚部赋值 break; } while(s[k]>='0'&&s[k]<='9') //当字符在0~9之间是,将数字字符转化为数字数值 { n=n*10+s[k]-'0'; k++; } } if(s[len-1]!='i'&&n!=0) //假如最终一个字符不是i,表示复数只有实部,没有虚部 com.Real=n*sign; return is; } else { for(int k=0;k<len;k++) //依次识别字符串中和字符 { if((s[k]<'0'||s[k]>'9')&&(s[k]!='+'&&s[k]!='-'&&s[k]!='i'&&s[k]!='*')) //若字符串不是1~9数字或“+”、“-”、“=”、“*”则错误,输出Error { cout<<"Error"<<endl; return is; } } for(k=0;k<len;) //依次识别字符串中和字符 { if(n!=0&&(s[k]=='-'||s[k]=='+')) //判定是否为符号位 { com.Real=sign*n; n=0; } if(s[k]=='-') { sign=-1;k++; //给符号标志赋值 } if(s[k]=='+') { sign=1;k++; //给符号标志赋值 } if(s[k]=='*') //若目前字符为* { k++; com.Image=sign*n; } if(s[k]=='i') //若目前字符为i { if(k!=len-1) //判定i是否为最终一个字符 cout<<"error\n"; //若不是,则复数输入格式错误 //else //com.Image=sign*n; break; } while(s[k]>='0'&&s[k]<='9') //当字符在0~9之间是,将数字字符转化为数字数值 { n=n*10+s[k]-'0'; k++; } } if(s[len-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;} //正确,加十分 else { cout<<"此题做错了"<<'\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; do { cin>>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,则能够不退出一直使用复数计算器 }- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 专业课程 设计 复数 计算器
咨信网温馨提示:
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【精***】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【精***】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【精***】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【精***】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
关于本文