资源描述
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,则能够不退出一直使用复数计算器
}
展开阅读全文