复数计算器-实验报告_第1页
复数计算器-实验报告_第2页
复数计算器-实验报告_第3页
复数计算器-实验报告_第4页
复数计算器-实验报告_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

中南大学高级程序设计实践〔C++〕课程设计报告题目复数计算器学生姓名指导教师陈丽萍学院信息科学与工程学院专业班级通信工程1301班完成时间2023年7月5日第一章需求分析与程序设计1.1需求分析1.1.1程序设计的目的与任务1.复习和稳固C++语言的根底知识,进一步加深对C++语言的理解和掌握。2.为学生提供独立实践的时机,将课本上的理论知识和实际有机的结合起来,锻炼学生独立分析问题、解决问题、查阅资料以及自学能力。3.学习和掌握C++程序设计方法以及上机调试技巧,为今后学习其它专业课程打好根底。4.在程序实现过程中,需利用面向对象程序设计理论的根底知识,充分表达出C++语言关于类、继承、封装与多态等核心概念,每一个类应包含数据成员和成员函数,以实现预期的功能,解决实际问题。1.1.2“复数计算器〞程序所能实现的功能1.建立实数类、复数类,复数类由实数类公有继承而来。2.实现实数、复数信息的初始化。3.通过选择结构和调用相关函数实现实数的相关运算,包括:两个实数间的加、减、乘、除和一个实数的自增、自减、求平方、二次方根等运算。4.通过选择结构和调用相关函数实现复数的相关运算,包括:两个复数间的加、减、乘、除、求两个复数的夹角和一个复数的取模、求平方、求共轭复数、求单个复数的向量角等运算。5.通过调用相关函数实现实数、复数信息的输出,显示在显示屏上。6.通过屡次运用选择和循环结构实现对实数、复数运算的选择,在选择了实数或复数运算的前提下,再实现对各种运算的选择,运算结束后还可以选择继续实现其它运算或退出程序。1.2程序设计1.2.1概要设计1.系统中的各个实体及它们之间的关系系统中的实体是实数类对象和复数类对象,它们的关系是复数类对象所属的类是由实数类对象所属的类公有派生而来的。2.系统的类层次程序中建立了两个类,分别是实数类、复数类,复数类是由实数类公有派生而来的。3.主程序的流程以及各程序模块之间的层次(调用)关系首先从键盘输入数字1或2或0,输入不同数字那么进入不同的并列的小程序模块。假设输入1,那么进行实数相关运算,再输入1-8选择具体运算,此时会调用实数类中的相关成员函数,运算出正确结果,运算结束后,那么会进入循环结构,进行下一次选择及运算。假设输入2,那么进行复数相关运算,再输入1-9选择具体运算,此时会调用复数类中的相关成员函数,运算出正确结果,运算结束后,那么会进入循环结构,进行下一次选择及运算。假设输入0,那么将退出复数计算器系统。1.2.2详细设计1.类层次中各个类的描述实数类数据成员〔都属于保护数据成员〕:doublereal成员函数〔都属于公有成员函数〕:构造函数:Simple()Simple(doubler) 相加函数:doublejia(Simple&s2)相减函数:doublejian(Simple&s2)相乘函数:doublecheng(Simple&s2)相除函数:doublechu(Simple&s2)自加函数:doublezijia()自减函数:doublezijian()平方函数:doublepingfang()二次方根函数:doublekaifang()输入函数:voidinput()输出函数:doubleoutput()复数类数据成员〔都属于私有数据成员〕:doubleimag成员函数〔都属于公有成员函数〕:构造函数:Complex()Complex(doubler,doublei)重载“+〞函数:Complexoperator+(Complex&c2)重载“-〞函数:Complexoperator-(Complex&c2)重载“/〞函数:Complexoperator*(Complex&c2)重载“*〞函数:Complexoperator/(Complex&c2)输入函数:voidsetnumber()取模函数:doublequmo()平方函数:Complexpf()取共轭复数函数:Complexgonge()求向量角函数:doublexiangliangjiao()求夹角函数:doublejiajiao(Complex&c2)重载“<<〞函数:friendostream&operator<<(ostream&output,Complex&c)类中各个成员函数的定义实数类中成员函数定义:Simple(){doublereal=0.0;}//构造函数Simple(doubler){real=r;}//构造函数doublejia(Simple&s2)//两个实数相加函数 { doublea; a=real+s2.real; returna; }doublejian(Simple&s2)//两个实数相减函数 { doublea; a=real-s2.real; returna; }doublecheng(Simple&s2)//两个实数相乘函数 { doublea; a=(real)*(s2.real); returna; }doublechu(Simple&s2)//两个实数相除函数 { doublea; a=(real)/(s2.real); returna; }doublezijia()//一个实数自加函数 { doublea; a=++real; returna; }doublezijian()//一个实数自减函数 { doublea; a=--real; returna; }doublepingfang()//一个实数的平方函数 { doublea; a=(real)*(real); returna; }doublekaifang()//一个实数的二次方根函数 { doublea; a=sqrt(real); returna; }voidinput()//实数的输入函数 { cout<<"请输入一个实数:"<<""; cin>>real; } doubleoutput()//实数的输出函数 { returnreal; }复数类中成员函数定义:Complex(){real=0.0;imag=0.0;}//构造函数Complex(doubler,doublei){real=r;imag=i;}//构造函数voidsetnumber()//复数的输入函数 { cout<<"请输入一个复数的实部:"<<""; cin>>real; cout<<"请输入一个复数的虚部:"<<""; cin>>imag; }Complexoperator+(Complex&c2)//重载"+"用于两复数相加 { Complexc; c.real=real+c2.real; c.imag=imag+c2.imag; returnc; }Complexoperator-(Complex&c2)//重载"-"用于两复数相减 { Complexc; c.real=real-c2.real; c.imag=imag-c2.imag; returnc; }Complexoperator*(Complex&c2)//重载"*"用于两复数相乘 { Complexc; c.real=real*c2.real-imag*c2.imag; c.imag=real*c2.imag+imag*c2.real; returnc; }Complexoperator/(Complex&c2)//重载"/"用于两复数相除 { Complexc;c.real=(real*c2.real+imag*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag);c.imag=(imag*c2.real-real*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag); returnc; }doublequmo()//一个复数取模函数 { doublea; a=sqrt(real*real+imag*imag); returna; }Complexpf()//一个复数的平方函数 { Complexc; c.real=real*real-imag*imag; c.imag=2*real*imag; returnc; }Complexgonge()//一个复数的共轭复数函数 { Complexc; c.real=real; c.imag=0-imag; returnc; }doublexiangliangjiao()//单个复数的向量角函数 { doublea; a=atan(imag/real)*57.295; returna; }doublejiajiao(Complex&c2)//两个复数的夹角函数 { doublea; a=fabs((atan(imag/real))*57.295-(atan(c2.imag/c2.real))*57.295returna; }friendostream&operator<<(ostream&output,Complex&c)//重载"<<"用于复数的输出 { output<<c.real; if(c.imag>=0)output<<"+"; output<<c.imag<<"i"<<endl; returnoutput; }主程序和重要模块的算法调试程序后,显示屏会显示文字提醒计算器使用者输入数字0或1或2,使用者需根据提示输入相关数据。局部相关程序代码如下:cout<<"【欢送使用复数运算器】"<<endl;gg:cout<<"请输入0或1或2"<<endl;cout<<"【0】退出复数计算器;"<<endl;cout<<"【1】进行实数相关运算;"<<endl;cout<<"【2】进行复数相关运算:"<<"";cin>>a;假设计算器使用者输入1,那么选择了实数的相关运算,系统会提示输入数字1-8,1-8分别对应两个实数间的相加、相减、相乘、相除和一个实数的自加、自减、平方、二次方根等运算,使用者需根据提示输入1-8,再从键盘输入一个或两个实数,按回车键后即可得到正确结果。局部相关程序代码如下:if(a==1) { cout<<"1.相加2.相减3.相乘4.相除〔两个实数间的运算〕"<<endl; cout<<"5.自加6.自减7.平方8.二次方根〔一个实数的运算〕"<<endl; cout<<"输入数字1-8进行选择:"<<""; cin>>b; if(b==1||b==2||b==3||b==4) { cout<<"请输入2个实数:"<<""<<""<<endl; s1.input(); s2.input(); cout<<"第1个实数是:"<<s1.output()<<endl; cout<<"第2个实数是:"<<s2.output()<<endl; switch(b) { case1:cout<<"相加结果是:"<<s1.jia(s2)<<endl;break; case2:cout<<"相减结果是:"<<s1.jian(s2)<<endl;break; case3:cout<<"相乘结果是:"<<s1.cheng(s2)<<endl;break; case4:cout<<"相除结果是:"<<s1.chu(s2)<<endl;break; default:cout<<"error"<<endl;break; } cout<<endl; } if(b==5||b==6||b==7||b==8) { cout<<"请输入1个实数:"<<""<<endl; s1.input(); cout<<"输入的实数是:"<<s1.output()<<endl; switch(b) { case5:cout<<"自加结果是:"<<s1.zijia()<<endl;break; case6:cout<<"自减结果是:"<<s1.zijian()<<endl;break; case7:cout<<"平方结果是:"<<s1.pingfang()<<endl;break; case8:cout<<"二次方根是:"<<s1.kaifang()<<endl;break; default:cout<<"error"<<endl;break; } cout<<endl; } gotogg; }假设计算器使用者输入2,那么选择了复数的相关运算,系统会提示输入数字1-9,1-9分别对应两个复数间的相加、相减、相乘、相除、夹角和一个复数的取模、平方、向量角、共轭复数等运算,使用者需根据提示输入1-9,再通过从键盘键入分别输入实部和虚部输入一个或两个复数,按回车键后即可得到正确结果。局部相关程序代码如下:if(a==2) { cout<<"1.相加2.相减3.相乘4.相除5.两个复数的夹角〔两个复数间的运算〕"<<endl; cout<<"6.取模7.平方8.一个复数的向量角9.共轭复数〔一个复数的运算〕"<<endl; cout<<"输入数字1-9进行选择:"<<""; cin>>b; if(b==1||b==2||b==3||b==4||b==5) { cout<<"请输入2个复数:"<<""<<""<<endl; c1.setnumber(); c2.setnumber(); cout<<"第1个复数是:"<<c1; cout<<"第2个复数是:"<<c2; switch(b) { case1:cout<<"相加结果是:"<<c1+c2<<endl;break; case2:cout<<"相减结果是:"<<c1-c2<<endl;break; case3:cout<<"相乘结果是:"<<c1*c2<<endl;break; case4:cout<<"相除结果是:"<<c1/c2<<endl;break; case5:cout<<"这两个复数的夹角是:"<<c1.jiajiao(c2)<<"°"<<endl;break; default:cout<<"error"<<endl;break; } cout<<endl; } if(b==6||b==7||b==8||b==9) { cout<<"请输入1个复数:"<<""<<endl; c1.setnumber(); cout<<"输入的复数是:"<<c1; switch(b) { case6:cout<<"取模结果是:"<<c1.qumo()<<endl;break;case7:cout<<"平方结果是:"<<c1.pf()<<endl;break; case8:cout<<"该复数的向量角是:"<<c1.xiangliangjiao()<<"°"<<endl;break; case9:cout<<"该复数的共轭复数是:"<<c1.gonge()<<endl;break; default:cout<<"error"<<endl;break; } cout<<endl; } gotogg; }假设计算器使用者输入0,再按任意键后,即可退出复数计算器。此过程是通过运用if判断语句和switch选择语句而实现的。局部相关程序代码如下:if(a==0) { cout<<"【谢谢使用!按任意键后,您将退出复数计算器】"<<endl; exit(0); }假设第一次计算器使用者输入1或2且一次运算结束后,系统会再次提醒输入0或1或2,即可进行下一次运算;假设第一次计算器使用者输入0,那么会退出系统。此过程是通过运用goto循环语句和if判断语句而实现的。程序运行的流程图〔鉴于程序中用到if判断语句和switch循环语句,流程图中会有较多分支,所以此流程图将会以三局部的形式呈现〕从键盘输入数字0或1或2从键盘输入数字0或1或2输入1输入输入1输入2输入03434退出程序退出程序图1程序图分图1输入1输入数字输入数字1-8876543321876543321调用1次实数输入函数,1次输出函数,1次二次方根函数调用1次实数输入函数,1次输出函数,1次平方函数调用1次实数输入函数,1次输出函数,1次相减函数调用调用1次实数输入函数,1次输出函数,1次二次方根函数调用1次实数输入函数,1次输出函数,1次平方函数调用1次实数输入函数,1次输出函数,1次相减函数调用1次实数输入函数,1次输出函数,1次自加函数调用2次实数输入函数,2次输出函数,1次相除函数调用2次实数输入函数,2次输出函数,1次相乘函数调用2次实数输入函数,2次输出函数,1次相减函数调用2次实数输入函数,2次输出函数,1次相加函数输出结果输出结果33图2程序图分图2输入2输入数字输入数字1-998765433219876543321调用1次复数输入函数,1次求共轭复数函数调用2次复数输入函数,1次复数相加函数调用2次复数输入函数,1次复数相减函数调用2次复数输入函数,1次求两复数夹角函数调用调用1次复数输入函数,1次求共轭复数函数调用2次复数输入函数,1次复数相加函数调用2次复数输入函数,1次复数相减函数调用2次复数输入函数,1次求两复数夹角函数调用2次复数输入函数,1次复数相乘函数调用1次复数输入函数,1次求单个复数向量角函数调用1次复数输入函数,1次复数平方函数调用1次复数输入函数,1次取模函数调用2次复数输入函数,1次复数相乘函数输出结果输出结果44图3程序图分图3第二章调试与总结2.1调试分析与测试结果2.1.1调试过程中遇到的问题及解决方法1.调试出现错误调试过程中出现错误,不能正常运行,经检查后发现是代码中包含的sqrt函数,fabs函数,atan函数没有定义,在头文件中加上#include<cmath>即可正常运行。2.运算结果不正确调试过程中,当算一个复数的向量角时,算出的度数不对,经认真检查后,发现是没有将弧度转化为度数,只需在原始结果后乘57.295即可得到正确结果。当算两个复数的夹角时,有时运行结果出现负角,但两个复数的夹角不可能是负的,经仔细思考后,在原始结果前加fabs取绝对值,即可得到正确结果。3.循环结构不恰当调试过程中,刚开始每进行一种运算后,就会退出系统,假设想要进行下一次运算,必须重新调试,这样不太方便,最终经过思考,我在main函数中参加了一个goto循环结构和exit退出语句,有了这些修改后,在每次运算结束后,可以选择继续进行下一次运算,或是退出系统,这样比拟方便。2.1.2测试结果〔鉴于许多运算功能原理相似,以下只列出局部功能的测试结果〕1.求两个实数相乘的结果:求一个实数自减的结果求一个实数平方的结果:求一个实数的二次方根:求两个复数相除的结果:求两个复数的夹角:求一个复数的模:8.求一个复数的向量角:求一个复数的共轭复数:2.2课程设计总结2.2.1课设总结在这次程序设计的过程中,我遇到了很多问题,同时也收获了不少,成长了不少。一拿到题目我就非常紧张,害怕自己做不出来,焦虑的情绪让我浪费了好多时间,这让我懂得在生活中遇到问题时,要有良好的心态,一定要镇定自假设,千万不能惊慌失措。当我花了好久,终于辛辛苦苦设计出了算法,编写好程序,可是当调试时,出现了很多问题,如:调试过程中出现错误,程序不能正常运行,经认真检查和思考后发现是头文件中缺少#include<cmath>;还有调试过程中,当算一个复数的向量角时,算出的度数不对,经认真检查后,发现是没有将弧度转化为度数,只需在原始结果后乘57.295即可得到正确结果;当算两个复数的夹角时,有时运行结果出现负角,但两个复数的夹角不可能是负的,经仔细思考后,在原始结果前加fabs取绝对值,即可得到正确结果;还有调试过程中,刚开始每进行一种运算后,就会退出系统,假设想要进行下一次运算,必须重新调试,这样不太方便,最终经过思考,我在main函数中参加了一个goto循环结构和exit退出语句,有了这些修改后,在每次运算结束后,可以选择继续进行下一次运算,或是退出系统,这样比拟方便。回头检查错误,修改程序的过程,又让我花费了好多时间和精力,这让我知道做任何事都要有严谨的态度,并考虑到结果。在完善程序的过程中,我也学会了如何快速寻找错误并改正,还让我做任何事更有耐心。当我遇到问题不能自己独立解决时,我求助了同学,这也让我深刻懂得,在必要的时候我们可以求助他人,同样可以得到好的结果,但大局部还是要靠自己的力量解决问题。在这次课程设计中,我设计了一个较大的程序后,我对书本上的理论知识有了更全面、深刻的理解,同时也锻炼了我的动手能力、实践能力、将课本知识运用到实际生活中的能力。虽然这次程序设计的过程很艰难,但最终我成功了,我觉得一切的努力都是值得的。第三章参考文献[1]《C++程序设计》[2]《C++程序设计实验上机与指导》第四章附录#include<iostream.h>#include<string>#include<cmath>classSimple{protected: doublereal;public: Simple(){doublereal=0.0;}//构造函数 Simple(doubler){real=r;}//构造函数doublejia(Simple&s2)//两个实数相加函数 {doublea;a=real+s2.real;returna;}doublejian(Simple&s2)//两个实数相减函数 { doublea; a=real-s2.real; returna; }doublecheng(Simple&s2)//两个实数相乘函数 { doublea; a=(real)*(s2.real); returna; }doublechu(Simple&s2)//两个实数相除函数 { doublea; a=(real)/(s2.real); returna; }doublezijia()//一个实数自加函数 { doublea; a=++real; returna; }doublezijian()//一个实数自减函数 { doublea; a=--real; returna; }doublepingfang()//一个实数的平方函数 { doublea; a=(real)*(real); returna; }doublekaifang()//一个实数的二次方根函数 { doublea; a=sqrt(real); returna; }voidinput()//实数的输入函数 { cout<<"请输入一个实数:"<<""; cin>>real; }doubleoutput()//实数的输出函数 { returnreal; }};classComplex:publicSimple{private: doubleimag;public: Complex(){real=0.0;imag=0.0;}//构造函数 Complex(doubler,doublei){real=r;imag=i;}//构造函数 voidsetnumber()//复数的输入函数 { cout<<"请输入一个复数的实部:"<<""; cin>>real; cout<<"请输入一个复数的虚部:"<<""; cin>>imag; }Complexoperator+(Complex&c2)//重载"+"用于两复数相加 { Complexc; c.real=real+c2.real; c.imag=imag+c2.imag; returnc; }Complexoperator-(Complex&c2)//重载"-"用于两复数相减 { Complexc; c.real=real-c2.real; c.imag=imag-c2.imag; returnc; }Complexoperator*(Complex&c2)//重载"*"用于两复数相乘 { Complexc; c.real=real*c2.real-imag*c2.imag; c.imag=real*c2.imag+imag*c2.real; returnc; }Complexoperator/(Complex&c2)//重载"/"用于两复数相除 { Complexc;c.real=(real*c2.real+imag*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag);c.imag=(imag*c2.real-real*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag); returnc; }doublequmo()//一个复数取模函数 { doublea; a=sqrt(real*real+imag*imag); returna; }Complexpf()//一个复数的平方函数 { Complexc; c.real=real*real-imag*imag; c.imag=2*real*imag; returnc; }Complexgonge()//一个复数的共轭复数函数 { Complexc; c.real=real; c.imag=0-imag; returnc;}doublexiangliangjiao()//单个复数的向量角函数 { doublea; a=atan(imag/real)*57.295; returna; }doublejiajiao(Complex&c2)//两个复数的夹角函数 { doublea; a=fabs((atan(imag/real))*57.295-(atan(c2.imag/c2.real))*57.295); returna; }friendostream&operator<<(ostream&output,Complex&c)//重载"<<"用于复数的输出 { output<<c.real; if(c.imag>=0)output<<"+"; output<<c.imag<<"i"<<endl; returnoutput; }};intmain(){ Simples1,s2; Complexc1,c2; inta,b; cout<<"【欢送使用复数运算器】"<<endl;gg:cout<<"请输入0或1或2"<<endl; cout<<"【0】退出复数计算器;"<<endl; cout<<"【1】进行实数相关运算;"<<endl; cout<<"【2】进行复数相关运算:"<<"";cin>>a;if(a==1) { cout<<"1.相加2.相减3.相乘4.相除〔两个实数间的运算〕"<<endl; cout<<"5.自加6.自减7.平方8.二次方根〔一个实数的运算〕"<<endl; cout<<"输入数字1-8进行选择:"<<""; cin>>b; if(b==1||b==2||b==3||b==4) { cout<<"请输入2个实数:"<<""<<""<<endl; s1.input(); s2.input(); cout<<"第1个实数是:"<<s1.output()<<endl; cout<<"第2个实数是:"<<s2.output()<<endl; switch(b) { case1:cout<<"相加结果是:"<<s1.jia(s2)<<endl;break; case2:cout<<"相减结果是:"<<s1.jian(s2)<<endl;break; case3:cout<<"相乘结果是:"<<s1.cheng(s2)<<endl;break; case4:cout<<"相除结果是:"<<s1.chu(s2)<<endl;break; default:cout<<"error"<<endl;break; } cout<<endl; } if(b==5||b==6||b==7||b==8) { cout<<"请输入1个实数:"<<""<<endl; s1.input(); cout<<"输入的实数是:"<<s1.output()<<endl; switch(b) { case

温馨提示

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

评论

0/150

提交评论