一、 需求分析
1)系统描述:
该系统功能主要是可以为用户提高快捷有效的服务,为用户完成货币之间的一些基本运算(比如币值统计,不同货币之间的等价兑换,还有货币的统计计算,便利于账目管理),本系统为用户设计了四种货币之间的转换,人民币、美元、英镑、日元,用户可以再这四种货币的范畴内进行一些基本的运算。
2)需求描述:
1、该系统设计了一个货币类(CMoney),作为基类,用一个类模板Currency作为货币类的派生类,CMoney类中定义了两个静态数据成员:rate[][](汇率表)汇聚了四种货币之间的汇率,inter[](年利息表)汇聚了各种货币的年利息,作为基类的保护成员,这样在派生类中的实例化对象就可以直接访问,在运算中利用到这些数据成员;display()定义为一个纯虚拟函数,为派生类提供一个接口,它在派生类中得到实现,并显示货币的面值及相应的标志。
2、该系统在定义CMoney类的派生类的时候运用到了泛型编程中模板功能template
typedef Currency<0> RMB; //人民币
typedef Currency<1> USD; //美元
typedef Currency<2> GBP; //英镑
typedef Currency<3> JPD; //日元
3、类模板中为各种货币类型都实现了构造函数和拷贝构造函数,还有前增量和后增量的重载操作;另外也重载“+”操作符使得任意两种货币之间都可以实现相加或相减运算,并且得到等值的相关货币面值,你想得到怎么样类型货币的面值都可以,只要客户按照系统所提示的操作进行,就可以得到符合您需求的答案;
4、该类模板中也编写了一个函数,就是求利息的问题,不同货币有不同的年利率,但算法都一样,所以又使用了一个模板函数Currency
5、程序中以友元方式重载”>>”、”<<”操作符,便于用户可以直接输入实例化对象的货币面值,程序员也可以在程序中直接输出实例化对象,而且在屏幕上输出的内容与display()一样的内容。
6、鉴于面向对象编程思想,该程序中另外也设计了两个类:SysOperation类和UserOperation类。SysOperation类定义了一些系统函数,menu()菜单函数和GotoInterface()回到主界面的函数,用户操作对象可以在程序深入的时候可以访问这些成员函数,以回到主界面或菜单栏中,就可以进行其他的操作。
UserOperation类是一个用户类,定义了三个模板函数:
template
void InterestOper(Currency
//用于不同种类货币的利息计算
template
void ConvertOper(Currency
//用于任意两种货币之间的等价兑换
template
void PlusOper(Currency
//用于任意两种货币之间的统计运算,相加或者相减
。。。。。。。。。
三、 模块的设计分析
首先与用户交互的一个类是SystemOperation类,这个类的设计给用户提供了三种功能,一种是回到主界面,第二是进入菜单,然后进行相关的操作,在主菜单中选定操作之后,SystemOperation类,的模板函数Oper()函数将根据用户选择执行;UserOperation类的成员模板函数是以Currency
程序中的几种关键算法:
1、利息运算:
for(int i=0; i
{
int iFenSum= (yuan*100+fen)*(1+CMoney::inter[CurrType]);
yuan = iFenSum / 100;
fen = iFenSum % 100;
}
2、货币等价兑换
int iFenSum = static_cast
yuan = int(iFenSum / 100);
fen = iFenSum - yuan*100 ;
3、前增量和后增量算法
Currency
{ yuan ++;
return *this;
}
Currency
{ Currency
yuan++;
return temp;
}
4、“+=”操作符的重载算法
Currency& operator+=( const Currency& rhs)
{
int iMyFenSum = yuan * 100 + static_cast
int iRhsFenSum = rhs.yuan * 100 + static_cast
int iResultFenSum = iMyFenSum + iRhsFenSum;
yuan = iResultFenSum / 100;
fen = iResultFenSum % 100;
return *this;
}
该货币系统中能够操作的货币种类只有四种(人民币、美元、英镑、日元),
但是由于设计的改进,由开始的只能进行美元与人民币之间的转换计算,到现在可以应用到多种货币之间的运算,系统的适用性得到了很大的提升,主要改进的地方时使用了泛型编程中的模板技术,使得代码得到了很大的节省,代码量减少的同时程序的运行效率得到了很大的提高。
在设计过程中,我也参考了很多资料书,一开始我只是简单地研究两种货币之间的联系,面向对象的编程思想很快地帮我解决了问题,之后,我一直在想能否改善代码,使得程序的适用性更广泛,适合更多种类的货币进行交互运算,因为以前拜读过《设计模式可复用面向对象的软件基础》这本书,所以想到了用其中的工厂方法来设计,但是经过长时间的琢磨和分析,我还是没有找到突破口,后来我就想用泛型编程中的模板技术来做,这样的话我也不用写那么多的不同种类的货币类了,然后就开始着手写,在写的过程中也遇到了很多困难,这期间我也参考了《c++Template》这本书,在里面也学到了以前不曾深入学习的关于模板的更多知识,在我把模板类的程序运行成功之后,就开始着重于与用户交汇的这一大块,我发现我还可以用模板来做,所以又设计了两个类,一个类是为用户提供接口,而另一个类就执行一些计算操作,根据用户的选择来执行相应的算法,虽然系统不能说做的怎么样,但从决定开始用模板来设计的那天起,到现在三天时间,我觉得自己学到了很多,这一段时间确实很充实!
如果要使该程序能够适用更多的货币种类,只需在基类CMoney中把汇率表再填充,年利率表也要得到更新,只要对应补充数据,就OK了,在这里我就只用了四种货币,所以在这方面提高适用性问题不大,至于其他方面的提高,我想在以后的学习中我会慢慢体会到,我应该如何更好地设计了!