复数计算器课程设计.docx
- 文档编号:10503069
- 上传时间:2023-02-17
- 格式:DOCX
- 页数:36
- 大小:232.61KB
复数计算器课程设计.docx
《复数计算器课程设计.docx》由会员分享,可在线阅读,更多相关《复数计算器课程设计.docx(36页珍藏版)》请在冰豆网上搜索。
复数计算器课程设计
1题目内容及设计要求
题目17复数计算器
内容及要求:
(1)所设计的复数计算器可以进行+-*+=-=*=++-->=<===!
=运算符,其中
>=<=是针对复数的模进行运算。
(2)设计输入重载函数,要求能接收从键盘输入a+bi形式的复数,在程序中可以识别
出实部虚部并正确赋值。
(3)设计计算器测试程序,对加减法进行测试,要求在两位数以内进行,对乘法进行测
试,乘法要求为一位数的运算。
(4)设计记录功能,可以记录下不同用户使用计算器的情况,记录以文件的形式保存在
计算机内,开机时要求用户输入用户名,显示该名户以前的记录。
用户记录用包括:
做了多
少次加减法、乘法、进行测试的次数,后3次的测试平均分等,在退出计算器程序时用心的
用户记录代替原有的记录。
2总体设计
2.1总体功能框图
根据题中任务的功能,首先要搞清复数的运算法则,
并使用c++语言表达。
复数包含实部与虚部,如何将这两部分表达出来也使关键
定义一个复数类complex。
声明所需成员函数和友元函数对各运算符进行重载。
定义各成员函数。
定义主函数,实现对整个程序的控制。
编译、运行并调试
2.2类的设计说明
classCComplex//定义命名空间NameCComplex
{
private:
doubleReal,Image;
public:
CComplex(doublereal=0,doubleimage=0)//构造函数
{
Real=real;Image=image;
}
friendistream&operator>>(istream&is,CComplex&com);//重载输入
friendostream&operator<<(ostream&os,CComplex&com);//重载输出
CComplexoperator+(CComplex&com);//加法重载
CComplexoperator-(CComplex&com);//减法重载
CComplexoperator*(CComplex&com);//乘法重载
CComplexoperator+=(CComplex&com);//加法赋值重载
CComplexoperator-=(CComplex&com);//减法赋值重载
CComplexoperator*=(CComplex&com);//乘法赋值重载
CComplexoperator++();//自加
CComplexoperator--();//自减
doublemod(void);//求复数的模
intoperator>(CComplex&com);
intoperator<(CComplex&com);
intoperator!
=(CComplex&com);
intoperator==(CComplex&com);
};
2.3主要算法流程图
。
。
。
。
。
。
图2-1算法流程图
3程序清单及注释
#include
#include
#include
#include
#include
#include
//#defineEPSlen-5//定义精度常数
usingnamespacestd;
namespaceNameCComplex//定义命名空间NameCComplex
{
/*-----------------------------------------------------------------------
|部分A:
|复数类CComplex的声明和定义,以及结构体类型用户User的定义
|
----------------------------------------------------------------------*/
/*---------------------------------
|复数类CComplex的声明
--------------------------------*/
classCComplex
{
private:
doubleReal,Image;//分别为复数的实部和虚部
public:
CComplex(doublereal=0,doubleimage=0)//构造函数
{
Real=real;Image=image;
}
friendistream&operator>>(istream&is,CComplex&com);//重载输入
friendostream&operator<<(ostream&os,CComplex&com);//重载输出
CComplexoperator+(CComplex&com);//加法重载
CComplexoperator-(CComplex&com);//减法重载
CComplexoperator*(CComplex&com);//乘法重载
CComplexoperator+=(CComplex&com);//加法赋值重载
CComplexoperator-=(CComplex&com);//减法赋值重载
CComplexoperator*=(CComplex&com);//乘法赋值重载
CComplexoperator++();//自加
CComplexoperator--();//自减
doublemod(void);
intoperator>(CComplex&com);
intoperator<(CComplex&com);
intoperator!
=(CComplex&com);
intoperator==(CComplex&com);
};
/*------------------------------------
|结构体类型用户User的定义
-----------------------------------*/
structUser
{
charszName[20];//用户名
intnTime;//使用次数
intnTest;//测试次数
doubledlAve;//平均成绩
intnAdd;//加法次数
intnSub;//减法次数
intnMul;//乘法次数
doubledlScore[3];//3次测试得分
}user;
/*---------------------------------------------------------------
|复数类CComplex的类外定义部分
---------------------------------------------------------------*/
//重载运算符“++”,实部与虚部均加1
CComplexCComplex:
:
operator++()
{
Real++;
Image++;
return*this;
}
//重载运算符“--”,实部与虚部均减1
CComplexCComplex:
:
operator--()
{
Real--;
Image--;
return*this;
}
//求复数的模,返回实部^2+虚部^2
doubleCComplex:
:
mod()
{
returnReal*Real+Image*Image;
}
//重载运算符“>”,比较模的大小
intCComplex:
:
operator>(CComplex&com)
{
if(mod()>com.mod())
return1;//若大,则返回1
else
return0;
}
//重载运算符“<”,比较模的大小
intCComplex:
:
operator<(CComplex&com)
{
if(mod() return1;//若小,则返回1 else return0; } //重载运算符“! =”,分别判断复数的实部与虚部 intCComplex: : operator! =(CComplex&com) { if(*this==com) return0; else return1; } //重载复数的输入,a+bi的形式 istream&operator>>(istream&is,CComplex&com) { cout<<"输入复数: "; chars[80]; is>>s;//用字符串的形式接收复数 intlen=strlen(s);//求出字符串的长度 intn=0,sign=1;//其中的n值为当前从字符串中提取出的数字,会在下面的while语句中得到确定的值 //sign为状态变量,表示数值的正负符号,以辅助辨认正负值 com.Image=com.Real=0; //判断接收的字符串是否合法 for(intk=0;k { if((s[k]<'0'||s[k]>'9')&&(s[k]! ='+'&&s[k]! ='-'&&s[k]! ='i')) { cout<<"error"< returnis;//错误,输出出错信息并返回 } } //顺序识别字符串中各字符 for(intk=0;k { if(n! =0&&(s[k]=='--'||s[k]=='+'))//当前字符是否为符号位 { com.Real=sign*n;//是符号位,且n! =0,即n已被赋值(通过下面的whlie语句),表明当前读取的是虚部的符号 n=0;//将原n*sign值(带正负号的数值)赋给实部后,将n清零,准备下一次继续接收并判断是否为虚部的值 } if(s[k]=='-')//当前字符若为负号 { sign=-1;k++;//给符号标志变量sign赋值,表示为负数 } if(s[k]=='+')//当前字符若为正号 { sign=1;k++;//给符号标志变量sign赋值,表示为正数 } 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',表示复数对象内只有实部,没有虚部,如: -a com.Real=n*sign; returnis; } //重载复数的输出 ostream&operator<<(ostream&os,CComplex&com) { if(fabs(com.Image)==0)//如果虚部为0 os< elseif(fabs(com.Real)==0)//如果实部为0 os< elseif(com.Image>0) os< else os< returnos; } //加法重载 CComplexCComplex: : operator+(CComplex&com) { CComplexsum; sum.Real=Real+com.Real;//实部相加 sum.Image=Image+com.Image;//虚部相加 returnsum; } //乘法重载 CComplexCComplex: : operator*(CComplex&com) { CComplexmulti; multi.Real=Real*com.Real-Image*com.Image;//乘积实部 multi.Image=Real*com.Image+Image*com.Real;//乘积虚部 returnmulti; } //减法重载 CComplexCComplex: : operator-(CComplex&com) { CComplexsub; sub.Real=Real-com.Real;//实部相减 sub.Image=Image-com.Image;//虚部相减 returnsub; } //加法赋值重载 CComplexCComplex: : operator+=(CComplex&com) { Real=Real+com.Real;//实部 Image=Image+com.Image;//虚部 return*this; } //减法赋值重载 CComplexCComplex: : operator-=(CComplex&com) { Real=Real-com.Real;//实部 Image=Image-com.Image;//虚部 return*this; } //乘法赋值重载 CComplexCComplex: : operator*=(CComplex&com) { doublenReal=Real*com.Real-Image*com.Image;//乘积实部 doublenImage=Real*com.Image-Image*com.Real;//乘积虚部 Real=nReal; Image=nImage; return*this; } //重载==运算符,分别比较两个复数对象的实部和虚部 intCComplex: : operator==(CComplex&com) { if(Real==com.Real&&Image==com.Image) return1;//实部与虚部部分相等,则返回1 else return0; } /*---------------------------------------------------------------------------- |部分B: |测试函数voidTest(void) |实现复数的加法函数voidAdd() |实现复数的减法函数voidSub() |实现复数的乘法函数voidMul() |实现复数的自加函数voidAdd1() |比较两个复数的大小函数voidCompare() |输出本次用户使用计算器的情况记录voiduserprint() |当前用户使用完计算器,保存或更新用户资料函数voidSaveFile() | ----------------------------------------------------------------------------*/ //测试函数,随机出10道运算题,可以打分 voidTest(void) { user.nTest++;//用户测试次数加1 cout<<"共10道题,作10以内的加减运算,满分100分: \n"; doublereal1,real2,image1,image2,real3,real4,image3,image4;//1和2分别代表两个待相加的复数的实部和虚部,3和4则为相乘 CComplexanswer,temp; intscore=0; charop; for(inti=0;i<=9;i++) { real1=rand()%200-100;//产生的随机数是两位数,可以是正数或负数 image1=rand()%200-100; real2=rand()%200-100; image2=rand()%200-100; CComplexa(real1,image1),b(real2,image2);//用产生的随机数对象分别初始化两个复数对象 real3=rand()%20-10;//产生的随机数是一位数,可以是正数或负数 image3=rand()%20-10; real4=rand()%20-10; image4=rand()%20-10; CComplexc(real3,image3),d(real4,image4); op=rand()%3;//随机产生3种运算符 switch(op) { case0: answer=a+b;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 复数 计算器 课程设计