C课程设计复数计算器.docx
《C课程设计复数计算器.docx》由会员分享,可在线阅读,更多相关《C课程设计复数计算器.docx(23页珍藏版)》请在冰点文库上搜索。
C课程设计复数计算器
C++课程设计实验报告
姓名学号班级
合作者学号班级
任课教师时间
教师指定题目复数计算器评定难易级别A级
实验报告成绩
复数计算器
程序功能设计
1.
2.程序功能的总体结构
复数计算器的程序总体功能可设计成如图1所示,可以看出,复数计算器的各种功能都用菜单选项列出,用户可以根据需要选择相应的菜单项,从而执行不同的子程序以完成相应的功能。
2.课程设计要求
(1)
(2)一开始运行程序,要有详细的菜单选项界面,用户不选择退出就可以反复运算。
(3)
(4)可以进行多个操作数的复数运算,输入0+0*i时为止。
(5)
(6)编写可以对输入的复数求模的成员函数。
(7)
(8)编写具有测试功能的函数,即计算机能够自动出题,并要求用户计算,同时计算机判断用户计算的对错并打分,要求十题为一个单元,每题一个运算符,运算符包括+,-,*三种,参与加减运算实部虚部为一位数。
(9)
(10)重载输入输出运算符,对复数的输入既可采用实部虚部分开提示输入,也可直接输入诸如a+i*b或a+ib这种形式,对复数的输出要考虑实部虚部的正负号,通过判断给出的输出结果。
开始
输出菜单及提示信息
输入选择
是否做加法
N
是否做减法
N
Y
是否进行测试
N
加法子程序Add()
Y
......……
减法子程序
Y
测试子程序
是否退出
N
Y
结束
3.
4.程序设计思想
1)类的封装
程序中将复数形式的数据定义成一个复数类CComplex,重载了加法及减法等运算符,使函数的加减等运算像一般数据一样方便.每个运算符重载都用一个函数去实现。
参考类的定义如下:
classCComplex{
private:
doubleReal,Image;
public:
CComplex(doublereal=0,doubleimage=0)–i.I等形式。
重载输入运算符应该能识别这样形式多样的复数。
所以在重载输入函数时要综合考虑上述各种输入形式。
可行的处理方式是:
在重载输入函数中,设计用
(3)设计的任务要求2
在程序中设计一个复数运算的测试函数Test(),其功能是让计算机随机出10道运算题,用户给出答案,同时计算机实时判断对错并可以打分。
这个函数的关键是让计算机随机产生复数对象和运算符,计算机内部有一个随机数发生器,可以产生一个固定顺序的整型随机数序列,调用语句为“inta=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
两对象相减
两对象相加
用户输入结果
用户输入结果
结果是否正确
结果是否正确
NN
输出出错信息
输出出错信息
输出出错信息
YY
总分加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
5.
6.程序界面
开始界面
运行结果界面
4.程序源代码及详细注解:
#include<>
#include<>
#include<>
#include<>
#defineZ1e-6
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);//除法重载
intoperator==(CComplex&com);
intoperator!
=(CComplex&com);
intoperator>(CComplex&com);
intoperator<(CComplex&com);
floatModule(void);//复数求模
};
CComplexCComplex:
:
operator+(CComplex&com)//加法重载
{
CComplext;//定义类对象
=Real+;//实部相加
=Image+;//虚部相加
returnt;
}
CComplexCComplex:
:
operator-(CComplex&com)//减法重载
{
CComplext;//定义类对象
=;//实部相减
=;//虚部相减
returnt;
}
CComplexCComplex:
:
operator*(CComplex&com)//乘法重载
{
CComplext;//定义类对象
=Real*//乘法实部
=Real*+Image*;//乘法虚部
returnt;
}
CComplexCComplex:
:
operator/(CComplex&com)//除法重载
{
CComplext;//定义类对象
=(Real*+Image*/*+*;//除法实部
=(Image**/*+*;//除法虚部
returnt;
}
/*intCComplex:
:
operator!
=(CComplex&com)//重载“!
=”运算符,分别判断复数的实部与虚部
{
if(*this==com)
return0;
else
return1;
}*/
intCComplex:
:
operator>(CComplex&com)//重载“>”运算符,比较复数的模
{
if(Module()>())
return1;//大于,则返回1
else
return0;
}
intCComplex:
:
operator<(CComplex&com)//重载“<”运算符,比较复数的模
{
if(Module()<())
return1;//小于,则返回1
else
return0;
}
floatCComplex:
:
Module()
{
floatt;
t=sqrt(Real*Real+Image*Image);
returnt;
//();
//();
}
intCComplex:
:
operator==(CComplex&com)//重载“==”运算符,分别判断两个复数对象的实部与虚部
{
if(Real==&&Image==
return1;//实部与虚部分别相等返回1
elsereturn0;
}
voidAdd(){
CComplexa1,a2,sum,f(0,0);
cout<<"加法计算"<cout<<"第一个复数"<cin>>a1;
cout<<"第二个复数"<cin>>a2;
sum=a1+a2;
cout<<"第三个复数"<cin>>a1;
inti=4;
while(!
(a1==f)){
sum=sum+a1;
cout<<"第"<
cin>>a1;
i++;
}
cout<<"结果"<cout<<"按任意键继续"<//();
();
}
voidSub(){
CComplexa1,a2,sub,f(0,0);
cout<<"减法计算"<cout<<"第一个复数"<cin>>a1;
cout<<"第二个复数"<cin>>a2;
sub=a1-a2;
cout<<"第三个复数"<cin>>a1;
inti=4;
while(!
(a1==f)){
sub=sub-a1;
cout<<"第"<
cin>>a1;
i++;
}
cout<<"结果:
"<cout<<"按任意键继续"<//();
();
}
voidMul(){
CComplexa1,a2,mul,f(0,0);
cout<<"乘法计算"<cout<<"第一个复数"<cin>>a1;
cout<<"第二个复数"<cin>>a2;
mul=a1*a2;
cout<<"第三个复数"<cin>>a1;
inti=4;
while(!
(a1==f)){
mul=mul*a1;
cout<<"第"<
cin>>a1;
i++;
}
cout<<"结果:
"<cout<<"按任意键继续"<//();
();
}
voidDiv(){
CComplexa1,a2,div,f(0,0);
cout<<"除法计算"<cout<<"第一个复数"<cin>>a1;
cout<<"第二个复数"<cin>>a2;
div=a1/a2;
cout<<"第三个复数"<cin>>a1;
inti=4;
while(!
(a1==f)){
div=div/a1;
cout<<"第"<
cin>>a1;
i++;
}
cout<<"结果:
"<
cout<<"按任意键继续"<//();
();
}
voidCompare(void)
{
cout<<"复数模比较"<CComplexa1,a2;
cout<<"输入两个复数:
"<cout<<"第一个复数:
";
cin>>a1;
cout<<"第二个复数";
cin>>a2;
if(a1==a2)
cout<<"这两个复数相等"<elseif(a1>a2)
cout<elseif(a1cout<cout<<"按任意键继续"<();
}
istream&operator>>(istream&is,CComplex&com){//重载输入,可以输入a+bi,也可以输入a+b*i
chars[100];
is>>s;//字符串s用于接收复数
intlen=strlen(s);
intn=0,sign=1;//n为当前从字符串中提取出来的数字,初始化为0;sign为n的符号,初始化为正
==0;
if(len==4)
{
for(intk=0;k{
if((s[k]<'0'||s[k]>'9')&&(s[k]!
='+'&&s[k]!
='-'&&s[k]!
='i'))
{
cout<<"Error"<returnis;
}
}
for(k=0;k{
if(n!
=0&&(s[k]=='-'||s[k]=='+'))//判断是否为符号位
{
=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
=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,表示复数只有实部,没有虚部
=n*sign;
returnis;
}
else
{
for(intk=0;k{
if((s[k]<'0'||s[k]>'9')&&(s[k]!
='+'&&s[k]!
='-'&&s[k]!
='i'&&s[k]!
='*'))
//若字符串不是1~9的数字或“+”、“-”、“=”、“*”则错误,输出Error
{
cout<<"Error"<returnis;
}
}
for(k=0;k{
if(n!
=0&&(s[k]=='-'||s[k]=='+'))//判断是否为符号位
{
=sign*n;
n=0;
}
if(s[k]=='-')
{
sign=-1;k++;//给符号标志赋值
}
if(s[k]=='+')
{
sign=1;k++;//给符号标志赋值
}
if(s[k]=='*')//若当前字符为*
{
k++;
=sign*n;
}
if(s[k]=='i')//若当前字符为i
{
if(k!
=len-1)//判断i是否为最后一个字符
cout<<"error\n";//若不是,则复数输入格式错误
//else
//=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,表示复数只有实部,没有虚部
=n*sign;
returnis;
}
}
ostream&operator<<(ostream&os,CComplex&com)//重载输出
{
if(fabsos<<;//只输出实部;
elseif((fabsos<<<<"i";//只输出虚部
elseif>0)
os<<<<"+"<<<<"i";//虚部为正,用“+”连接实部与虚部
else
os<<<<<<"i";//虚部为负,虚部的符号连接实部与虚部
returnos;
}
voidTest(void)
{
doublereal1,real2,real3,real4,image1,image2,image3,image4;
CComplexanswer,f5;
intscore=0;
charop;
for(inti=1;i<=10;i++){
real1=rand()%200-100;//产生随机的两位数,可正可负
image1=rand()%200-100;
real2=rand()%200-100;
image2=rand()%200-100;
CComplexf1(real1,image1),f2(real2,image2);
//用随机产生的两位数初始化类对象
real3=rand()%20-10;
//产生随机的一位数
image3=rand()%20-10;
real4=rand()%20-10;
image4=rand()%20-10;
CComplexf3(real3,image3),f4(real4,image4);
//用随机产生的一位数初始化类对象
op=rand()%3;//随即产生3种运算符
cout<<"第"<
";
switch(op){
case0:
answer=f1+f2;
cout<break;
case1:
answer=f1-f2;
cout<break;
case2:
//乘法用实部、虚部都是一位的对象
answer=f1*f2;
cout<break;
}
cin>>f5;
if(answer==f5){//判断结果是否正确
cout<<"此题做对了"<<'\n';
cout<<"加十分:
"<<'\n';
score+=10;}//正确,加十分
else
{
cout<<"此题做错了"<<'\n';
cout<<"不得分:
"<<'\n';//错误,不得分
}
}
cout<<"你的最后得分为:
"<}
voidmain(void)//输出程序主菜单,并接收用户选择
{
charinput;
CComplexa,b,c,d,e,f,g;
system("cls");
cout<<"\t这是一个复数计算器程序,拥有以下功能,请按照菜单选择进入功能。
"<cout<<"=================================MENU======================================"<cout<<"1:
复数求模"<cout<<"2:
多复数连加运算"<cout<<"3:
多复数连减运算"<cout<<"4:
多复数连乘运算"<cout<<"5:
多复数连除运算"<cout<<"6:
进入复数计算测试(一次十题)"<cout<<"7:
复数比较:
"<cout<<"8:
退出"<cout<<"请选择"<do
{
cin>>input;//接受用户选择
cout<<"";
cout<<"==============================================================================="<switch(input)//用switch-case实现功能的多项选择
{
case'1':
{
cout<<"复数求模"<cout<<"请输入一个复数:
";
cin>>a;
cout<<()<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<<"Badinput"<<"输入错误,请按任意键后重新输入"<break;
}
}
}while(input!
=8);//若不输入8,则可以不退出一直使用复数计算器
}
展开阅读全文