20161201

银行利率,包含一个时间和一个对应的利率。我用了一个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

[cpp]  view plain  copy
  1. #include <iostream>  
  2. #include <fstream>  
  3. #include <windows.h>  
  4. #include "../lib_x/LIST_array.h"  
  5. #define CURRENT_RATE 'c'  
  6. #define FIXED_RATE 'f'  
  7. using namespace std;  
  8. /** 
  9.     **程序名称:银行利率表管理 
  10.     **主要数据结构:线性表(数组实现) 
  11.     **实现操作:查看利率,修改,增加,删除利率,计算利息 
  12.     **程序开始会读入bankRate.txt的文件,支持将修改后的利率 
  13.       再次写入该文件 
  14. */  
  15. class Rate  
  16. {  
  17. public:  
  18.     Rate(float input_year,float input_rate)  
  19.     {  
  20.         year = input_year ;  
  21.         rate = input_rate ;  
  22.     }  
  23.     float getRate()  
  24.     {  
  25.         return rate ;  
  26.     }  
  27.     float getYear()  
  28.     {  
  29.         return year ;  
  30.     }  
  31.     void setRate(float input_rate)  
  32.     {  
  33.         rate = input_rate ;  
  34.     }  
  35. private :  
  36.     float year ;  
  37.     float rate ;  
  38.   
  39. } ;  
  40. class BankRate  
  41. {  
  42. public:  
  43.     BankRate() ;  
  44.     ~BankRate() ;  
  45.     bool modifyRate(char deposit_type,float year,float new_rate) ;  
  46.     float getRate(char deposit_type,float year) ;  
  47.     bool insertRate(char deposit_type,float year,float rate) ;  
  48.     bool deleteRate(char deposit_type,float year) ;  
  49.     void printRate() ;  
  50.     void printRate(char deposit_type,float * rate_list) ;  
  51. private:  
  52.     List<Rate*> * current_deposit ;  
  53.     List<Rate*> * fixed_deposit ;  
  54. } ;  
  55. BankRate::BankRate()  
  56. {  
  57.     current_deposit = new List<Rate*>(2) ;  
  58.     fixed_deposit = new List<Rate*>() ;  
  59. }  
  60. BankRate::~BankRate()  
  61. {  
  62.     delete [] current_deposit ;  
  63.     delete [] fixed_deposit ;  
  64.     current_deposit = NULL ;  
  65.     fixed_deposit = NULL ;  
  66. }  
  67. bool BankRate::modifyRate(char deposit_type,float year ,float new_rate)  
  68. {  
  69.     int pos ;  
  70.     Rate * tmp ;  
  71.     if(deposit_type == CURRENT_RATE)  
  72.     {  
  73.         pos = current_deposit->first() ;  
  74.         if(pos == INVALID)  
  75.             return false ;  
  76.         else  
  77.         {  
  78.             tmp = current_deposit->Retrieve(pos) ;  
  79.             tmp->setRate(new_rate) ;  
  80.             return true ;  
  81.         }  
  82.     }  
  83.     else  
  84.     {  
  85.         pos = fixed_deposit->first() ;  
  86.         while(pos != INVALID)  
  87.         {  
  88.             tmp=fixed_deposit->Retrieve(pos) ;  
  89.             if( tmp->getYear()== year)  
  90.             {  
  91.                 tmp->setRate(new_rate) ;  
  92.                 return true ;  
  93.             }  
  94.             else  
  95.             {  
  96.                 pos = fixed_deposit->next(pos) ;  
  97.             }  
  98.         }  
  99.         return false ;  
  100.     }  
  101. }  
  102. float BankRate::getRate(char deposit_type,float year)  
  103. {  
  104.     Rate * tmp = NULL ;  
  105.     if(deposit_type == CURRENT_RATE)  
  106.     {  
  107.         if(current_deposit->first() == INVALID)  
  108.             return (float)INVALID ;  
  109.         tmp = current_deposit->Retrieve(current_deposit->first()) ;  
  110.         return tmp->getRate() ;  
  111.     }  
  112.     else  
  113.     {  
  114.         int pos = fixed_deposit->first() ;  
  115.         while(pos!=INVALID)  
  116.         {  
  117.             tmp = fixed_deposit->Retrieve(pos) ;  
  118.             if(tmp->getYear() == year)\  
  119.             {  
  120.                 return tmp->getRate() ;  
  121.             }  
  122.             else  
  123.             {  
  124.                 pos = fixed_deposit->next(pos) ;  
  125.             }  
  126.         }  
  127.         return (float)INVALID ;  
  128.     }  
  129.   
  130. }  
  131. bool BankRate::insertRate(char deposit_type,float year , float rate) //按时间由短到长插入  
  132. {  
  133.     int pos ;  
  134.     Rate * tmp = NULL ;  
  135.     if(deposit_type == CURRENT_RATE)  
  136.     {  
  137.         pos = current_deposit->first() ;  
  138.         if(pos == INVALID)  
  139.         {  
  140.             tmp = new Rate(year,rate) ;  
  141.             current_deposit->Insert(tmp,1) ;  
  142.             return true ;  
  143.         }  
  144.         else  
  145.             return false ;  
  146.     }  
  147.     else  
  148.     {  
  149.         pos = fixed_deposit->first() ;  
  150.   
  151.         if(pos == INVALID)  
  152.         {  
  153.             tmp = new Rate(year,rate) ;  
  154.             fixed_deposit->Insert(tmp,1) ;  
  155.             return true ;  
  156.         }  
  157.         while(pos!= INVALID)  
  158.         {  
  159.             tmp = fixed_deposit->Retrieve(pos) ;  
  160.             if(year == tmp->getYear())  
  161.             {  
  162.                 return false ;  
  163.             }  
  164.             else if(year <tmp->getYear())  
  165.             {  
  166.                 tmp = new Rate(year,rate) ;  
  167.                 fixed_deposit->Insert(tmp,pos) ;  
  168.                 return true ;  
  169.             }  
  170.             else  
  171.             {  
  172.                 pos = fixed_deposit->next(pos) ;  
  173.             }  
  174.         }  
  175.         tmp = new Rate(year,rate) ;  
  176.         fixed_deposit->Insert(tmp,fixed_deposit->end()+1) ;  
  177.         return true ;  
  178.   
  179.     }  
  180.   
  181. }  
  182. bool BankRate::deleteRate(char deposit_type,float year)  
  183. {  
  184.     if(deposit_type == CURRENT_RATE)  
  185.     {  
  186.         if(current_deposit->Delete(current_deposit->first()))  
  187.             return true ;  
  188.         else  
  189.             return false ;  
  190.     }  
  191.     else  
  192.     {  
  193.         int pos = fixed_deposit->first() ;  
  194.         Rate * tmp ;  
  195.         while(pos != INVALID)  
  196.         {  
  197.             tmp = fixed_deposit->Retrieve(pos) ;  
  198.             if(tmp->getYear() == year)  
  199.             {  
  200.                 fixed_deposit->Delete(pos) ;  
  201.                 return true ;  
  202.             }  
  203.             else  
  204.             {  
  205.                 pos = fixed_deposit->next(pos) ;  
  206.             }  
  207.         }  
  208.         return false ;  
  209.     }  
  210. }  
  211. void BankRate::printRate()  
  212. {  
  213.     int pos ;  
  214.     pos = current_deposit->first() ;  
  215.     if(pos == INVALID)  
  216.         cout <<"活期储蓄暂无利率数据\n\n" ;  
  217.     else  
  218.         cout <<"活期储蓄的利率为 \n\t\t\t" <<(current_deposit->Retrieve(pos))->getRate() <<"%/年\n\n";  
  219.     pos = fixed_deposit->first() ;  
  220.     if(pos == INVALID)  
  221.         cout <<"定期储蓄暂无数据\n\n" ;  
  222.     else  
  223.     {  
  224.         cout <<"定期储蓄利率为:\n\n\t存期(年)\t利率(%/年)\n" ;  
  225.         Rate * tmp = NULL ;  
  226.         while(pos!= INVALID)  
  227.         {  
  228.             tmp = fixed_deposit->Retrieve(pos) ;  
  229.             cout <<"\t" <<tmp->getYear()<<"\t\t"<<tmp->getRate()<<endl ;  
  230.             pos = fixed_deposit->next(pos) ;  
  231.         }  
  232.     }  
  233. }  
  234. void BankRate::printRate(char deposit_type,float * rate_list)  
  235. {  
  236.     int pos ;  
  237.     if(deposit_type == CURRENT_RATE)  
  238.     {  
  239.         pos = current_deposit->first() ;  
  240.         if(pos == INVALID)  
  241.         {  
  242.             rate_list[0] = -1.0 ;  
  243.             return ;  
  244.         }  
  245.         else  
  246.         rate_list[0] = (current_deposit->Retrieve(pos))->getRate() ;  
  247.     }  
  248.     else  
  249.     {  
  250.         pos = fixed_deposit->first() ;  
  251.         while(pos!= INVALID)  
  252.         {  
  253.             rate_list[2*(pos-1)] = (fixed_deposit->Retrieve(pos))->getYear() ;  
  254.             rate_list[2*(pos-1)+1] = (fixed_deposit->Retrieve(pos))->getRate() ;  
  255.             pos = fixed_deposit->next(pos) ;  
  256.         }  
  257.     }  
  258. }  
  259. int main()  
  260. {  
  261.   
  262.     BankRate bank_rate ;  
  263.     char * menus="\t\t银行利率表管理\n1.查看利率\n2.修改利率\n3.添加新的利率规则\n4.删除利率规则\n5.计算利息\n6保存利率到文件\n7.退出\n" ;  
  264.     ifstream res("bankRate.txt") ;  
  265.     if(res == NULL)  
  266.     {  
  267.         cout <<"读取数据文件失败。\n按任意键退出" ;  
  268.         getchar() ;  
  269.         return 0 ;  
  270.     }  
  271.     float year,rate ;  
  272.     year = 0.0 ;  
  273.     rate = 0.0 ;  
  274.     //读入活期储蓄;利率  
  275.     res>>rate ;  
  276.     bank_rate.insertRate(CURRENT_RATE,year,rate) ;  
  277.     while(!res.eof())  
  278.     {  
  279.         res >> year >> rate ;  
  280.         bank_rate.insertRate(FIXED_RATE,year,rate) ;  
  281.     }  
  282.     while (cout <<menus)  
  283.     {  
  284.         int choice ;  
  285.         cin >> choice ;  
  286.         switch(choice)  
  287.         {  
  288.         case 1 :  
  289.         {  
  290.             bank_rate.printRate() ;  
  291.             break ;  
  292.         }  
  293.         case 2 :  
  294.         {  
  295.             cout <<"当前的税率为:\n" ;  
  296.             bank_rate.printRate() ;  
  297.             cout <<"请输入要修改的利率类型:\n1.活期2.定期\n" ;  
  298.             int choice_type ;  
  299.             cin >> choice_type ;  
  300.   
  301.             if(choice_type == 1)  
  302.             {  
  303.                 cout <<"请输入新的活期利率\n" ;  
  304.                 cin >> rate ;  
  305.                 if(bank_rate.modifyRate(CURRENT_RATE,year,rate))  
  306.                 {  
  307.                     cout <<"利率修改成功\n当前的利率为:\n" ;  
  308.                     bank_rate.printRate() ;  
  309.                 }  
  310.                 else  
  311.                 {  
  312.                     cout <<"修改失败\n\n" ;  
  313.                 }  
  314.   
  315.             }  
  316.             else if(choice_type == 2)  
  317.             {  
  318.                 cout <<"请输入定期时间及新的利率,如 3 0.35\n" ;  
  319.                 cin >> year >> rate ;  
  320.                 if(bank_rate.modifyRate(FIXED_RATE,year,rate))  
  321.                 {  
  322.                     cout <<"利率修改成功\n当前的利率为:\n" ;  
  323.                     bank_rate.printRate() ;  
  324.                 }  
  325.                 else  
  326.                 {  
  327.                     cout <<"修改失败,不存在的时间" << endl ;  
  328.                 }  
  329.   
  330.             }  
  331.             else  
  332.             {  
  333.                 cout <<"无效的输入\n\n" ;  
  334.             }  
  335.             break ;  
  336.         }  
  337.         case 3 :  
  338.         {  
  339.             int choice_type ;  
  340.             cout <<"请输入要添加利率的类型:\n1.活期2.定期\n" ;  
  341.             cin >> choice_type ;  
  342.             if(choice_type == 1)  
  343.             {  
  344.                 cout <<"请输入活期利率\n" ;  
  345.                 cin >> rate ;  
  346.                 if(bank_rate.insertRate(CURRENT_RATE,year,rate))  
  347.                 {  
  348.                     cout <<"添加利率成功,当前的利率为\n" ;  
  349.                     bank_rate.printRate() ;  
  350.                 }  
  351.                 else  
  352.                 {  
  353.                     cout <<"添加失败,活期利率已存在\n" ;  
  354.                 }  
  355.   
  356.             }  
  357.             else if(choice_type == 2)  
  358.             {  
  359.                 cout <<"请输入新的利率规则 时间 及 利率 如 10 0.55\n" ;  
  360.                 cin >> year >> rate ;  
  361.                 if(bank_rate.insertRate(FIXED_RATE,year,rate))  
  362.                 {  
  363.                     cout <<"添加利率成功,当前的利率为\n" ;  
  364.                     bank_rate.printRate() ;  
  365.                 }  
  366.                 else  
  367.                 {  
  368.                     cout <<"添加利率失败,当前利率规则已存在\n" ;  
  369.                 }  
  370.   
  371.             }  
  372.             else  
  373.             {  
  374.                 cout <<"无效的输入\n" ;  
  375.             }  
  376.             break ;  
  377.         }  
  378.         case 4 :  
  379.         {  
  380.             int choice_type ;  
  381.             cout <<"请输入要删除利率的类型:\n1.活期2.定期\n" ;  
  382.             cin >> choice_type ;  
  383.             if(choice_type == 1)  
  384.             {  
  385.                 if(bank_rate.deleteRate(CURRENT_RATE,year))  
  386.                 {  
  387.                     cout <<"删除成功,当前的利率为:\n" ;  
  388.                     bank_rate.printRate() ;  
  389.                 }  
  390.                 else  
  391.                 {  
  392.                     cout <<"删除失败,活期利率不存在\n" ;  
  393.                 }  
  394.             }  
  395.             else if(choice_type == 2)  
  396.             {  
  397.                 cout <<"输入要删除的利率规则对应的时间\n" ;  
  398.                 cin >> year ;  
  399.                 if(bank_rate.deleteRate(FIXED_RATE,year))  
  400.                 {  
  401.                     cout <<"删除成功,当前的利率为:\n" ;  
  402.                     bank_rate.printRate() ;  
  403.                 }  
  404.                 else  
  405.                 {  
  406.                     cout <<"删除失败,不存在的规则\n" ;  
  407.                 }  
  408.             }  
  409.             else  
  410.             {  
  411.                 cout <<"不合法的输入\n" ;  
  412.             }  
  413.             break ;  
  414.         }  
  415.         case 5 :  
  416.         {  
  417.             int choice_type ;  
  418.             cout <<"请输入存款类型\n1.活期\n2.定期\n" ;  
  419.             cin >> choice_type ;  
  420.             cout <<"请输入存款的金额(元)与时间(年),如10000 2.5\n" ;  
  421.             float interest ;  
  422.             float principal ;  
  423.             cin >> principal >> year ;  
  424.             if(choice_type == 1)  
  425.             {  
  426.                 rate = bank_rate.getRate(CURRENT_RATE,year) ;  
  427.                 if(rate == (float)INVALID)  
  428.                 {  
  429.                     cout <<"利率读取失败\n" ;  
  430.                 }  
  431.                 else  
  432.                 {  
  433.                     rate/=100 ;  
  434.                     rate/=4 ;  
  435.                     int seasons = year*4 ;  
  436.                     interest = principal*rate*seasons ;  
  437.                     cout <<"活期利息计算公式为 利息=本金*利率*期限\n"  
  438.                          <<"且活期利息按季结算。\n"  
  439.                          <<year <<"年包含完整的" <<seasons <<"季,则利息为\n"  
  440.                          <<"利息="<<principal<<"*"<<rate <<"*" <<seasons<<"="<<principal*rate<<seasons <<" (元)"<<endl ;  
  441.                 }  
  442.             }  
  443.             else if(choice_type == 2)  
  444.             {  
  445.                 rate = bank_rate.getRate(FIXED_RATE,year) ;  
  446.                 if(rate == (float)INVALID)  
  447.                 {  
  448.                     cout <<"无此时间的利率\n" ;  
  449.                 }  
  450.                 else  
  451.                 {  
  452.                     cout <<"定期利息的计算公式为\n利息=本金*利率*期限\n"  
  453.                          <<"则利息="<<principal<<"*"<<rate<<"*"<<year  
  454.                          <<"="<<principal*rate*year <<" (元)\n" ;  
  455.                 }  
  456.             }  
  457.             else  
  458.             {  
  459.                 cout <<"无效的输入\n" ;  
  460.             }  
  461.             break ;  
  462.         }  
  463.         case 6 :  
  464.         {  
  465.             ofstream out("bankRate.txt") ;  
  466.             if(out == NULL)  
  467.             {  
  468.                 cout <<"数据文件创建失败\n" ;  
  469.                 break ;  
  470.             }  
  471.             float rate_list[2*MAX] ;  
  472.             for(int i =0 ; i < 2*MAX ; i++)  
  473.             {  
  474.                 rate_list[i] = -1.0 ;  
  475.             }  
  476.             bank_rate.printRate(CURRENT_RATE,rate_list) ;  
  477.             if(rate_list[0] == -1.0)  
  478.             {  
  479.                 cout <<"利率数据不完整,导出失败\n" ;  
  480.                 break ;  
  481.             }  
  482.             out <<rate_list[0] <<endl ;  
  483.             bank_rate.printRate(FIXED_RATE,rate_list) ;  
  484.             if(rate_list[0] == -1.0)  
  485.             {  
  486.                 cout <<"利率数据不完整,导出失败\n" ;  
  487.                 break ;  
  488.             }  
  489.             int counter = 0 ;  
  490.             while(rate_list[counter] != -1.0)  
  491.             {  
  492.                 out <<rate_list[counter++] <<" " ;  
  493.                 out   <<rate_list[counter++] <<" " ;  
  494.                 /* 
  495.                 如果这段写为 
  496.                 out <<rate_list[counter++] <<" " ; 
  497.                     <<rate_list[counter++] <<" " ; 
  498.                 那么输出顺序会相反 
  499.                 既是 原本为0.5 3.3 
  500.                 这段代码输出为3.3 0.5 
  501.                 但之前全是文本输出的时候则没有这种情况 
  502.                 原因不详 
  503.                 */  
  504.             }  
  505.             out.close() ;  
  506.             cout <<"保存成功\n" ;  
  507.             break ;  
  508.   
  509.         }  
  510.         case 7 :  
  511.             return 0 ;  
  512.         default :  
  513.             cout <<"无效的输入\n" ;  
  514.         }  
  515.   
  516.     cout <<endl ;  
  517.     Sleep(1200) ;//延时  
  518.     }  
  519.   
  520.     return 0;  
  521. }  

List_array.h

~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值