复数计算器讲义.docx
《复数计算器讲义.docx》由会员分享,可在线阅读,更多相关《复数计算器讲义.docx(11页珍藏版)》请在冰豆网上搜索。
复数计算器讲义
C++实验报告
实验名称:
复数计算器
学号:
姓名:
一.目的与要求
目的;当我们输入两个复数时,选择加减乘除符号,就能将正确结果输出,实现一个简单的复数计算器的功能;
要求:
要求:
运行流畅,易于进行检查,有较高的可阅读性,呢呢狗狗满足绝大多数情况,没有溢出现象,尽量体现C++封装的编程思想,减少c语句的使用。
二.工具以及准备工作
工具:
vs2015,电脑一台。
准备工作:
关于数组指针,函数申明与调用的知识。
三.分析
要实现一个复数计算器的功能,并把复数定义成一个类,那我们就需要把虚部与实部分别定义,然后就可以进行运算。
但是输入是一个较为困难的事情,我们如何判断这是复数的虚部还是实部呢,于是我采用权重的方法来进行区分,我们设定一个intn,来记录权重,每录入一个实部的数,就加一,来记录权重,那么虚部前面的符号的权重就不为一,此处,虚部与实部的正负号便区分开来,那么后面的数也可以区分开来,那么后面的运算符重载都是对已有知识的运用。
类的定义:
classcomplexnumber
{
private:
doubleReal;//实数部分的值
doubleImage;//虚数部分的值
public:
complexnumber(doublereal=0,doubleimage=0)
{
Real=real;
Image=image;
}
friendistream&operator>>(istream&is,complexnumber&com);//重载运算符
friendostream&operator<<(ostream&os,complexnumber&com);
doublemod(void);
complexnumberoperator+(complexnumber&com);
complexnumberoperator-(complexnumber&com);
complexnumberoperator*(complexnumber&com);
complexnumberoperator/(complexnumber&com);
};
代码具体功能分析见核心算法实现代码每一行后的注释
核心代码:
doublecomplexnumber:
:
mod()
{
returnReal*Real+Image*Image;//复数的模值,在后面会用到
}
istream&operator>>(istream&is,complexnumber&com)
{
charyunsuanshi[80];//定义一个char型数组,方便后面的输入
is>>yunsuanshi;//将is输入到char型
intlen=strlen(yunsuanshi);
intn=0,sign=1;//n设为权重,sign则是符号
com.Image=0;
com.Real=0;//实部与虚部的值同样初始化为0;
for(intk=0;k{
if((yunsuanshi[k]<'0'||yunsuanshi[k]>'9')&&yunsuanshi[k]!
='+'&&yunsuanshi[k]!
='-'&&yunsuanshi[k]!
='i')//判断输入是否有误
{
cout<<"error"<returnis;
}
}
for(intk=0;k{
if(n!
=0&&(yunsuanshi[k]=='-'||yunsuanshi[k]=='+'))//判断是否虚部的符号位,
{
com.Real=sign*n;//输出实部的值
}
if(yunsuanshi[k]=='-')
{
sign=-1;
k++;
}
if(yunsuanshi[k]=='+')
{
sign=1;k++;
}
if(yunsuanshi[k]=='i')
{
if(k!
=len-1)//如果虚部的i不在最后一位的话,输入错误
cout<<"error\n";
else
com.Image=sign*n;
break;
}
while(yunsuanshi[k]>='0'&&yunsuanshi[k]<='9')
{
n=n*10+yunsuanshi[k]-'0';
k++;
}
}
if(yunsuanshi[len-1]!
='i'&&n!
=0)
{
com.Real=n*sign;
}
returnis;
}
ostream&operator<<(ostream&os,complexnumber&com)
{
if(fabs(com.Image)==0.0)//如果虚部的值为零
os<elseif(fabs(com.Real)==0.0)//如果实部的值为零
os<elseif(com.Image>0)//判断输出的虚部前应带正号和负号
os<elseos<returnos;
}
complexnumbercomplexnumber:
:
operator+(complexnumber&com)
{
complexnumbers;
s.Real=Real+com.Real;
s.Image=Image+com.Image;
returns;
}
complexnumbercomplexnumber:
:
operator*(complexnumber&com)
{
complexnumberm;
m.Real=Real*com.Real-Image*com.Image;
m.Image=Real*com.Image+Image*com.Real;
returnm;
}
complexnumbercomplexnumber:
:
operator-(complexnumber&com)
{
complexnumberb;
b.Real=Real-com.Real;
b.Image=Image-com.Image;
returnb;
}
complexnumbercomplexnumber:
:
operator/(complexnumber&com)
{
complexnumberd;
if((com.Real*com.Real+com.Image*com.Image)==0.0)
cout<<"NOROSOLUTION";
else
d.Real=(Real*com.Real-Image*com.Image)/(com.Real*com.Real+com.Image*com.Image);
d.Image=Real*com.Image+Image*com.Real/(com.Real*com.Real+com.Image*com.Image);
returnd;
}
intmain()
{
complexnumbera,b,c;
cout<<"·······欢迎·······"<cout<<"请输入操作数一"<cin>>a;
cout<<"请输入操作数二"<cin>>b;
cout<<"请输入选择的运算符:
+-*/"<chard;
cin>>d;
if(d!
='*'&&d!
='+'&&d!
='-'&&d!
='/')
{
cout<<"选择运算符错误"<cin>>d;
}
switch(d)
{
case'+':
c=a+b;
cout<break;
case'-':
c=a-b;
cout<break;
case'*':
c=a*b;
cout<break;
case'/':
c=a/b;
cout<break;
}
system("pause");
return0;
}
四.实现步骤
1.看清实验要求,并思考,确定大致思路
2.打开visualstudio2015
3.创建新项目
4.确定算法并进行学习尔后添加所需要的必要库文件
5.开始编写代码
6.进行检查
7.运行并调试
8.完善功能
五.测试与结论
测试结果如下:
1.加法
2.乘法
3.减法
4.除法
六.实验总结
在此次实验中,实现的功能十分简单,也没有什么创新性的功能,但我觉得这其中比较巧妙的是,使用权重来进行复数符号位的判定,并且为了便于使用,加入了输入报错功能。
就我自身的感触而言,代码行数明显加长,函数数量与质量都有增长,有一种做工程的感觉(因为真的是做好之后一个一个的调用)。
正因为如此,函数调用起来也需要经常翻页查看功能,在最后还出现了一个bug,弄了好久才消掉(其实现在回过头来看这个bug真的是一个小细节没有想清楚),想着以后可能会打成千上万行的代码,觉着这还是为自己提了个醒,程序员必须把自己写的程序当亲儿子养才行。
总之,在这次实验中,体会到了细心与耐心是程序员两个必备的素质,自己也要向这方面努力啊。