簡單實現C++複數計算機_C 語言

來源:互聯網
上載者:User

本文執行個體為大家分享了簡單實現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++程式設計有所協助。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.