一、
需求分析
1)
系統描述:
該系統功能主要是可以為使用者提高快捷有效的服務,為使用者完成貨幣之間的一些基本運算(比如幣值統計,不同貨幣之間的等價兌換,還有貨幣的統計計算,便利於賬目管理),本系統為使用者設計了四種貨幣之間的轉換,人民幣、美元、英鎊、日元,使用者可以再這四種貨幣的範疇內進行一些基本的運算。 2)
需求描述: 1
、該系統設計了乙個貨幣類(
cmoney
),作為基類,用乙個類模板
currency
作為貨幣類的派生類,
cmoney
類中定義了兩個靜態資料成員:
rate(
匯率表)
匯聚了四種貨幣之間的匯率,
inter(
年利息表
)匯聚了各種貨幣的年利息,作為基類的保護成員,這樣在派生類中的例項化物件就可以直接訪問,在運算中利用到這些資料成員;
display()
定義為乙個純虛函式,為派生類提供乙個介面,它在派生類中得到實現,並顯示貨幣的面值及相應的標誌。 2
、該系統在定義
cmoney
類的派生類的時候運用到了泛型程式設計中模板功能
template class currency : public cmoney
,由於每種貨幣的演算法都一樣,只是幣種不同而已,這樣會造成**冗長,而且會造成程式效率低,利用了模板技術之後,**質量高,而且功能更廣泛;在這裡使用了模板的乙個特性,就是非型別的模板引數,也就是
int currtype
。模板引數通常都是乙個型別,比如
int
什麼的,但這也可以是乙個非型別的模板引數,傳統上,非型別模板引數用於傳遞乙個靜態的值,用來構造模板類,在該系統的程式中,這個模板引數並沒有被模板使用,使用了這個模板引數的作用就是「製造型別」。
typedef currency
<
0>
rmb; //
人民幣typedef currency
<
1>
usd; //
美元typedef currency
<
2>
gbp; //
英鎊typedef currency
<
3>
jpd; //日元
3、類模板中為各種貨幣型別都實現了建構函式和拷貝建構函式,還有前增量和後增量的過載操作;另外也過載「
+」操作符使得任意兩種貨幣之間都可以實現相加或相減運算,並且得到等值的相關貨幣面值,你想得到怎麼樣型別貨幣的面值都可以,只要客戶按照系統所提示的操作進行,就可以得到符合您需求的答案; 4
、該類模板中也編寫了乙個函式,就是求利息的問題,不同貨幣有不同的年利率,但演算法都一樣,所以又使用了乙個模板函式
currency& getinterest(int n),
使用者可以自己決定要求多少年後的年利息,為使用者得到的結果是若干年後的貨幣總額,也就是
m*(1+inter)^n,
並且可以由
display()
函式輸出結果。 5
、程式中以友元方式過載
」>>」
、」<<」
操作符,便於使用者可以直接輸入例項化物件的貨幣面值,程式設計師也可以在程式中直接輸出例項化物件,而且在螢幕上輸出的內容與
display()
一樣的內容。
6、鑑於物件導向程式設計思想,該程式中另外也設計了兩個類:
sysoperation
類和useroperation
類。sysoperation
類定義了一些系統函式,
menu()
選單函式和
gotointe***ce()
回到主介面的函式,使用者操作物件可以在程式深入的時候可以訪問這些成員函式,以回到主介面或選單欄中,就可以進行其他的操作。
useroperation
類是乙個使用者類,定義了三個模板函式:
template
void interestoper(currency & t);
//用於不同種類貨幣的利息計算
template
void convertoper(currency & t);
//用於任意兩種貨幣之間的等價兌換
template
void plusoper(currency & t);
//用於任意兩種貨幣之間的統計運算,相加或者相減
。。。。。。。。。
三、
模組的設計分析
首先與使用者互動的乙個類是
systemoperation
類,這個類的設計給使用者提供了三種功能,一種是回到主介面,第二是進入選單,然後進行相關的操作,在主選單中選定操作之後,
systemoperation
類,的模板函式
oper()
函式將根據使用者選擇執行;
useroperation
類的成員模板函式是以
currency &
為引數的,根據貨幣物件的不同將進行不同的操作,根據選擇,
useroperation
類將會有三種功能提供被執行,
convertoper()
函式、plusoper()
函式、interestoper()
函式,將會進行相應的操作。
程式中的幾種關鍵演算法: 1
、利息運算:
for(int i=0; i
2、貨幣等價兌換
int ifensum = static_cast((utemp.getyuan() * 100 + utemp.getfen()) * cmoney::rate[tp][currtype]);
yuan = int(ifensum / 100);
fen = ifensum - yuan*100 ; 3
、前增量和後增量演算法
currency & operator++() //
前增量的過載
currency operator++(int) //
後增量的過載4、「
+=」操作符的過載演算法
currency& operator+=( const currency& rhs)
四、
設計感想及存在問題
該貨幣系統中能夠操作的貨幣種類只有四種(人民幣、美元、英鎊、日元),
但是由於設計的改進,由開始的只能進行美元與人民幣之間的轉換計算,到現在可以應用到多種貨幣之間的運算,系統的適用性得到了很大的提公升,主要改進的地方時使用了泛型程式設計中的模板技術,使得**得到了很大的節省,**量減少的同時程式的執行效率得到了很大的提高。
在設計過程中,我也參考了很多資料書,一開始我只是簡單地研究兩種貨幣之間的聯絡,物件導向的程式設計思想很快地幫我解決了問題,之後,我一直在想能否改善**,使得程式的適用性更廣泛,適合更多種類的貨幣進行互動運算,因為以前拜讀過《設計模式可復用物件導向的軟體基礎》這本書,所以想到了用其中的工廠方法來設計,但是經過長時間的琢磨和分析,我還是沒有找到突破口,後來我就想用泛型程式設計中的模板技術來做,這樣的話我也不用寫那麼多的不同種類的貨幣類了,然後就開始著手寫,在寫的過程中也遇到了很多困難,這期間我也參考了《
c++template
》這本書,在裡面也學到了以前不曾深入學習的關於模板的更多知識,在我把模板類的程式執行成功之後,就開始著重於與使用者交匯的這一大塊,我發現我還可以用模板來做,所以又設計了兩個類,乙個類是為使用者提供介面,而另乙個類就執行一些計算操作,根據使用者的選擇來執行相應的演算法,雖然系統不能說做的怎麼樣,但從決定開始用模板來設計的那天起,到現在三天時間,我覺得自己學到了很多,這一段時間確實很充實!
如果要使該程式能夠適用更多的貨幣種類,只需在基類
cmoney
中把匯率表再填充,年利率表也要得到更新,只要對應補充資料,就
ok了,在這裡我就只用了四種貨幣,所以在這方面提高適用性問題不大,至於其他方面的提高,我想在以後的學習中我會慢慢體會到,我應該如何更好地設計了!
C 貨幣系統
問題描述 給你乙個n種面值的貨幣系統,求組成面值為m的貨幣有多少種方案。輸入 第一行輸入兩個正整數n和m,用空格隔開,分別表示貨幣系統的面值種數和要組成的總面值。以下n行,每行輸入乙個正整數,表示貨幣系統的面值。輸出 一行乙個數,表示組成目標面值的方案總數。輸入輸出樣例 money.in money...
貨幣系統問題
時間限制 1 sec 記憶體限制 64 mb 提交 85 解決 59 提交 狀態 討論版 命題人 admin 貨幣是在國家或經濟體內的物資與服務交換中充當等價物,或是償還債務的特殊商品,是用作交易媒介 儲藏價值和記賬單位的一種工具。魔法世界的貨幣的歷史,可以追溯至史前以物易物的階段,後來經過金屬貨幣...
1192 貨幣系統
給你乙個n種面值的貨幣系統,求組成面值為m的貨幣有多少種方案。樣例 設n 3,m 10,要求輸入和輸出的格式如下 第一行兩個整數n,m m 5000 以下n行,每行乙個整數,第i 1行為第i種貨幣的面值 乙個整數,為方案數 3 1012 510動態規劃 揹包問題 n,m map int,input ...