




已阅读5页,还剩49页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
高级程序设计实践(C+)课程设计报告题 目 复数计算器 目录第一章 需求分析.第1页第二章 概要设计.第2页第三章 详细设计.第4页第四章 调试分析.第21页第五章 测试结果.第25页第六章 课程设计总结.第36页第七章 参考文献.第37页第八章 附录.第37页第一章 需求分析1.1程序设计的任务11.1编程目的1.本次程序设计的目的运用面向对象程序设计知识,利用C+语言设计和实现一个复数计算器,要求具备如下主要功能:(1)建立实数类、复数类(2)实现实数、复数信息的初始化(3)实现实数的加、减、乘、除、自增、自减、求平方、二次方根等操作(4)实现复数的加、减、乘、除、取模、求平方、求共轭复数、求单个复数的向量角、求两个复数的夹角等运算(5)实现实数、复数信息的输出1.1.2编程要求在实现过程中,需利用面向对象程序设计理论的基础知识,充分体现出C+语言关于类、继承、封装与多态等核心概念,每一个类应包含数据成员和成员函数。1.1.3数据范围数据输入的形式为float型,输出形式亦是float型,数据(实数、复数的实部、虚部)范围是-2128 +2128,也即-3.40E+38 +3.40E+38。1.2本程序能实现的功能1.2.1实数类(Complex)所实现的功能:实数的加法运算、减法运算、乘法运算、除法运算、前置自增运算、后置自增运算、前置自减运算、后置自减运算、求平方运算、求平方根运算;1.2.2复数类(Complex1)所实现的功能:复数的加法运算、减法运算、乘法运算、除法运算、模长运算、求平方运算、共轭复数运算、求单个复数的向量角运算、求两个复数的夹角运算。1.2.3主函数所能实现的功能1.提供给操作者操作数据的类型(实数还是复数)的标识;2.操作者选择数据类型后,提供运算类型操作的标识;3.运用指针调用两个类的各成员函数分别完成各项计;第二章 概要设计2.1构成部分2.1.1系统由三部分构成:实数类(Complex)、复数类(Complex1)、主函数main。2.1.2.构成部分关系复数类(Complex1)由实数类(Complex)派生而来,其中两者成员函数中的enter(输入数据)函数是虚函数,用以实现多态性。主函数main通过指针调用实数类(Complex)、复数类(Complex1)分别完成实数运算、复数运算。2.1.3.类层次实数类是父类,复数类是子类。2.2主程序流程以及程序模块之间的调用关系如图2.21所示:输入flag判断flag判断wflag=1flag=2实数运算复数运算判断v w=3 w=4 w=5 w=6 w=12 v=3 v=4 v=5 v=6 v=11乘法运算减法运算加法运算求复数间夹角除法运算乘法运算减法运算加法运算求平方运算除法运算图2.2-1主程序流程以及程序模块之间的调用关系图注:图2.2-1中没有画出1. flag=0时退出系统;2. flag不等于0,1,2时出现错误提示语句的选择结构;3. w,v在选择范围之外时出现错误提示语句的选择结构。4. 特殊处理:除法运算分母为0;求二次方根数为负数;求单个复数夹角时判断象限的过程。第三章 详细设计3.1类层次中各个类的描述3.1.1.实数类(Complex)私有部分仅数据:float型数据 real;公共部分包括12个成员函数,分别是:类的构造函数:Complex()实数加法运算函数: Complex operator+(Complex &c1)实数减法运算函数:Complex operator-(Complex &c1)实数乘法运算函数:Complex operator*(Complex &c1)实数除法运算函数:Complex operator/(Complex &c1)实数前置自增函数:Complex operator+()实数后置自增函数:Complex operator+(int)实数前置自减函数:Complex operator-()实数后置自减函数:Complex operator-(int)实数求平方根函数:float RootOfTwo()实数求平方函数:float Square()实数输入数据函数:virtual void enter()3.1.2.复数类(Complex1)私有部分仅数据成员float 型数据real和float 型数据imag,二者分别代表复数的实部和虚部;公共部分包含11个成员函数,分别是:类的构造函数:Complex1()复数加法运算函数:Complex1 operator+(Complex1 &c1)复数减法运算函数:Complex1 operator-(Complex1 &c1)复数乘法运算函数: Complex1 operator*(Complex1 &c1)复数除法运算函数:Complex1 operator/(Complex1 &c1)复数求模长函数:float Length()复数求平方函数:Complex1 Square1()求共轭复数函数:Complex1 Conjugate()复数求角度函数:float Angle1()复数间求角度函数:float Angle2(Complex1 &c1)复数输入数据函数:void enter()3.2类中各成员函数的定义3.2.1实数类(Complex)1 类的构造函数 函数体部分:Complex();2实数加法运算函数函数体部分Complex operator+(Complex &c1)Complex c;coutthe result is: endl;c.real=real+c1.real;coutreal+c1.real=c.realendl;return c;3实数减法运算函数函数体部分Complex operator-(Complex &c1)Complex c;coutthe result is: endl;c.real=real-c1.real;coutreal-c1.real=c.realendl;return c;4实数乘法运算函数函数体部分Complex operator*(Complex &c1)Complex c;c.real=real*c1.real;coutthe result is: endl;coutreal*c1.real=c.realendl;return c;5实数除法运算函数函数体部分Complex operator/(Complex &c1)Complex c;coutthe result is: endl;c.real=real/c1.real;coutreal/c1.real=c.realendl;return c;6实数前置自增函数函数体部分Complex operator+() coutthe result is: endl;cout+real;+real;cout=realendl;return *this;7实数后置自增函数函数体部分Complex operator+(int)Complex temp(*this);coutthe result is: endl;coutreal+;real+;cout=real-1endl;coutrealendl;return temp;8实数前置自减函数函数体部分Complex operator-()coutthe result is: endl;cout-real;-real;cout=realendl;return *this;9实数后置自减函数函数体部分Complex operator-(int)Complex temp(*this);coutthe result is: endl;coutreal-;real-;cout=real+1endl;coutrealendl;return temp;10实数求平方根函数函数体部分float RootOfTwo()Complex c;if(real0)coutthe number is wrong!endl;elsecoutthe result is: endl;c.real=sqrt(real);coutsqrtreal=c.realendl;return c.real;11实数求平方函数函数体部分float Square()Complex c;coutthe result is: endl;c.real=real*real;coutsquarereal=c.realreal;3.2.2复数类(Complex1) 1.类的构造函数 函数体部分 Complex1(); 2. 复数加法运算函数函数体部分Complex1 operator+(Complex1 &c1)Complex1 c;coutthe result is: endl;c.real=real+c1.real;c.imag=imag+c1.imag;cout(real+imagj)+(c1.real+c1.imagj)=(c.real+c.imagj)endl;return c;3复数减法运算函数函数体部分Complex1 operator-(Complex1 &c1)Complex1 c;coutthe result is: endl;c.real=real-c1.real;c.imag=imag-c1.imag;cout(real+imagj)-(c1.real+c1.imagj)=(c.real+c.imagj)endl;return c;4复数乘法运算函数函数体部分Complex1 operator*(Complex1 &c1)Complex1 c;coutthe result is: endl;c.real=real*c1.real-imag*c1.imag;c.imag=real*c1.imag+imag*c1.real;cout(real+imagj)*(c1.real+c1.imagj)=(c.real+c.imagj)endl;return c;5.复数除法运算函数函数体部分Complex1 operator/(Complex1 &c1)Complex1 c;coutthe result is: endl;c.real=(real*c1.real+imag*c1.imag)/(c1.real*c1.real+c1.imag*c1.imag);c.imag=(imag*c1.real-real*c1.imag)/(c1.real*c1.real+c1.imag*c1.imag);cout(real+imagj)/(c1.real+c1.imagj)=(c.real+c.imagj)endl;return c;6.复数求模长函数函数体部分float Length()float x;coutthe result is: endl;x=sqrt(real*real+imag*imag);cout|real+imagj|=xendl;return x;7.复数求平方函数函数体部分Complex1 Square1()Complex1 c;coutthe result is: endl;c.real=real*real-imag*imag;c.imag=real*imag+imag*real;cout the square of (real+imagj) is (c.real+c.imagj)endl;return c;8.求共轭复数函数函数体部分Complex1 Conjugate()Complex1 c;coutthe result is: =0)coutconjugate complex number of(real+imagj) is (c.real+c.imagj)endl;if(c.imag0)coutconjugate complex number of(real+imagj) is (c.realc.imagj)endl;return c;8.复数求角度函数函数体部分float Angle1()float y;coutthe result is: endl;y=atan(imag)/(real)/i*180;if(real=0&imag!=0)coutthe angle of (real+imagj) is 900)coutthe angle of (real+imagj) is yendl;if(real0)coutthe angle of (real+imagj) is y+180endl;if(real0&imag0)coutthe angle of (real+imagj) is y-180endl;return y;9.复数间求角度函数函数体部分float Angle2(Complex1 &c1)float z,r,s,t;coutthe result is: endl;r=(real*c1.real+imag*c1.imag);s=sqrt(real*real+imag*imag);t=sqrt(c1.real*c1.real+c1.imag*c1.imag);z=acos(r/(s*t)/i*180;coutthe angle between (real+imagj) and (c1.real+c1.imagj) is zreal;cinimag;coutendl;3. 3主程序和重要模块的算法3.3.1主程序和重要模块具体代码如下: int main() /主函数 int flag,w,v;Complex grad1,grad2;Complex *pt1,*pt2;Complex1 *pm1,*pm2;Complex1 revd1,revd2;cout姓名: 曾立弘endl;cout专业: 电气信息工程endl;cout班级: 1401班endl;cout学号: 0903140114endl;while(flag!=0) /while循环 ,flag=0时终止循环 pt1=&grad1;pt2=&grad2;coutPlease choose the type of the numbers:endl;cout0-exit systemendl; cout1-real numberendl; cout2-plural numberflag; if(flag=1) /条件语句:如果flag=1,则进行实数运算 coutplease choose the operation of the numbers:endl;cout3-+endl;cout4-endl;cout5-*endl;cout6-/endl;cout7-+endl;cout8-endl;cout9-+(int)endl;cout10-(int)endl;cout11-root of twoendl;cout12-squarew;if(w=3)coutenter();coutendl;coutenter();coutoperator+(grad2);if(w=4)coutenter();coutendl;coutenter();coutoperator-(grad2);if(w=5)coutenter();coutendl;coutenter();coutoperator*(grad2);if(w=6)coutenter();coutendl;coutenter();coutoperator/(grad2);if(w=7)coutenter();pt1-operator+();if(w=8)coutenter();pt1-operator-();if(w=9)coutenter();grad1+;if(w=10)coutenter();grad1-;if(w=11)coutenter();pt1-RootOfTwo();if(w=12)coutenter();pt1-Square();if(w!=3&w!=4&w!=5&w!=6&w!=7&w!=8&w!=9&w!=10&w!=11&w!=12)coutplease choose correct option!endl; /出错提示pt1=&revd1;pt2=&revd2;pm1=&revd1;pm2=&revd2;if(flag=2) /条件语句:如果flag=1,则进行实数运算 coutplease choose the operation of the numbers:endl;cout3-+endl;cout4-endl;cout5-*endl;cout6-/endl;cout7-Lengthendl;cout8-Square1endl;cout9-Conjugateendl;cout10-Angle1endl;cout11-Angle2v;if(v=3)coutenter();coutendl;coutenter();coutoperator+(revd2);if(v=4)coutenter();coutendl;coutenter();coutoperator-(revd2);if(v=5)coutenter();coutendl;coutenter();coutoperator*(revd2);if(v=6)coutenter();coutendl;coutenter();coutoperator/(revd2);if(v=7)coutenter();coutConjugate();if(v=8)coutenter();coutSquare1();if(v=9)coutenter();coutConjugate();if(v=10)coutenter();coutAngle1();if(v=11)coutenter();coutendl;coutenter();coutAngle2(revd2);if(v!=3&v!=4&v!=5&v!=6&v!=7&v!=8&v!=9&v!=10&v!=11)coutplease choose correct option!endl; /出错提示 if(flag!=1&flag!=2&flag!=0)coutplease choose correct option!endl; /出错提示if(flag!=0) coutn; coutPlease carry out the next operation:endl;/继续运算提示 coutn; coutWelcome next time!endl;return 0;3.4函数调用关系图3.4.1函数调用关系图如图3.41所示 flag!=00 其他 输入w ,w=? exit error 输入v,v=?3 4 5 6 7 8 9 10 11 12 输出 “please choose correct option!”“ 输入flagfloat Length()Complex1 Conjugate()float Angle1()Complex operator+()Complex1 operator+(Complex1 &c1)Complex1 operator-(Complex1 &c1)Complex1 operator*(Complex1 &c1)Complex1 operator/(Complex1 &c1) float Angle2(Complex1 &c1) float Square() float RootOfTwo() Complex operator-(int) Complex operator/(Complex &c1) Complex operator*(Complex &c1) Complex operator-(Complex &c1) Complex operator+(Complex &c1)其他 11 10 9 8 7 6 5 4 3flag=2 复数运算flag=1 实数运算 Complex operator+(int) 3 4 5 6 7 8 9 10 11 12 其他 Complex operator-() Complex1 Conjugate()第四章 调试分析4.1调试过程遇到的问题及解决方法的得出过程4.1.1问题及分析过程 1. 对输出结果的界面没有太注意,导致输出结果不是很美观; 2. 对字母的拼写错误,导致前面定义的变量到后面编译器不认识;对固有写法的拼写错误,如将运算符重载函数写为operetor,导致运算符重载不成功。 3.对一些模块的编写代码缺乏系统分析,主要体现在以下几个方面: (1)实数除法重载函数中没有考虑分母为0的情况,增加了if条件语句讨论; (2)实数求二次方根函数中没有考虑被开方数为负数的情况增加了if条件语句讨论; (3)求单个复数的向量角时没有将弧度制转化为角度制,定义了全局常变量i=3.1415927,通过弧度值除以i再乘以180将其转化为角度值; 求单个复数的向量角时没有考虑象限的讨论,最后加了if选择结构讨论; 求单个复数的向量角时没有分母(即实部real)为0的情况,增加了if条件语句讨论; 具体讨论程序如下(实部为real,虚部为 imag): float Angle1() /求单个复数的夹角度数 float y;coutthe result is: endl;y=atan(imag)/(real)/i*180;if(real=0&imag!=0)coutthe angle of (real+imagj) is 900)coutthe angle of (real+imagj) is yendl;if(real0)coutthe angle of (real+imagj) is y+180endl;if(real0&imag0)coutthe angle of (real+imagj) is y-180endl;return y; (4)在调用虚函数时,修改之前是基类指针指向子类指针的这一步骤写在基类、子类的定义部分,导致下面先调用基类虚函数,后调用子类虚函数时会出现调用的时同一部分,即基类的数据。修改后时将基类指针指向子类指针的这一步骤写在调用基类虚函数和调用子类虚函数之间,从而实现了虚函数和多态性。(5)为使程序可以连续运算而不是每算一次就得重新运行使用了while 循环,初始时将对象的地址赋给指针这一步骤写在while 循环之外,发现经过多次循环后指针所指的对象已经不是原来的了,为使指针总是指向要求的对象,就必须在每一次循环开始时将其重新定位,即指向对象的开头。综上述原因,最后将将对象的地址赋给指针这一步骤写在while 循环之内,从而问题得以解决。4.2算法的时间复杂性和可能的改进设想4.2.1算法的时间复杂性 1在主函数中的选择分支结构(本程序中未用switch结构,而是if结构)初始时为下面格式if( ).else if( ).else if( ).else if( ).else.以此来选择输入的指令并输出可能的错误形式,但考虑到上面结构可能会对运行速率造成影响,故改为以下形式: if( ).if( ).if( ). . if( != & != != & != != & != != & != != & != ). 来选择结构并输出可能的错误形式。 2.指针和虚函数的运用。4.2.2可能的改进思想 1.本程序在程序要求中明确说明要建立两个类,实数类和复数类。但个人认为可以直接建立一个复数类,并将两者所要求的函数全部归在这一个类中,因为实数可以用虚部为0的复数代替,唯一要加的就是为实数运算服务的函数使其运用默认参数的知识,令虚部的默认参数为了0即可。 2. 本程序在程序要求中明确说明要建立两个类,实数类和复数类。但个人认为可以仅仅建立一个复数类,不需要实数类,因为实数的运算可以直接定义函数来进行,而不是建立实数类再用类的成员函数来实现其母的。第五章 测试结果5.1错误处理5.1.1初始界面5.1.2错误处理一5.1.3错误处理二5.1.4错误处理三5.1.5退出系统5.2 测试数据(实数以3、7测试,若单个变量则取3;复数以-3-7j和5+5j测试,若单个变量取-3-7j)5.2.1实数部分 1.加法运算 2.减法运算 3.乘法运算4.除法运算5前置自增运算 6.前置自减运算 7后置自增运算 8后置自减运算 9求平方根运算 10.求平方运算 5.2.2复数部分 1.加法运算 2.减法运算 3.乘法运算 4.除法运算 5.求模长运算 6.求平方运算 7.求共轭复数运算 8.求单个复数向量角运算 9.求复数间夹角运算第六章 课程设计总结6.1三周程序编写及调试,在做“C+课程设计之复数计算器”这个项目中,发现的问题有以下几点:1.基本符号问题其一、本程序是在Microsoft Visual C+ 6.0上面完成的,这可以说是一款比较智能的编译系统了,但即使如此,仍有括弧忘写、误删、只有一个括弧的问题,若在其他编译系统中书写,可能错误会更多;其二、书写混乱,在较长的代码段不是很整齐,对后面的书写带来极大的不便。2.知识掌握深度问题其一、对指针虽初步掌握,但不熟,有一些原则性的失误,如:在循环中,指针从开头移到结尾后,第二次循环开始时需将其重新固定到开头,否则会随机赋值进行运算;其二、对虚函数和多态性掌握不彻底,对将子类的地址赋给基类指针这一步骤的代码 的位置在此前不是很清楚;其三、未弄清if语句和switch语句的优
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公关礼仪考试题及答案
- 工程制图自考试题及答案
- 高中竞赛班考试题及答案
- 员工培训与考核材料制作包
- 采购部供应商资质审查流程与表格汇编工具
- 2025年工厂入场考试试题及答案
- 2025年丙肝考试题库及答案
- 守信履约共赢承诺书5篇
- 住宅装潢服务承诺保证承诺书(4篇)
- 小区协作谋求和谐发展承诺书(6篇)
- 多图中华民族共同体概论课件第十三讲先锋队与中华民族独立解放(1919-1949)根据高等教育出版社教材制作
- 2024年山东济南轨道交通集团有限公司招聘笔试参考题库含答案解析
- 仿生机器鱼行业规模分析
- DZ-T 0270-2014地下水监测井建设规范
- 中英文员工评估表
- β内酰胺类抗菌药物皮肤试验指导原则(2021版)
- 小学语文论文:浅谈小学六年级语文有效教学
- 学生资助政策宣传主题班会PPT
- 大一统专题复习-高中历史教学资料
- YS/T 1018-2015铼粒
- 【高等数学练习题】沈阳大学专升本自考真题汇总(附答案解析)
评论
0/150
提交评论