• 一道money计算题引发的思考


    网友提出一个问题如下

    是小学和中学时候学到了增长折线问题,有点像数学问题,不过这个要求用编程来实现,恐怕还是有些逻辑要处理的,话不多说看代码吧

    我给出的代码如下

    代码清单:

    <?php
    function get_money($year)
    {
        $base=2000;//底薪
        //前三年计算
        for ($i=1; $i <=3 ; $i++)
        {
            $base=$base*(1+0.07);
            if($i==$year)
            {
                return $base;
            }
        }
        //后面几年的计算
        $balance_year=$year-3;
        for ($i=1; $i <=$balance_year ; $i++)
        {
            $increase_percent=max((8+3-$year),2);//保证增长率不小于2%
            $base=$base*(1+$increase_percent/100);//逐年计算
            if($base>4000)
            {
                return $base;//大于4000 立即返回
            }
        }
        return $base;
    }
    
    ?>

    同时 总觉得这类问题应该被抽象化,毕竟规则有可能是频繁变动的,修改代码需要重新阅读和测试逻辑,这里给出面向对象的版本

    代码清单如下:

    <?php
    class calc_money
    {
        private $base_money=2000;
        private $max_money=4000;
        private $base_year=3;
        private $base_increase_percent=0.07;
        private $min_increase_percent=0.02;
        public function __construct($year)
        {
            $balance_year=$year-$this->base_year;
            if($balance_year>0)
            {
                $this->get_first_three_year_money($this->base_year);//获取前三年
                $this->get_balance_money($balance_year);//获取后面的几年
            }else
            {
                $this->get_first_three_year_money($year);//直接获取前几年
            }
        }
        private function get_balance_money($balance_year)
        {
            for ($i=1; $i <= $balance_year ; $i++)
            { 
                $increase_percent=$this->get_right_percent($balance_year);
                $this->base_money=$this->base_money*(1+$increase_percent);//逐年计算
                if($this->base_money>$this->max_money){break;}
            }
        }
        private function get_right_percent($balance_year)
        {
            return max((8-$balance_year)/100,$this->min_increase_percent);//保证增长率不小于2%
        }
        private function get_first_three_year_money($balance_year)
        {
            $this->base_money=pow(1+$this->base_increase_percent,$balance_year)*$this->base_money;
        }
        public function get_now_money()
        {
            return $this->base_money;
        }
    }
    
    $obj=new calc_money(28);
    echo $obj->get_now_money();
    ?>

    将每个规则模块化,放入封装的私有方法来调用,避免逻辑上的混乱,为以后的代码修改和迭代打下基础。

  • 相关阅读:
    爬虫开发9.scrapy框架之递归解析和post请求
    爬虫开发7.scrapy框架简介和基础应用
    爬虫开发6.selenuim和phantonJs处理网页动态加载数据的爬取
    爬虫开发4.三种数据解析方式
    Gym–101061A Cards(有待更新)
    GYM 101061 I. Playing with strings(有待更新)
    HDU2072 单词数
    HDU2057 A + B Again(十六进制加法运算)
    HDU2056 Rectangles
    CodeForces 992C Nastya and a Wardrobe
  • 原文地址:https://www.cnblogs.com/lizhaoyao/p/7017813.html
Copyright © 2020-2023  润新知