《c++分?jǐn)?shù)計算器(含源碼)》由會員分享,可在線閱讀,更多相關(guān)《c++分?jǐn)?shù)計算器(含源碼)(12頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、
一、 實驗設(shè)計方案
1、 實驗內(nèi)容與目的(簡單介紹實驗內(nèi)容,說明實驗?zāi)康模?
實驗?zāi)康模涸O(shè)計一個分?jǐn)?shù)計算器:1)實現(xiàn)輸入>>,輸出<<,+,-,*,/運算符的重載;2)實現(xiàn)分子分母的約分與規(guī)格化。
實驗內(nèi)容:你的具體選擇(要詳細)
實現(xiàn)分?jǐn)?shù)計算器的屏幕輸入和輸出:1)輸入采用文件(input.txt)輸入,可以有任意個二元分?jǐn)?shù)表達式,表達式之間的分隔符自定義;2)輸出到文件(output.txt)
——————————————————————————————————————
2、實驗準(zhǔn)備工作(闡述解決問題所涉及的算法思想,至少要畫一個算法流程圖來說明)
以下為循環(huán)計算二元分
2、數(shù)計算式的流程圖:
輸入第一個分?jǐn)?shù)
輸入運算符
輸入第二個分?jǐn)?shù)
輸入判斷符號
計算結(jié)果
保存結(jié)果到output.txt中
若為“=”
若為“;”
結(jié)束本次計算
在實驗中還需要面對六個運算符重載,通過運算符重載,我們可以簡單的使用分?jǐn)?shù)計算,而不需要關(guān)心它的結(jié)構(gòu),運算符重載,我們根據(jù)基本的數(shù)學(xué)定理,將加減乘除包裝,并重載了輸入輸出運算符,這樣,在輸入輸出時便可直接輸出用戶方便接收的格式。
——————————————————————————————————————
推薦精選
二、實驗步驟、測試與結(jié)果分析
1、源程序的設(shè)計(在此附上源程序(cpp文件)清單
3、)
#include
#include
#include
using namespace std;
//-------------------------------創(chuàng)建分?jǐn)?shù)類------------------------------------
class Fraction
{
private:
int nume; //分子
int deno;
4、 //分母
int Gcf(int m,int n); //輔助函數(shù),返回m和n最大公因數(shù)
public:
Fraction(int n=1,int d=1);
virtual~Fraction(){}
void Reduction(); //約分
int GetNume() const{return nume;} //返回分子
int GetDeno()
5、const{return deno;} //返回分母
void SetNume(int n); //設(shè)置分子
void SetDeno(int d); //設(shè)置分母
Fraction operator+(const Fraction &a) const; //重載加法符+
Fraction operator-(const Fraction &a) const;
6、 //重載加法符-
Fraction operator*(const Fraction &a) const; //重載加法符*
Fraction operator/(const Fraction &a) const; //重載加法符/
};
ostream &operator << (ostream &out,const Fraction &a); //重載輸出運算符<<
istream &operator >> (istream &in,Fraction &a); //重載輸入運算符>>
//--------------
7、-------------------最大公因數(shù)函數(shù)------------------------------
int Fraction::Gcf(int m,int n)
{
if(n==0) return m; //如果n=0,m為最大公因數(shù)
else return Gcf(n,m%n); //否者輾轉(zhuǎn)相除
}
//------------------------------------約分函數(shù)---------------------------------
推薦精選
8、void Fraction::Reduction()
{
if(deno<0) //若分母小于0,將符號提前
{
nume=-nume;
deno=-deno;
}
int f=Gcf(abs(nume),deno);
nume=nume/f; //實現(xiàn)約數(shù)
deno=deno/f;
}
//----------------------------------構(gòu)造函數(shù)-----------------------------------
Fraction::Fraction(int n,int d):n
9、ume(n),deno(d)
{
if(deno==0) cout<<"分母為0"<
10、-------------
void Fraction::SetDeno(int d)
{
if(d==0) cout<<"分母為0"<n
11、ume*a.deno+this->deno*a.nume; //求和的分子
result.deno=this->deno*a.deno; //求和的分母
result.Reduction(); //約分
return result; //返回和
}
//----------------------------------重載運算符---------------------------------
Fraction Fraction::operator-(const Fraction &a) const
推薦精選
12、
{
Fraction result;
result.nume=this->nume*a.deno-this->deno*a.nume; //求差的分子
result.deno=this->deno*a.deno; //求差的分母
result.Reduction(); //約分
return result; //返回差
}
//----------------------------------重載運算符*--------------------------------
Fraction Fr
13、action::operator * (const Fraction &a) const
{
Fraction result;
result.nume=this->nume*a.nume; //求積的分子
result.deno=this->deno*a.deno; //求積的分母
result.Reduction(); //約分
return result; //返回積
}
//----------------------------------重載運算符/----------------
14、----------------
Fraction Fraction::operator / (const Fraction &a) const
{
if(a.nume==0) cout<<"除數(shù)為0"<nume*a.deno; //求商的分子
result.deno=this->deno*a.nume; //求商的分母
result.Reduction(); //約分
return re
15、sult; //返回商
}
//----------------------------------重載運算符<<--------------------------------
ostream &operator << (ostream &out,const Fraction &a)
{
out<>
16、--------------------------------
istream &operator >> (istream &in,Fraction &a)
{
推薦精選
char ch; //接收字符
int m,n; //定義分子和分母
in>>m; //輸入分子
in>>ch; //輸入/
if(ch !='/') cout<<"非法字符"<>n; //輸入分母
if(n==0) cout<<"分母為0"<
17、ndl; //如果分母為0,輸出異常
a.SetNume(m); //設(shè)置分子
a.SetDeno(n); //設(shè)置分母
a.Reduction(); //約分
return in; //返回輸入流
}
int main(void)
{
Fraction obj1,obj2,result; //定義兩個分?jǐn)?shù)和結(jié)果
char index,ch; //定義符號
ifstream infile("input.txt"
18、,ios::in); //以輸入的方式打開文件
if(!infile) //若文件打開失敗
{
cout<<"打開文件input.txt失?。?<
19、-----------本次計算結(jié)果如下--------------------"<>obj1; //輸入第一個分?jǐn)?shù)
infile>>index; //輸入需要執(zhí)行的操作符號
infile>>obj2; //輸入第二個分?jǐn)?shù)
infile>>ch; //選擇繼續(xù)或者計算結(jié)果
推薦精選
if(index=='+') result=obj1+obj2; //加法
20、 else if(index=='-') result=obj1-obj2; //減法
else if(index=='*') result=obj1*obj2; //乘法
else if(index=='/') result=obj1/obj2; //除法
else
{
system("PAUSE");
return 0;
}
cout<<"正在計算"<
21、eam outfile("output.txt",ios::app);
if(!outfile)
{
cout<<"打開文件output.txt失敗"<
22、 //若遇到";",繼續(xù)執(zhí)行
else if(ch=='=') //若遇到"=",計算結(jié)果
{
outfile<<"-------------------------謝謝使用------------------------"<
23、———————————————————————————
2、 實驗現(xiàn)象及結(jié)論(應(yīng)用文字和程序運行的截圖說明程序測試現(xiàn)象,并解釋結(jié)果)
input.txt 輸入截圖如下:
推薦精選
Jcsy.exe 執(zhí)行截圖如下:
output.txt 輸出截圖如下:
input.txt 輸入截圖如下:
推薦精選
jcsy.exe 執(zhí)行截圖如下:
Output.txt 輸出截圖如下:
——————————————————————————————————————
3、 實驗總結(jié)(是否成功解決問題,總結(jié)實驗中最有價值的內(nèi)容,程序能夠在哪些方面進一步
24、
推薦精選
改善,自我評價成敗得失)
試驗中,我們按照從簡單到復(fù)雜的方法,一步一個腳印編寫代碼,使得程序不易發(fā)生錯誤,并且容易更正,編寫出來的程序代碼簡潔明朗,效率較高;
通過對例題的學(xué)習(xí),我們最終將正確的代碼編寫出,并在不斷地修改之下做到方便用戶使用的要求;
編碼的速度有一個從慢到快的過程,在本次試驗中,我們的速度依然比較慢,這看出我們平時編碼比較少,缺乏熟練度,并對算法了解不深入;
但是我們的代碼看起來仍然有些凌亂,效率還沒有帶到真正的高效,每次運行都需要等待幾秒鐘。再以后我們將通過練習(xí)基礎(chǔ)功,簡化程序代碼,實現(xiàn)簡單代碼完善功能的理想。
1. 編碼要盡量使程序簡單,采用最切
25、實可靠的算法,實現(xiàn)封裝,不同部分的代碼應(yīng)分工明確,最后由主函數(shù)統(tǒng)一調(diào)用;
2. 編寫完成后先自己檢查一遍代碼,然后由機器檢測,找出錯誤的根源,從不同角度思考如何解決問題;
3. 測試時應(yīng)盡可能輸入各種可能情況的數(shù)據(jù)以確保程序準(zhǔn)確無誤。
4. 應(yīng)避免任何可能的漏洞,使代碼的可用性和可靠性增強。
5. 試驗中,我按照從簡單到復(fù)雜的方法,一步一個腳印編寫代碼,使得程序不易發(fā)生錯誤,并且容易更正,編寫出來的程序代碼簡潔明朗,效率較高;
6. 通過對例題的學(xué)習(xí),我最終將正確的代碼編寫出,并在不斷地修改之下做到方便用戶使用的要求;
7. 編碼的速度有一個從慢到快的過程,在本次試驗中,我的速度
26、依然比較慢,這看出我平時編碼比較少,缺乏熟練度,并對算法了解不深入;
8. 但是我的代碼看起來仍然有些凌亂,效率還沒有帶到真正的高效,每次運行都需要等待幾秒鐘。再以后我將通過練習(xí)基礎(chǔ)功,簡化程序代碼,實現(xiàn)簡單代碼完善功能的理想。
本次試驗中,我們先將書上的代碼編譯通過,通過討論,認為書上檢查異常的方式不便于理解,于是直接采用輸出到dos窗口的方式,所以沒有使用到utility.h頭文件,同時,由于我們電腦上安裝的編譯系統(tǒng)不方便對.h文件進行調(diào)試修改,所以我們采用的cpp文件,在一個cpp文件中寫下所有代碼。
推薦精選
對于txt文件輸出的格式,我們做的稍微人性化,界面簡潔,容易區(qū)分
(注:可編輯下載,若有不當(dāng)之處,請指正,謝謝!)
推薦精選