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