货币系统设计——c++

   

一、   需求分析

       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()菜单函数和GotoInterface()回到主界面的函数,用户操作对象可以在程序深入的时候可以访问这些成员函数,以回到主界面或菜单栏中,就可以进行其他的操作。

   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

      {

       int iFenSum= (yuan*100+fen)*(1+CMoney::inter[CurrType]);

          yuan = iFenSum / 100;

         fen = iFenSum % 100;

    }

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++() //前增量的重载

    {   yuan ++;

        return *this;

    }

    Currency operator++(int) //后增量的重载

    {  Currency temp = *this;

        yuan++;  

        return temp;

    }

     4、“+=”操作符的重载算法

        Currency& operator+=( const Currency& rhs)  

    {

     int iMyFenSum = yuan * 100 + static_cast(fen);

     int  iRhsFenSum = rhs.yuan * 100 + static_cast(rhs.fen);

 

     int  iResultFenSum = iMyFenSum + iRhsFenSum;

         yuan = iResultFenSum / 100;

         fen = iResultFenSum % 100;

     return *this;

}

 

货币系统设计——c++_第1张图片   设计感想及存在问题

    该货币系统中能够操作的货币种类只有四种(人民币、美元、英镑、日元),

但是由于设计的改进,由开始的只能进行美元与人民币之间的转换计算,到现在可以应用到多种货币之间的运算,系统的适用性得到了很大的提升,主要改进的地方时使用了泛型编程中的模板技术,使得代码得到了很大的节省,代码量减少的同时程序的运行效率得到了很大的提高。

在设计过程中,我也参考了很多资料书,一开始我只是简单地研究两种货币之间的联系,面向对象的编程思想很快地帮我解决了问题,之后,我一直在想能否改善代码,使得程序的适用性更广泛,适合更多种类的货币进行交互运算,因为以前拜读过《设计模式可复用面向对象的软件基础》这本书,所以想到了用其中的工厂方法来设计,但是经过长时间的琢磨和分析,我还是没有找到突破口,后来我就想用泛型编程中的模板技术来做,这样的话我也不用写那么多的不同种类的货币类了,然后就开始着手写,在写的过程中也遇到了很多困难,这期间我也参考了《c++Template》这本书,在里面也学到了以前不曾深入学习的关于模板的更多知识,在我把模板类的程序运行成功之后,就开始着重于与用户交汇的这一大块,我发现我还可以用模板来做,所以又设计了两个类,一个类是为用户提供接口,而另一个类就执行一些计算操作,根据用户的选择来执行相应的算法,虽然系统不能说做的怎么样,但从决定开始用模板来设计的那天起,到现在三天时间,我觉得自己学到了很多,这一段时间确实很充实!

 如果要使该程序能够适用更多的货币种类,只需在基类CMoney中把汇率表再填充,年利率表也要得到更新,只要对应补充数据,就OK了,在这里我就只用了四种货币,所以在这方面提高适用性问题不大,至于其他方面的提高,我想在以后的学习中我会慢慢体会到,我应该如何更好地设计了!

 

 

 

 

你可能感兴趣的:(货币系统设计——c++)