首页 > 编程 > C++ > 正文

简单实现C++复数计算器

2020-05-23 14:02:57
字体:
来源:转载
供稿:网友
这篇文章主要为大家详细介绍了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>#define EPS 1e-5    //定义精度常数using namespace std;   //使用标准空间命名stdnamespace NameCCom   //定义命名空间NameCCom{ class CCom    //定义一个CCom类 { public:  double Real,Image;//实部和虚部 CCom(double real=0,double image=0)   //构造函数 {  Real=real;  Image=image; }  friend istream & operator>>(istream &is,CCom &com);  //重载输入  friend ostream & operator<<(ostream &os,CCom &com);  //重载输出  CCom operator+(CCom &com);        //加法重载  CCom operator-(CCom &com);        //减法重载  CCom operator*(CCom &com);        //乘法重载  CCom operator/(CCom &com);        //除法重载  CCom operator+=(CCom &com);        //加法赋值重载  CCom operator-=(CCom &com);        //减法赋值重载  CCom operator*=(CCom &com);       //乘法赋值重载  CCom operator/=(CCom &com);       //除法赋值重载 }; struct User   //定义用户结构体类型 { char szName[20];  //用户名 }user;     //定义全局变量 int CCom::operator>(CCom &com) //重载运算符">",比较模的大小 { if(mod()>com.mod())  return 1; //若大,则返回1 else  return 0; //否则,则返回0 } int CCom::operator<(CCom &com) //重载运算符"<",比较模的大小 { if(mod()<com.mod())  return 1;   //若小,则返回1 else  return 0;   //否则,则返回0 } int CCom::operator!=(CCom &com) //重载运算符"!=",分别判断复数的实部和虚部 { if(*this==com)  return 0;   //若相等,则返回0 else  return 1;   //否则,则返回1 } istream & operator>>(istream &is,CCom &com) //重载输入,可以输入a+bi的形式 { cout<<"请输入复数:"; char s[80]; is>>s;     //用字符串的形式接受复数 int len=strlen(s);  //求出字符串的长度 int n=0,sign=1; //n为当前从字符串中提取出来的数字,初始化为0;sign是标记符号,初始化为正 com.Image=com.Real=0; for(int k=0;k<len;k++) //判断接受的字符串是否合法 {  if((s[k]<'0' || s[k]> '9') && (s[k]!='+' && s[k]!='-' && s[k]!='i'))  {  cout<<"error"<<endl;  return is;   //错误,输出出错信息并返回  } } for(int k=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; } return is; } ostream & operator<<(ostream &os,CCom &com) //重载输入 { if(fabs(com.Image)<EPS)  // 如果虚部为0  os<<com.Real;   //只输出实部 else if((fabs(com.Real)<EPS)) //如果实部为0   os<<com.Image<<"i"; //只输出虚部   else if(com.Image>0)    os<<com.Real<<"+"<<com.Image<<"i";    else    os<<com.Real<<com.Image<<"i"; //虚部为正 return os; } CCom CCom::operator+(CCom &com) //加法重载 { CCom sum; sum.Real=Real+com.Real;  //实部相加 sum.Image=Image+com.Image; //虚部相加 return sum; } CCom CCom::operator-(CCom &com) //减法重载 { CCom sub; sub.Real=Real-com.Real;  //实部相减 sub.Image=Image-com.Image;  //虚部相减 return sub; } CCom CCom::operator*(CCom &com) //乘法重载 { CCom multi; multi.Real=Real*com.Real-Image*com.Image; //实部乘积 multi.Image=Real*com.Image+Image*com.Real; //虚部乘积 return multi; } CCom CCom::operator/(CCom &com) //除法重载 { CCom div; 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); //虚部除积 return div; } CCom CCom::operator+=(CCom &com) //重载加法赋值 { Real=Real+com.Real;    //实部相加 Image=Image+com.Image;   //虚部相加 return *this; } CCom CCom::operator-=(CCom &com) //重载减法赋值 { Real=Real-com.Real;   //实部相减 Image=Image-com.Image;   //虚部相减 return *this; } CCom CCom::operator*=(CCom &com) //重载乘法赋值 { double nReal=Real*com.Real-Image*com.Image; //实部乘积 double nImage=Real*com.Image+Image*com.Real; //虚部乘积 Real=nReal; Image=nImage; return *this; } CCom CCom::operator/=(CCom &com) //重载除法赋值 { double nReal=(Real*com.Real+Image*com.Image)/(com.Real*com.Real+com.Image*com.Image);  //实部除积 double nImage=(Image*com.Real-Real*com.Image)/(com.Real*com.Real+com.Image*com.Image);  //虚部除积 Real=nReal; Image=nImage; return *this; } int CCom::operator==(CCom &com)  //重载等于 { if(Real==com.Real && Image==com.Image)  return 1; else  return 0; }void Add()    //复数加法运算函数{  CCom num1,num2,sum,Zero(0,0);  cout<<"加法计算/n"<<"最少输入两个复数,并且以0结束/n";  cout<<"第一个复数:";  cin>>num1;  cout<<"第二个复数:";  cin>>num2;  sum=num1+num2;  cout<<"第三个复数:";  cin>>num1;  int i=4;  while(!(num1==Zero))  {  sum=sum+num1;  cout<<"第"<<i<<"个复数:";  cin>>num1;  i++;  }  cout<<"加法结果是:"<<sum<<endl;  cout<<"请按任意键继续/n";  cin.get();  cin.get();}void Sub()   //复数减法运算函数{  CCom num1,num2,sub,Zero(0,0);  cout<<"最少输入两个复数,并且以0结束/n";  cout<<"第1个复数:";  cin>>num1;  cout<<"第2个复数:";  cin>>num2;  sub=num1-num2;  cout<<"第3个复数:";  cin>>num1;  int i=4;  while(!(num1==Zero))  {   sub=sub-num1;   cout<<"第"<<i<<"个复数:";   cin>>num1;   i++;  }  cout<<"减法结果是:"<<sub<<endl;  cout<<"请按任意键继续/n";  cin.get();  cin.get();}void Mul()      //复数乘法运算函数{  CCom num1,num2,mul,Zero(0,0);  cout<<"乘法计算/n"<<"最少输入两个复数,并且以0结束/n";  cout<<"第一个复数:";  cin>>num1;  cout<<"第二个复数:";  cin>>num2;  mul=num1*num2;  cout<<"第三个复数:";  cin>>num1;  int i=4;  while(!(num1==Zero))  {   mul*=num1;   cout<<"第"<<i<<"个复数:";   cin>>num1;   i++;  }  cout<<"乘法结果是:"<<mul<<endl;  cout<<"请按任意键继续/n";  cin.get();  cin.get();}void Div()      //复数除法运算函数{  CCom num1,num2,div,Zero(0,0);  cout<<"除法计算/n"<<"最少输入两个复数,并且以0结束/n";  cout<<"第一个复数:";  cin>>num1;  cout<<"第二个复数:";  cin>>num2;  div=num1/num2;  cout<<"第三个复数:";  cin>>num1;  int i=4;  while(!(num1==Zero))  {  div/=num1;  cout<<"第"<<i<<"个复数:";  cin>>num1;  i++;  }  cout<<"除法结果是:"<<div<<endl;  cout<<"请按任意键继续/n";  cin.get();  cin.get();}void Compare()    //两复数比较函数{  CCom num1,num2;  cout<<"请输入两个复数/n";  cout<<"第一个复数:";  cin>>num1;  cout<<"第二个复数/n";  cin>>num2;  if(num1==num2)  cout<<"这两个复数相等/n";  else if(num1>num2)  cout<<num1<<"的模大于"<<num2<<"的模/n";  else if(num1<num2)  cout<<num2<<"的模大于"<<num1<<"的模/n";  else  cout<<"这两个复数的模相等/n";  cout<<"请按任意键继续/n";  cin.get();  cin.get();}void Jinzhi()    //实现进制转换{  long n;  int p,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(int k=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();}void outpt(){ char szName[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";}}using namespace NameCCom;int main(void) //主函数开始,void可以不写{ int h; output(); cin>>h;//每步操作 if(h==1)  //用户选1则调用Add()函数  Add(); else if(h==2) //用户选2则调用Sub()函数  Sub(); else if(h==3) //用户选3则调用Mul()函数  Mul(); else if(h==4) //用户选4则调用Di  v()函数  Div(); else if(h==5)  //用户选6则调用Compare()函数  Compare(); else if(h==6) //用户选7则调用函数Jinzhi()函数  Jinzhi(); else if(h==0)  cout<<"非常感谢您的使用/n"; else  break; } return 0;}

 

以上就是本文的全部内容,希望对大家学习C++程序设计有所帮助。



发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表