简单实现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++程序设计有所帮助。