C++课设报告书复数类的设计与实现_第1页
C++课设报告书复数类的设计与实现_第2页
C++课设报告书复数类的设计与实现_第3页
C++课设报告书复数类的设计与实现_第4页
C++课设报告书复数类的设计与实现_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

成绩评定表学生姓名李勇强班级学号1103060215专业通信工程课程设计题目复数类的设计与实现评语组长签字:成绩日期20年月日

课程设计任务书学院信息科学与工程学院专业通信工程学生姓名李勇强班级学号1103060215课程设计题目复数类的设计与实现实践教学要求与任务设计一个复数类,复数类的数据成员是real和imag,它们的数据类型是double,分别表示复数的实部和虚部,要求如下:(1)编写一个带有缺省参数的构造函数,默认值为(0,0),实现一个复数的构造。(2)编写一个拷贝构造函数,实现一个复数的拷贝构造。(3)编写一个析构函数,在函数中输出(real,imag)被析构,例如:如果复数的实部为1,虚部为2,则被析构时程序输出:“(1,2)被析构”。(4)重载运算符“+”为复数类的成员函数,其功能是返回两个复数的相加的结果。(5)重载运算符“-”为复数类的成员函数,其功能是返回两个复数的相减的结果。(6)重载运算符“*”为复数类的友元函数,其功能是返回两个复数的相乘的结果。(7)重载运算符“/”为复数类的友元函数,其功能是返回两个复数的相除的结果。(8)重载单目运算符“-”为复数类的友元函数,其功能是返回当前复数的相反数。(9)重载运算符“>>”为复数类的友元函数,其功能是按照以格式(real,imag)。(10)输入复数。例如:如果复数的实部为1,虚部为2,则输入的格式是“(1,2)”。(11)重载运算符“<<”为复数类的友元函数,其功能是按照以格式(real,imag)(12)输出复数。例如:如果复数的实部为1,虚部为2,则输出的结果是“(1,2)”。(13)以上函数在类的内部写出函数原型,在类的外部写出函数实现代码,最后编写一个主函数main测试以上的函数功能。工作计划与进度安排第17周:分析题目,查阅课题相关资料,进行类设计、算法设计;第18周:程序的设计、调试与实现;第19周:程序测试与分析,撰写课程设计报告,进行答辩验收。指导教师:201年月日专业负责人:201年月日学院教学副院长:201年月日摘要本文采用了C++语言来完成复数类的设计与实现。首先设计了复数类,在类中定义了复数的实部和虚部,然后在类中设计构造函数和析构函数用于对象的初始化和清理,类中的重载运算符函数用于实现对复数的一些基本运算和输入输出。程序分别采用VisualC++6.0的控制台工程和MFC工程来运行。最终,通过对两种程序的测试结果表明:复数类的方法函数设计正确,两种程序均能正确实现复数类方法函数的功能。关键词:复数;复数类;控制台工程;MFC工程

