c++简单复数计算器

Posted vx:V5codings

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++简单复数计算器相关的知识,希望对你有一定的参考价值。

1.有关计算器的功能
A,实现多个复数(包括实数)的加减乘除,大小比较,
B.实现十进制实数的进制转换,可以转换任意进制
2.有关设计的原理
A.复数计算的部分,采用运算符的重载,进行复数的加减乘除以及大小比较
对于输入输出,(>>和<<),加减乘除运算进行重载。
输入的重载,实现a+bi形式的复数的输入。
输出的重载,实现实数的输出(实现特殊的只输出实部虚部之类的)。
加减乘除的重载,实现有关复数的运算。
B.进制转换的部分,采用进制转换的方法,实现10进制的任意进制转换。辗转相除,记录每次的余数,存储在数组中来记录转换得到的数字
3.有关设计的特点
A.采用函数对所实现功能进行封装。
B.采用运算符的重载,使复数运算更加方便
C.考虑所有的输入输出情况,对选择的操作,输入复数的类型等进行判断与相应的处理
D.程序在完成以后,我发了自己的博客,之后在博客上接受大家建议,规范代码格式,自己在制作过程有所收获也有所学习。

1,登录界面:

这里写图片描述

2,实现界面:

这里写图片描述

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <fstream>
#include <ctime>

#define EPS 1e-5                //定义精度常数

using namespace std;            //使用标准空间命名std

namespace 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();
}

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();
}

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();
}

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();
}

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();
}

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();
}

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() //主函数
{
    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则调用Div()函数
        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++简单复数计算器的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 和 Fortran 代码之间传递复数数组

C++复数运算的运算符重载

近似计算-简单举例 复数乘法和strassen算法

用结构体函数计算两个复数的四则运算的程序分析、重难点和结论?

在 C++ 中初始化复数数组

C ++中的复数示例不起作用