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