简单实现C++复数计算器
本文实例为大家分享了简单实现C++复数计算器的具体代码,供大家参考,具体内容如下
1.有关计算器的功能
A,实现多个复数(包括实数)的加减乘除,大小比较,
B.实现十进制实数的进制转换,可以转换任意进制
2.有关设计的原理
A.复数计算的部分,采用运算符的重载,进行复数的加减乘除以及大小比较
对于输入输出,(>>和<<),加减乘除运算进行重载。
输入的重载,实现a+bi形式的复数的输入。
输出的重载,实现实数的输出(实现特殊的只输出实部虚部之类的)。
加减乘除的重载,实现有关复数的运算。
B.进制转换的部分,采用进制转换的方法,实现10进制的任意进制转换。辗转相除,记录每次的余数,存储在数组中来记录转换得到的数字
3.有关设计的特点
A.采用函数对所实现功能进行封装。
B.采用运算符的重载,使复数运算更加方便
C.考虑所有的输入输出情况,对选择的操作,输入复数的类型等进行判断与相应的处理
D.程序在完成以后,接受大家建议,规范代码格式,自己在制作过程有所收获也有所学习。
下面是有关代码的实现:
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<fstream>
#include<ctime>
#defineEPS1e-5//定义精度常数
usingnamespacestd;//使用标准空间命名std
namespaceNameCCom//定义命名空间NameCCom
{
classCCom//定义一个CCom类
{
public:
doubleReal,Image;//实部和虚部
CCom(doublereal=0,doubleimage=0)//构造函数
{
Real=real;
Image=image;
}
friendistream&operator>>(istream&is,CCom&com);//重载输入
friendostream&operator<<(ostream&os,CCom&com);//重载输出
CComoperator+(CCom&com);//加法重载
CComoperator-(CCom&com);//减法重载
CComoperator*(CCom&com);//乘法重载
CComoperator/(CCom&com);//除法重载
CComoperator+=(CCom&com);//加法赋值重载
CComoperator-=(CCom&com);//减法赋值重载
CComoperator*=(CCom&com);//乘法赋值重载
CComoperator/=(CCom&com);//除法赋值重载
};
structUser//定义用户结构体类型
{
charszName[20];//用户名
}user;//定义全局变量
intCCom::operator>(CCom&com)//重载运算符">",比较模的大小
{
if(mod()>com.mod())
return1;//若大,则返回1
else
return0;//否则,则返回0
}
intCCom::operator<(CCom&com)//重载运算符"<",比较模的大小
{
if(mod()<com.mod())
return1;//若小,则返回1
else
return0;//否则,则返回0
}
intCCom::operator!=(CCom&com)//重载运算符"!=",分别判断复数的实部和虚部
{
if(*this==com)
return0;//若相等,则返回0
else
return1;//否则,则返回1
}
istream&operator>>(istream&is,CCom&com)//重载输入,可以输入a+bi的形式
{
cout<<"请输入复数:";
chars[80];
is>>s;//用字符串的形式接受复数
intlen=strlen(s);//求出字符串的长度
intn=0,sign=1;//n为当前从字符串中提取出来的数字,初始化为0;sign是标记符号,初始化为正
com.Image=com.Real=0;
for(intk=0;k<len;k++)//判断接受的字符串是否合法
{
if((s[k]<'0'||s[k]>'9')&&(s[k]!='+'&&s[k]!='-'&&s[k]!='i'))
{
cout<<"error"<<endl;
returnis;//错误,输出出错信息并返回
}
}
for(intk=0;k<len;)//顺序识别字符串中各字符
{
if(n!=0&&(s[k]=='-'||s[k]=='+'))//当前字符是否是符号位
{
com.Real=sign*n;//sign是符号位,且n!=0,即n已被赋值,表明当前读取的是虚部的符号
n=0;//将原n*sign值赋给实部,将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;
}
returnis;
}
ostream&operator<<(ostream&os,CCom&com)//重载输入
{
if(fabs(com.Image)<EPS)//如果虚部为0
os<<com.Real;//只输出实部
elseif((fabs(com.Real)<EPS))//如果实部为0
os<<com.Image<<"i";//只输出虚部
elseif(com.Image>0)
os<<com.Real<<"+"<<com.Image<<"i";
else
os<<com.Real<<com.Image<<"i";//虚部为正
returnos;
}
CComCCom::operator+(CCom&com)//加法重载
{
CComsum;
sum.Real=Real+com.Real;//实部相加
sum.Image=Image+com.Image;//虚部相加
returnsum;
}
CComCCom::operator-(CCom&com)//减法重载
{
CComsub;
sub.Real=Real-com.Real;//实部相减
sub.Image=Image-com.Image;//虚部相减
returnsub;
}
CComCCom::operator*(CCom&com)//乘法重载
{
CCommulti;
multi.Real=Real*com.Real-Image*com.Image;//实部乘积
multi.Image=Real*com.Image+Image*com.Real;//虚部乘积
returnmulti;
}
CComCCom::operator/(CCom&com)//除法重载
{
CComdiv;
div.Real=(Real*com.Real+Image*com.Image)/(com.Real*com.Real+com.Image*com.Image);//实部除积
div.Image=(Image*com.Real-Real*com.Image)/(com.Real*com.Real+com.Image*com.Image);//虚部除积
returndiv;
}
CComCCom::operator+=(CCom&com)//重载加法赋值
{
Real=Real+com.Real;//实部相加
Image=Image+com.Image;//虚部相加
return*this;
}
CComCCom::operator-=(CCom&com)//重载减法赋值
{
Real=Real-com.Real;//实部相减
Image=Image-com.Image;//虚部相减
return*this;
}
CComCCom::operator*=(CCom&com)//重载乘法赋值
{
doublenReal=Real*com.Real-Image*com.Image;//实部乘积
doublenImage=Real*com.Image+Image*com.Real;//虚部乘积
Real=nReal;
Image=nImage;
return*this;
}
CComCCom::operator/=(CCom&com)//重载除法赋值
{
doublenReal=(Real*com.Real+Image*com.Image)/(com.Real*com.Real+com.Image*com.Image);//实部除积
doublenImage=(Image*com.Real-Real*com.Image)/(com.Real*com.Real+com.Image*com.Image);//虚部除积
Real=nReal;
Image=nImage;
return*this;
}
intCCom::operator==(CCom&com)//重载等于
{
if(Real==com.Real&&Image==com.Image)
return1;
else
return0;
}
voidAdd()//复数加法运算函数
{
CComnum1,num2,sum,Zero(0,0);
cout<<"加法计算\n"<<"最少输入两个复数,并且以0结束\n";
cout<<"第一个复数:";
cin>>num1;
cout<<"第二个复数:";
cin>>num2;
sum=num1+num2;
cout<<"第三个复数:";
cin>>num1;
inti=4;
while(!(num1==Zero))
{
sum=sum+num1;
cout<<"第"<<i<<"个复数:";
cin>>num1;
i++;
}
cout<<"加法结果是:"<<sum<<endl;
cout<<"请按任意键继续\n";
cin.get();
cin.get();
}
voidSub()//复数减法运算函数
{
CComnum1,num2,sub,Zero(0,0);
cout<<"最少输入两个复数,并且以0结束\n";
cout<<"第1个复数:";
cin>>num1;
cout<<"第2个复数:";
cin>>num2;
sub=num1-num2;
cout<<"第3个复数:";
cin>>num1;
inti=4;
while(!(num1==Zero))
{
sub=sub-num1;
cout<<"第"<<i<<"个复数:";
cin>>num1;
i++;
}
cout<<"减法结果是:"<<sub<<endl;
cout<<"请按任意键继续\n";
cin.get();
cin.get();
}
voidMul()//复数乘法运算函数
{
CComnum1,num2,mul,Zero(0,0);
cout<<"乘法计算\n"<<"最少输入两个复数,并且以0结束\n";
cout<<"第一个复数:";
cin>>num1;
cout<<"第二个复数:";
cin>>num2;
mul=num1*num2;
cout<<"第三个复数:";
cin>>num1;
inti=4;
while(!(num1==Zero))
{
mul*=num1;
cout<<"第"<<i<<"个复数:";
cin>>num1;
i++;
}
cout<<"乘法结果是:"<<mul<<endl;
cout<<"请按任意键继续\n";
cin.get();
cin.get();
}
voidDiv()//复数除法运算函数
{
CComnum1,num2,div,Zero(0,0);
cout<<"除法计算\n"<<"最少输入两个复数,并且以0结束\n";
cout<<"第一个复数:";
cin>>num1;
cout<<"第二个复数:";
cin>>num2;
div=num1/num2;
cout<<"第三个复数:";
cin>>num1;
inti=4;
while(!(num1==Zero))
{
div/=num1;
cout<<"第"<<i<<"个复数:";
cin>>num1;
i++;
}
cout<<"除法结果是:"<<div<<endl;
cout<<"请按任意键继续\n";
cin.get();
cin.get();
}
voidCompare()//两复数比较函数
{
CComnum1,num2;
cout<<"请输入两个复数\n";
cout<<"第一个复数:";
cin>>num1;
cout<<"第二个复数\n";
cin>>num2;
if(num1==num2)
cout<<"这两个复数相等\n";
elseif(num1>num2)
cout<<num1<<"的模大于"<<num2<<"的模\n";
elseif(num1<num2)
cout<<num2<<"的模大于"<<num1<<"的模\n";
else
cout<<"这两个复数的模相等\n";
cout<<"请按任意键继续\n";
cin.get();
cin.get();
}
voidJinzhi()//实现进制转换
{
longn;
intp,c,m=0,s[100];
cout<<"输入要转换的数字:\n";
cin>>n;
cout<<"输入要转换的进制:\n";
cin>>p;
cout<<"("<<n<<")10="<<"(";
while(n!=0)//数制转换,结果存入数组s[m]
{
c=n%p;
n=n/p;
m++;s[m]=c;//将余数按顺序存入数组s[m]中
}
for(intk=m;k>=1;k--)//输出转换后的序列
{
if(s[k]>=10)//若为十六进制等则输出相对应的字母
cout<<(char)(s[k]+55);
else//否则直接输出数字
cout<<s[k];
}
cout<<")"<<p<<endl;
cout<<"请按任意键继续\n";
cin.get();
cin.get();
}
voidoutpt()
{
charszName[20];
cout<<"请输入您的姓名:";
cin>>szName;
system("cls");
do
{
system("cls");
cout<<"\t这是一个计算器,可实现以下功能,请按对应的按键(0-6)\n\n\n";
cout<<"\t*----------Hpioneer小计算器菜单---------*\n";
cout<<"\t|1:多个复数加法,以0结束|\n";
cout<<"\t|2:多个复数减法,以0结束|\n";
cout<<"\t|3:多个复数乘法,以0结束|\n";
cout<<"\t|4:多个复数除法,以0结束|\n";
cout<<"\t|5:复数比较|\n";
cout<<"\t|6:进制转换|\n";
cout<<"\t|0:退出程序|\n";
cout<<"\t|请您选择:|\n";
cout<<"\t*---------------------------------------*\n";
}
}
usingnamespaceNameCCom;
intmain(void)//主函数开始,void可以不写
{
inth;
output();
cin>>h;//每步操作
if(h==1)//用户选1则调用Add()函数
Add();
elseif(h==2)//用户选2则调用Sub()函数
Sub();
elseif(h==3)//用户选3则调用Mul()函数
Mul();
elseif(h==4)//用户选4则调用Di
v()函数
Div();
elseif(h==5)//用户选6则调用Compare()函数
Compare();
elseif(h==6)//用户选7则调用函数Jinzhi()函数
Jinzhi();
elseif(h==0)
cout<<"非常感谢您的使用\n";
else
break;
}
return0;
}
以上就是本文的全部内容,希望对大家学习C++程序设计有所帮助。