目录1需求分析 12算法基本原理 13类设计 24基于控制台的应用程序 34.1类的接口设计 34.2类的实现 44.3主函数设计 64.4基于控制台的应用程序测试 75基于MFC的应用程序 85.1基于MFC的应用程序设计 95.1.1MFC程序界面设计 95.1.2MFC程序代码设计 125.2基于MFC的应用程序测试 15结论 19参考文献 201需求分析(1)构造函数可以用于给对象赋初值;析构函数可以用于对象的生命期结束时,做一些清理工作;拷贝构造函数可以用于复制对象。(2)类中重载运算符“+”、“-”、“*”、“/”的函数,可以依据复数的四则运算法则设计函数内部代码。(3)复数的相反数为复数的实部与虚部分别取相反数。(4)整个程序可以通过构建复数类,类中定义数据成员(复数的实部、虚部),设计方法,实现复数类对象的构造、析构,复数的加减乘除、取相反数的运算。并通过重载流提取运算符和流插入运算符,来进行复数的输入和输出。(5)要求类的声明与实现相分离,可以将其保存在不同的文件中,并在类的实现文件中包含类的声明头文件。算法基本原理(1)构造函数是一种特殊的成员函数,在建立对象时自动执行。其名字与类名同名,不具有任何类型,不返回任何值。构造函数中参数的值可以指定为默认值。拷贝构造函数只有一个参数,这个参数是本类的对象(一般约定加const声明)。(2)析构函数也是一个特殊的成员函数,其名字是类名前加一个“~”符号。构造函数不返回任何值,无函数类型和函数参数。当对象的生命期结束时,自动执行析构函数。(3)运算符重载的方法是定义一个重载运算符的函数,在需要执行被重载的运算符时,系统就自动调用该函数。(4)复数的加法法则:设z1=a+bi,z2=c+di是任意两个复数,则它们的和为(a+bi)+(c+di)=(a+c)+(b+d)i。两个复数的和依然是复数,它的实部是原来两个复数实部的和,它的虚部是原来两个虚部。(5)复数的减法法则:设z1=a+bi,z2=c+di是任意两个复数,则它们的差是(a+bi)-(c+di)=(a-c)+(b-d)i。两个复数的差依然是复数,它的实部是原来两个复数实部的差,它的虚部是原来两个虚部的差。(6)复数的乘法法则:设z1=a+bi,z2=c+di是任意两个复数,那么它们的积(a+bi)(c+di)=(ac-bd)+(bc+ad)i。把两个复数相乘,类似两个多项式相乘,结果中i^2=−1,把实部与虚部分别合并。两个复数的积依然是一个复数。(7)复数的除法法则:设z1=a+bi,z2=c+di是任意两个复数,满足(c+di)(x+yi)=(a+bi)的复数x+yi(x,y∈R)叫复数a+bi除以复数c+di的商。其具体运算方法为:将分子和分母同时乘以分母的共轭复数,再分别对分子和分母应用乘法法则运算,即(a+bi)/(c+di)=[(a+bi)(c-di)]/[(c+di)(c-di)]=[(ac+bd)+(bc-ad)i]/(c^2+d^2)。两个复数的商依然是一个复数。(8)复数取相反数法则:设z1=a+bi是任意复数,则其相反数为-a-bi,即复数的实部与虚部分别取相反数。3类设计从上面的算法分析可以看到,本设计的关键是复数类的方法函数的设计。可以定义一个复数类Complex,类中定义私有数据成员real和imag,它们的数据类型是double,分别表示复数的实部和虚部。类中应包括的成员函数有带有缺省参数的构造函数Complex(doubler=0,doublei=0),拷贝构造函数Complex(constComplex&),析构函数~Complex(),重载运算符“+”的函数Complexoperator+(Complex&),重载运算符“-”的函数Complexoperator-(Complex&)。类中应包括的友元函数有重载运算符“*”的函数friendComplexoperator*(Complex&,Complex&),重载运算符“/”的函数friendComplexoperator/(Complex&,Complex&),重载单目运算符“-”的函数friendComplexoperator-(Complex&),重载流提取运算符“>>”的函数friendistream&operator>>(istream&,Complex&),重载流插入运算符“<<”的函数friendostream&operator<<(ostream&,Complex&)。以上各函数的访问属性都设置为公用类型。并且在类的内部写出函数原型,在类的外部写出函数实现代码。4基于控制台的应用程序整个程序分为三个独立的文档。Fushu.h文件中包括复数类Complex的声明;Fushu.cpp文件中包括这个类的成员函数和友元函数实现文件;main.cpp文件包括程序的主函数。主函数中定义类Complex的对象,通过对象测试类的各函数的功能。4.1类的接口设计//Fushu.h文件,实现类的声明#include<iostream.h>classComplex//复数类Complex声明{private:doublereal;//复数的实部 doubleimag;//复数的虚部public://外部接口 Complex(doubler=0,doublei=0);//声明带有缺省参数的构造函数,默认值//为(0,0) Complex(constComplex&cop);//声明拷贝构造函数 ~Complex();//声明析构函数 Complexoperator+(Complex&c2);//声明重载运算符“+”的函数Complexoperator-(Complex&c2);//声明重载运算符“-”的函数friendComplexoperator*(Complex&c1,Complex&c2);//声明重载运算符“*”//为复数类的友元函数friendComplexoperator/(Complex&c1,Complex&c2);//声明重载运算符“/”//为复数类的友元函数friendComplexoperator-(Complex&c);//声明重载单目运算符“-”为复数类的//友元函数friendistream&operator>>(istream&,Complex&);//声明重载运算符“>>”为复//数类的友元函数 friendostream&operator<<(ostream&,Complex&);//声明重载运算符“<<”为//复数类的友元函数};类中定义私有数据成员real和imag,它们的数据类型是double,分别表示复数的实部和虚部。类中声明了各成员函数和友元函数,且访问属性都设置为公用类型。4.2类的实现//Fushu.cpp文件,类实现#include"Fushu.h" //包含类的声明头文件Complex::Complex(doubler,doublei)//定义带有缺省参数的构造函数{real=r;//给复数实部赋初值imag=i;//给复数虚部赋初值}Complex::Complex(constComplex&cop)//定义拷贝构造函数{real=cop.real;//实现复数实部的拷贝imag=cop.imag;//实现复数虚部的拷贝}Complex::~Complex()//定义析构函数{cout<<"("<<real<<","<<imag<<")"<<"被析构"<<endl;//在函数中输出(real,//imag)被析构}ComplexComplex::operator+(Complex&c2)//定义重载运算符“+”的函数{returnComplex(real+c2.real,imag+c2.imag);//建立一个临时的无名对象。在建立//临时对象过程中将两个复数相加的结果作为实参调用//构造函数。return语句将此临时对象作为函数返回值。}ComplexComplex::operator-(Complex&c2)//定义重载运算符“-”的函数{returnComplex(real-c2.real,imag-c2.imag);//建立一个临时的无名对象。在建立临时//对象过程中将两个复数相减的结果作为实参调用构造//函数。return语句将此临时对象作为函数返回值。}Complexoperator*(Complex&c1,Complex&c2)//定义重载运算符“*”为复数类//的友元函数{doublex,y;//定义两个变量,分别表示两个复数积的实部和虚部x=c1.real*c2.real-c1.imag*c2.imag;//两个复数积的实部y=c1.real*c2.imag+c1.imag*c2.real;//两个复数积的虚部returnComplex(x,y);//建立一个临时的无名对象。在建立临时对象过程调用构造//函数。return语句将此临时对象作为函数返回值。}Complexoperator/(Complex&c1,Complex&c2)//定义重载运算符“/”为复数类的//友元函数{doublex,y;//定义两个变量,分别表示两个复数商的实部和虚部x=(c1.real*c2.real+c1.imag*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag);//两个复数//商的实部y=(c1.imag*c2.real-c1.real*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag);///两个复数//商的虚部returnComplex(x,y);}Complexoperator-(Complex&c)//定义重载单目运算符“-”为复数类的友元函数{returnComplex(-c.real,-c.imag);}istream&operator>>(istream&input,Complex&c)//定义重载运算符“>>”为复数类//的友元函数{input.ignore();//调用istream类的成员函数ignore函数,跳过输入流中//一个字符input>>c.real;input.ignore();input>>c.imag;input.ignore(3,'\n');//跳过输入流中'\n'之前(包括'\n')的字符returninput;}ostream&operator<<(ostream&output,Complex&c)//定义重载运算符“<<”为复数//类的友元函数{output<<"("<<c.real<<","<<c.imag<<")";//以格式(real,imag)输出复数returnoutput;}在重载运算符“>>”的函数中,由于要按照以格式(real,imag)输入复数,所以在提取输入流中的字符时,必须先跳过字符“(”,再将输入流中第1个数据赋值给复数的实部,然后跳过字符“,”,再将输入流中第2个数据赋值给复数的虚部,此时,输入流中还剩有字符“)”和结束符“\n”,为了下次能成功为复数的实部和虚部赋值,必须将它们跳过,所以调用函数ignore(3,'\n')。另外,在重载运算符“+”、“-”、“*”、“/”、和单目运算符“-”的函数中,为了在最终测试时,每调用完一次重载运算符只执行一次析构函数,所以在函数中都没有定义有名的对象,而是建立一个临时的无名对象。在建立临时对象过程中将两个复数运算的结果作为实参调用构造函数。return语句将此临时对象作为函数返回值。4.3主函数设计//main.cpp主函数#include"Fushu.h"intmain()//主函数{Complexc0;//建立Complex类对象c0,没有给定实参cout<<"c0="<<c0<<endl;//输出对象c0的值,测试重载运算符“<<”的函数Complexc1(11,44);//建立对象c1,给定2个实参cout<<"c1="<<c1<<endl;//输出对象c1的值cout<<"inputcomplexnumberc1:";cin>>c1;为c1重新赋值,测试重载运算符“>>”的函数cout<<"c1="<<c1<<endl;Complexc2(c1);建立对象c2,用c1初始化c2,测试拷贝构造函数cout<<"c2="<<c2<<endl;cout<<"-c2="<<-c2<<endl;//输出c2的相反数,测试重载单目运算符“-”的函数cout<<"inputcomplexnumberc2:";cin>>c2;//为c2重新赋值cout<<"c1+c2="<<c1+c2<<endl;//输出c1+c2的和cout<<"c1-c2="<<c1-c2<<endl;//输出c1-c2的差cout<<"c1*c2="<<c1*c2<<endl;//输出c1*c2的积cout<<"c1/c2="<<c1/c2<<endl;//输出c1/c2的商return0;}在程序的主函数部分,首先建立了对象c0,没有给定实参,测试缺省参数的构造函数,默认值为(0,0),通过输出c0的值来观察正确性;同时,通过输出c0的值也测试了重载运算符“<<”的函数的正确性。然后新建立了对象c1,给定了2个实参,再次调用缺省参数的构造函数,而这次复数实部和虚部的值都通过实参给定,输出c1的值以观察正确性。再输入c1的值,为c1重新赋值,测试重载运算符“>>”的函数。新建立对象c2,用c1初始化c2,测试拷贝构造函数。输出c2的相反数,测试重载单目运算符“-”的函数,在输出c2的相反数后,执行-c2的析构函数。再次输入c2的值,为c2重新赋值。然后,分别依次输出c1、c2的和、差、积、商,测试重载运算符“+”、“-”、“*”、“/”的函数,每输出一次结果,就执行一次各自的析构函数。最后,分别执行对象c2、c1、c0的析构函数。4.4基于控制台的应用程序测试程序运行结果如图1所示。图1程序运行结果通过程序的运行结果可以看出,在main函数中,通过对象c0(不给定实参)、c1(给定两个实参)测试了缺省参数的构造函数;直接用运算符“<<”、“>>”输出、输入对象的值,测试了重载运算符“<<”、“>>”函数;通过对象c2,测试了拷贝构造函数;又通过输出c2的相反数,测试了重载单目运算符“-”的函数;分别输出c1、c2的和、差、积、商,依次测试了重载运算符“+”、“-”、“*”、“/”函数,并且,从“-c2”开始每输出一次运行结果,就调用一次各自的析构函数,在程序的最后,分别执行对象c2、c1、c0的析构函数,测试了析构函数的功能。最终,通过主函数main的测试,证明了类中各函数功能的正确性。5基于MFC的应用程序随着应用程序复杂性的增加,Win32应用程序代码也必然越复杂。为了帮助用户处理那些经常使用且复杂繁琐的各种Windows操作,VisualC++设计了一套基础类库MFC,把传统的Windows编程规范中的大多数内容封装成为各种类。MFC图形界面程序与DOS界面程序的输入输出方式不同,DOS界面程序采用字符交互式实现数据输入输出,MFC的图形程序界面采用标准Windows窗口和控件实现输入输出。因此应先在MFC类的框架下加入所设计的复数类,再通过图形界面的输入输出改造来完成。5.1基于MFC的图形界面程序设计5.1.1MFC程序界面设计首先在VC中建立MFCAppWizard(exe)工程,名称为FS_Jisuanqi,并在向导的Step1中选择Dialogbased,即建立基于对话框的应用程序,如下图2~3所示。图2建立MFCAppWizard(exe)工程图3建立基于对话框的应用程序在对话框模板处右击鼠标,从弹出的快捷菜单中选择“属性”菜单项,出现如图4所示的对话框属性窗口。将对话框标题改为“复数计算器”。图4对话框属性窗口将对话框资源中的默认对话框利用工具箱改造成如下界面,如图5所示。图5复数计算器界面设计图5所示的界面中包含了10个StaticText控件,2个GroupBox控件,2个Picture控件,7个Button控件,和6个EditBox控件,控件的基本信息列表如下表1所示。表1控件基本信息控件类别控件ID控件Caption说明StaticTextIDC_STATIC实部虚部复数1:,复数2:,实部虚部运算结果:,GroupBoxIDC_STATIC数据输入区基本运算PictureIDC_STATIC一条水平线一条水平线BottonIDC_BUTTON_fuzhi复制将复数1中的数据复制到复数2中IDC_BUTTON_jia+计算两个复数和IDC_BUTTON_jian-计算两个复数差IDC_BUTTON_cheng*计算两个复数积IDC_BUTTON_chu/计算两个复数商IDC_BUTTON_fanshu1:相反数计算复数1的相反数IDC_BUTTON_Exit退出EditBoxIDC_EDIT_r1复数1的实部IDC_EDIT_i1复数1的虚部IDC_EDIT_r2复数2的实部IDC_EDIT_i2复数2的虚部IDC_EDIT_R运算结果的实部IDC_EDIT_I运算结果的虚部5.1.2MFC程序代码设计为了能够将对话框界面上的控件与代码联系起来,需要为6个EditBox控件建立MemberVariables,按Ctrl+w键进入MFCClassWizard界面,选择MemberVariables选项卡,可显示成员变量设置界面,如图6所示。图6成员变量设置界面通过该界面设置与6个EditBox控件对应的成员变量,具体如表2所示。表2控件基本信息控件ID成员变量类型成员变量名称IDC_EDIT_r1doublem_real1IDC_EDIT_i1doublem_imag1IDC_EDIT_r2doublem_real2IDC_EDIT_i2doublem_imag2IDC_EDIT_Rdoublem_RrealIDC_EDIT_Idoublem_Rimag下面是编写代码的重要阶段,可以借鉴在设计基于DOS界面的控制台应用程序的代码,并将其作必要的改写,具体改写的步骤与内容如下。①将Fushu.h文件和Fushu.cpp文件合并成一个文件,重新命名为Fushu.h,并将其加入MFC工程。②修改Fushu.h文件具体包括:将析构函数的函数声明和定义注释掉,因为在图形界面的程序上已经不能用cout流输出了;将重载运算符“>>”、“<<”的函数声明和定义注释掉,同样,在图形界面的程序上已经不能用cin流和cout流来输入输出;由于Complex类中的数据成员为私有类型,所以,添加两个Complex类成员函数,分别用于返回Complex类对象的实部和虚部。这样便能在按钮的消息映射函数中输出复数的值。其具体代码如下:doubleComplex::display_real(){ returnreal;}doubleComplex::display_imag(){ returnimag;}以上两个函数在类的内部写出函数原型,在类的外部写出函数实现代码。③在对话框类的实现文件FS_JisuanqiDlg.cpp中加入#include"Fushu.h",以实现在该文件中可使用Complex类。④添加按钮的消息映射函数,按快捷键Ctrl+W,打开MFCClassWizard界面,选择MessageMaps选项卡,可显示成员函数设置界面,如图7所示。图7成员函数设置界面⑤编写复制按钮的消息处理函数,实现将复数1中的数据复制到复数2中,具体代码如下voidCFS_JisuanqiDlg::OnBUTTONfuzhi(){ //TODO:Addyourcontrolnotificationhandlercodehere UpdateData();//调用函数,使数据由控件向相关联的成员变量复制 Complexc1(m_real1,m_imag1);//建立Complex类对象,用输入的复数//1的值初始化 Complexc2(c1);//建立对象c2,调用拷贝构造函数,用c1初始化c2 m_real2=c2.display_real();//将对象c2的实部赋值给成员变量m_real2 m_imag2=c2.display_imag();//将对象c2的虚部赋值给成员变量m_imag2 UpdateData(FALSE);//调用函数,使数据由控件相关联的成员变量向控件复制}⑥与编写复制按钮的消息处理函数类似,分别编写加、减、乘、除按钮的消息处理函数。下面是“加”按钮的消息处理函数代码,减、乘、除以此类推,只是将代码中“+”分别换成“-”、“*”、“/”。voidCFS_JisuanqiDlg::OnBUTTONjia(){ //TODO:Addyourcontrolnotificationhandlercodehere UpdateData(); Complexc1(m_real1,m_imag1); Complexc2(m_real2,m_imag2); Complexc3; c3=c1+c2;//调用重载运算符“+”函数,实现求两个复数的和 m_Rreal=c3.display_real(); m_Rimag=c3.display_imag(); UpdateData(FALSE);}编写求复数1的相反数按钮的消息处理函数代码如下:voidCFS_JisuanqiDlg::OnBUTTONfanshu(){ //TODO:Addyourcontrolnotificationhandlercodehere UpdateData(); Complexc1(m_real1,m_imag1); Complexc2; c2=-c1;//调用重载单目运算符“-”函数,实现求复数的相反数 m_Rreal=c2.display_real(); m_Rimag=c2.display_imag(); UpdateData(FALSE);}⑦编写退出按钮的消息处理函数,具体代码如下:voidCFS_JisuanqiDlg::OnBUTTONExit(){ //TODO:Addyourcontrolnotificationhandlercodehere DestroyWindow();//DestroyWindow是对话框基类CWnd的一个成员函数,用//来终止窗口。}5.2基于MFC的应用程序测试运行程序后,首先出现的界面如图8所示。图8程序初始运行界面在复数1中输入数据,按“复制”按钮,将复数1中的数据复制到复数2中,结果如图9所示。图9单击“复制”按钮后的界面在复数2中输入数据,单击“+”按钮,实现求解并将结果显示出来,如图10所示。图10单击“+”按钮后的界面分别单击“-”、“*”、“/”按钮,结果如图11、图12、图13所示。图11单击“-”按钮后的界面图12单击“*”按钮后的界面图13单击“/”按钮后的界面单击“1:相反数”按钮后,结果如图14所示

温馨提示

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

评论

0/150

提交评论