银行利率表管理

银行利率,包含一个时间和一个对应的利率。我用了一个Rate类来实现,并把相应的指针插入线性表。

其中有一个问题是,怎么根据输入的年份来搜索线性表内的对应的指针并进行修改,删除操作。以前写这个的时候,特意把要用的线性表重写了一遍,使其可以直接搜索。

这次再写的时候,隐约想起了所谓迭代器的知识,通过一个next函数,输出栈内的元素,而不必到栈中去查找了。

写的过程中遇到了一个有意思的事

out   <<rate_list[counter++] <<" " ;
                out   <<rate_list[counter++] <<" " ;
                如果这段写为
                out <<rate_list[counter++] <<" " ;
                       <<rate_list[counter++] <<" " ;
                那么输出顺序会相反
                既是 原本为0.5 3.3
                这段代码输出为3.3 0.5
                但如果只是文本输出的时候则没有这种情况。

也不知道是什么原因。
 BankRateManage.cpp

#include <iostream>
#include <fstream>
#include <windows.h>
#include "../lib_x/LIST_array.h"
#define CURRENT_RATE 'c'
#define FIXED_RATE 'f'
using namespace std;
/**
    **程序名称:银行利率表管理
    **主要数据结构:线性表(数组实现)
    **实现操作:查看利率,修改,增加,删除利率,计算利息
    **程序开始会读入bankRate.txt的文件,支持将修改后的利率
      再次写入该文件
*/
class Rate
{
public:
    Rate(float input_year,float input_rate)
    {
        year = input_year ;
        rate = input_rate ;
    }
    float getRate()
    {
        return rate ;
    }
    float getYear()
    {
        return year ;
    }
    void setRate(float input_rate)
    {
        rate = input_rate ;
    }
private :
    float year ;
    float rate ;

} ;
class BankRate
{
public:
    BankRate() ;
    ~BankRate() ;
    bool modifyRate(char deposit_type,float year,float new_rate) ;
    float getRate(char deposit_type,float year) ;
    bool insertRate(char deposit_type,float year,float rate) ;
    bool deleteRate(char deposit_type,float year) ;
    void printRate() ;
    void printRate(char deposit_type,float * rate_list) ;
private:
    List<Rate*> * current_deposit ;
    List<Rate*> * fixed_deposit ;
} ;
BankRate::BankRate()
{
    current_deposit = new List<Rate*>(2) ;
    fixed_deposit = new List<Rate*>() ;
}
BankRate::~BankRate()
{
    delete [] current_deposit ;
    delete [] fixed_deposit ;
    current_deposit = NULL ;
    fixed_deposit = NULL ;
}
bool BankRate::modifyRate(char deposit_type,float year ,float new_rate)
{
    int pos ;
    Rate * tmp ;
    if(deposit_type == CURRENT_RATE)
    {
        pos = current_deposit->first() ;
        if(pos == INVALID)
            return false ;
        else
        {
            tmp = current_deposit->Retrieve(pos) ;
            tmp->setRate(new_rate) ;
            return true ;
        }
    }
    else
    {
        pos = fixed_deposit->first() ;
        while(pos != INVALID)
        {
            tmp=fixed_deposit->Retrieve(pos) ;
            if( tmp->getYear()== year)
            {
                tmp->setRate(new_rate) ;
                return true ;
            }
            else
            {
                pos = fixed_deposit->next(pos) ;
            }
        }
        return false ;
    }
}
float BankRate::getRate(char deposit_type,float year)
{
    Rate * tmp = NULL ;
    if(deposit_type == CURRENT_RATE)
    {
        if(current_deposit->first() == INVALID)
            return (float)INVALID ;
        tmp = current_deposit->Retrieve(current_deposit->first()) ;
        return tmp->getRate() ;
    }
    else
    {
        int pos = fixed_deposit->first() ;
        while(pos!=INVALID)
        {
            tmp = fixed_deposit->Retrieve(pos) ;
            if(tmp->getYear() == year)\
            {
                return tmp->getRate() ;
            }
            else
            {
                pos = fixed_deposit->next(pos) ;
            }
        }
        return (float)INVALID ;
    }

}
bool BankRate::insertRate(char deposit_type,float year , float rate) //按时间由短到长插入
{
    int pos ;
    Rate * tmp = NULL ;
    if(deposit_type == CURRENT_RATE)
    {
        pos = current_deposit->first() ;
        if(pos == INVALID)
        {
            tmp = new Rate(year,rate) ;
            current_deposit->Insert(tmp,1) ;
            return true ;
        }
        else
            return false ;
    }
    else
    {
        pos = fixed_deposit->first() ;

        if(pos == INVALID)
        {
            tmp = new Rate(year,rate) ;
            fixed_deposit->Insert(tmp,1) ;
            return true ;
        }
        while(pos!= INVALID)
        {
            tmp = fixed_deposit->Retrieve(pos) ;
            if(year == tmp->getYear())
            {
                return false ;
            }
            else if(year <tmp->getYear())
            {
                tmp = new Rate(year,rate) ;
                fixed_deposit->Insert(tmp,pos) ;
                return true ;
            }
            else
            {
                pos = fixed_deposit->next(pos) ;
            }
        }
        tmp = new Rate(year,rate) ;
        fixed_deposit->Insert(tmp,fixed_deposit->end()+1) ;
        return true ;

    }

}
bool BankRate::deleteRate(char deposit_type,float year)
{
    if(deposit_type == CURRENT_RATE)
    {
        if(current_deposit->Delete(current_deposit->first()))
            return true ;
        else
            return false ;
    }
    else
    {
        int pos = fixed_deposit->first() ;
        Rate * tmp ;
        while(pos != INVALID)
        {
            tmp = fixed_deposit->Retrieve(pos) ;
            if(tmp->getYear() == year)
            {
                fixed_deposit->Delete(pos) ;
                return true ;
            }
            else
            {
                pos = fixed_deposit->next(pos) ;
            }
        }
        return false ;
    }
}
void BankRate::printRate()
{
    int pos ;
    pos = current_deposit->first() ;
    if(pos == INVALID)
        cout <<"活期储蓄暂无利率数据\n\n" ;
    else
        cout <<"活期储蓄的利率为 \n\t\t\t" <<(current_deposit->Retrieve(pos))->getRate() <<"%/年\n\n";
    pos = fixed_deposit->first() ;
    if(pos == INVALID)
        cout <<"定期储蓄暂无数据\n\n" ;
    else
    {
        cout <<"定期储蓄利率为:\n\n\t存期(年)\t利率(%/年)\n" ;
        Rate * tmp = NULL ;
        while(pos!= INVALID)
        {
            tmp = fixed_deposit->Retrieve(pos) ;
            cout <<"\t" <<tmp->getYear()<<"\t\t"<<tmp->getRate()<<endl ;
            pos = fixed_deposit->next(pos) ;
        }
    }
}
void BankRate::printRate(char deposit_type,float * rate_list)
{
    int pos ;
    if(deposit_type == CURRENT_RATE)
    {
        pos = current_deposit->first() ;
        if(pos == INVALID)
        {
            rate_list[0] = -1.0 ;
            return ;
        }
        else
        rate_list[0] = (current_deposit->Retrieve(pos))->getRate() ;
    }
    else
    {
        pos = fixed_deposit->first() ;
        while(pos!= INVALID)
        {
            rate_list[2*(pos-1)] = (fixed_deposit->Retrieve(pos))->getYear() ;
            rate_list[2*(pos-1)+1] = (fixed_deposit->Retrieve(pos))->getRate() ;
            pos = fixed_deposit->next(pos) ;
        }
    }
}
int main()
{

    BankRate bank_rate ;
    char * menus="\t\t银行利率表管理\n1.查看利率\n2.修改利率\n3.添加新的利率规则\n4.删除利率规则\n5.计算利息\n6保存利率到文件\n7.退出\n" ;
    ifstream res("bankRate.txt") ;
    if(res == NULL)
    {
        cout <<"读取数据文件失败。\n按任意键退出" ;
        getchar() ;
        return 0 ;
    }
    float year,rate ;
    year = 0.0 ;
    rate = 0.0 ;
    //读入活期储蓄;利率
    res>>rate ;
    bank_rate.insertRate(CURRENT_RATE,year,rate) ;
    while(!res.eof())
    {
        res >> year >> rate ;
        bank_rate.insertRate(FIXED_RATE,year,rate) ;
    }
    while (cout <<menus)
    {
        int choice ;
        cin >> choice ;
        switch(choice)
        {
        case 1 :
        {
            bank_rate.printRate() ;
            break ;
        }
        case 2 :
        {
            cout <<"当前的税率为:\n" ;
            bank_rate.printRate() ;
            cout <<"请输入要修改的利率类型:\n1.活期2.定期\n" ;
            int choice_type ;
            cin >> choice_type ;

            if(choice_type == 1)
            {
                cout <<"请输入新的活期利率\n" ;
                cin >> rate ;
                if(bank_rate.modifyRate(CURRENT_RATE,year,rate))
                {
                    cout <<"利率修改成功\n当前的利率为:\n" ;
                    bank_rate.printRate() ;
                }
                else
                {
                    cout <<"修改失败\n\n" ;
                }

            }
            else if(choice_type == 2)
            {
                cout <<"请输入定期时间及新的利率,如 3 0.35\n" ;
                cin >> year >> rate ;
                if(bank_rate.modifyRate(FIXED_RATE,year,rate))
                {
                    cout <<"利率修改成功\n当前的利率为:\n" ;
                    bank_rate.printRate() ;
                }
                else
                {
                    cout <<"修改失败,不存在的时间" << endl ;
                }

            }
            else
            {
                cout <<"无效的输入\n\n" ;
            }
            break ;
        }
        case 3 :
        {
            int choice_type ;
            cout <<"请输入要添加利率的类型:\n1.活期2.定期\n" ;
            cin >> choice_type ;
            if(choice_type == 1)
            {
                cout <<"请输入活期利率\n" ;
                cin >> rate ;
                if(bank_rate.insertRate(CURRENT_RATE,year,rate))
                {
                    cout <<"添加利率成功,当前的利率为\n" ;
                    bank_rate.printRate() ;
                }
                else
                {
                    cout <<"添加失败,活期利率已存在\n" ;
                }

            }
            else if(choice_type == 2)
            {
                cout <<"请输入新的利率规则 时间 及 利率 如 10 0.55\n" ;
                cin >> year >> rate ;
                if(bank_rate.insertRate(FIXED_RATE,year,rate))
                {
                    cout <<"添加利率成功,当前的利率为\n" ;
                    bank_rate.printRate() ;
                }
                else
                {
                    cout <<"添加利率失败,当前利率规则已存在\n" ;
                }

            }
            else
            {
                cout <<"无效的输入\n" ;
            }
            break ;
        }
        case 4 :
        {
            int choice_type ;
            cout <<"请输入要删除利率的类型:\n1.活期2.定期\n" ;
            cin >> choice_type ;
            if(choice_type == 1)
            {
                if(bank_rate.deleteRate(CURRENT_RATE,year))
                {
                    cout <<"删除成功,当前的利率为:\n" ;
                    bank_rate.printRate() ;
                }
                else
                {
                    cout <<"删除失败,活期利率不存在\n" ;
                }
            }
            else if(choice_type == 2)
            {
                cout <<"输入要删除的利率规则对应的时间\n" ;
                cin >> year ;
                if(bank_rate.deleteRate(FIXED_RATE,year))
                {
                    cout <<"删除成功,当前的利率为:\n" ;
                    bank_rate.printRate() ;
                }
                else
                {
                    cout <<"删除失败,不存在的规则\n" ;
                }
            }
            else
            {
                cout <<"不合法的输入\n" ;
            }
            break ;
        }
        case 5 :
        {
            int choice_type ;
            cout <<"请输入存款类型\n1.活期\n2.定期\n" ;
            cin >> choice_type ;
            cout <<"请输入存款的金额(元)与时间(年),如10000 2.5\n" ;
            float interest ;
            float principal ;
            cin >> principal >> year ;
            if(choice_type == 1)
            {
                rate = bank_rate.getRate(CURRENT_RATE,year) ;
                if(rate == (float)INVALID)
                {
                    cout <<"利率读取失败\n" ;
                }
                else
                {
                    rate/=100 ;
                    rate/=4 ;
                    int seasons = year*4 ;
                    interest = principal*rate*seasons ;
                    cout <<"活期利息计算公式为 利息=本金*利率*期限\n"
                         <<"且活期利息按季结算。\n"
                         <<year <<"年包含完整的" <<seasons <<"季,则利息为\n"
                         <<"利息="<<principal<<"*"<<rate <<"*" <<seasons<<"="<<principal*rate<<seasons <<" (元)"<<endl ;
                }
            }
            else if(choice_type == 2)
            {
                rate = bank_rate.getRate(FIXED_RATE,year) ;
                if(rate == (float)INVALID)
                {
                    cout <<"无此时间的利率\n" ;
                }
                else
                {
                    cout <<"定期利息的计算公式为\n利息=本金*利率*期限\n"
                         <<"则利息="<<principal<<"*"<<rate<<"*"<<year
                         <<"="<<principal*rate*year <<" (元)\n" ;
                }
            }
            else
            {
                cout <<"无效的输入\n" ;
            }
            break ;
        }
        case 6 :
        {
            ofstream out("bankRate.txt") ;
            if(out == NULL)
            {
                cout <<"数据文件创建失败\n" ;
                break ;
            }
            float rate_list[2*MAX] ;
            for(int i =0 ; i < 2*MAX ; i++)
            {
                rate_list[i] = -1.0 ;
            }
            bank_rate.printRate(CURRENT_RATE,rate_list) ;
            if(rate_list[0] == -1.0)
            {
                cout <<"利率数据不完整,导出失败\n" ;
                break ;
            }
            out <<rate_list[0] <<endl ;
            bank_rate.printRate(FIXED_RATE,rate_list) ;
            if(rate_list[0] == -1.0)
            {
                cout <<"利率数据不完整,导出失败\n" ;
                break ;
            }
            int counter = 0 ;
            while(rate_list[counter] != -1.0)
            {
                out <<rate_list[counter++] <<" " ;
                out   <<rate_list[counter++] <<" " ;
                /*
                如果这段写为
                out <<rate_list[counter++] <<" " ;
                    <<rate_list[counter++] <<" " ;
                那么输出顺序会相反
                既是 原本为0.5 3.3
                这段代码输出为3.3 0.5
                但之前全是文本输出的时候则没有这种情况
                原因不详
                */
            }
            out.close() ;
            cout <<"保存成功\n" ;
            break ;

        }
        case 7 :
            return 0 ;
        default :
            cout <<"无效的输入\n" ;
        }

    cout <<endl ;
    Sleep(1200) ;//延时
    }

    return 0;
}

List_array.h

~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值