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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章