代码优化实践之税率计算问题

2024-04-20 18:12

本文主要是介绍代码优化实践之税率计算问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

开篇

今天的问题来自于《编程珠玑》第三章【数据决定程序结构】,这里提出了几条代码优化相关的原则,受益不浅。下面是提到的几条原则:

  1. 使用数组重新编写重复代码。冗长的相似代码往往可以使用最简单的数据结构——数组来更好的表述;
  2. 封装复杂结构,当需要非常复杂的数据结构式,使用抽象术语来进行定义,并将操作表示为类;
  3. 尽可能使用高级工具。超文本、名字——值对、电子表格、数据库、编程语言等都是特定稳定领域中强大的工具。
  4. 从数据得出程序的结构。通过使用恰当的数据结构来代替复杂的代码,从数据可以得出程序的结构。万变不离其宗:在动手编写代码之前,优秀的程序员会彻底理解输入、输出和中间数据结构,并围绕这些结构创建程序。

问题概要

本书行将出版之时,美国的个人所得税分为5种不同的费率,其中最大的费率大约为40%。以前的情况更为复杂,税率也更高。下面所示的程序文本采用25个if语句的合理方式来计算1978年的美国联邦所得税。税率分别为0.14,0.15,0.16, 0.17, 0.18,·····。此后的费率增幅大于0.01.有何建议?(下面是书中的代码)

if income <=  2200tax =  0
else  if income <  2700tax =        . 14 * (income -  2200)
else  if income <=  3200tax =  70   +   . 15 * (income -  2700)
else  if income <=  3700tax =  145 +   . 16 * (income -  2200)
else  if income <=  4200tax =  225 +  . 17 * (income -  2200)
.....
else tax =  53090 + . 70 * (income -  102200)

思路分析

只看上面的代码,肯定是过于累赘了,虽然也能实现功能,但不仅不够优雅,而且也不方便维护。
比较理想的一种方法是把所有收入对应的阈值和税率都写在一个表格里,然后使用程序读取表格,不过这个应该是属于后面可能会写的拓展程序(到时单独发一篇文章)。要在上面的程序基础上进行优化,就可以使用一个数组来保存收入阈值和对应的 税率(第一条原则),然后封装出对应的方法。
下面的代码实现逻辑没什么复杂的,此处不多说,不过有一点值得注意的是税率的具体计算方式,比如说收入为3500, 则税值tax = 145 + 0.16 * (3500 - 3200)= 193,理解了这个计算方式,再去看我的代码,应该很容易理解了。

代码实现

#include<stdio.h>typedef struct {int threshold;// 收入阈值double rate;// 税率int baseTax;// 达到前一阈值的基础税额
} TaxBracket;// 计算税值
int calculate_tax(int income) {TaxBracket taxBracket[] = {{2200, 0.00, 0},{2700, 0.14, 0},{3200, 0.15, 70},{3700, 0.16, 145},{4200, 0.17, 225},};int numBracket = sizeof(taxBracket) / sizeof(taxBracket[0]);int tax = 0;int nextLimit = 0;if (income < taxBracket[0].threshold) {return 0;}for (int i = 0; i < numBracket - 1; i++) {if (income <= taxBracket[i + 1].threshold) {tax = taxBracket[i + 1].baseTax + (income - taxBracket[i].threshold) * taxBracket[i + 1].rate;return tax;}}// 若收入大于最后的阈值tax = taxBracket[numBracket - 1].baseTax + (income - taxBracket[numBracket - 1].threshold) * taxBracket[numBracket - 1].rate;return tax;
}int main() {int income;printf("请输入收入值: ");scanf_s("%d", &income);int tax = calculate_tax(income);printf("收入%d的应缴税额为%d\n", income, tax);return 0;
}

代码运行结果截图

以上便是对于税率计算代码的一种优化实践方式,不过值得一提的是,我的代码肯定不算最优化的方式,只不过我技止于此,暂且没找到更加优化的方法,若各位大佬有什么想法,还请不吝指教了。
感谢阅读。

这篇关于代码优化实践之税率计算问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/920971

相关文章

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Springboot整合Redis主从实践

《Springboot整合Redis主从实践》:本文主要介绍Springboot整合Redis主从的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言原配置现配置测试LettuceConnectionFactory.setShareNativeConnect

MySQL 设置AUTO_INCREMENT 无效的问题解决

《MySQL设置AUTO_INCREMENT无效的问题解决》本文主要介绍了MySQL设置AUTO_INCREMENT无效的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录快速设置mysql的auto_increment参数一、修改 AUTO_INCREMENT 的值。

关于跨域无效的问题及解决(java后端方案)

《关于跨域无效的问题及解决(java后端方案)》:本文主要介绍关于跨域无效的问题及解决(java后端方案),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录通用后端跨域方法1、@CrossOrigin 注解2、springboot2.0 实现WebMvcConfig

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码

Java死锁问题解决方案及示例详解

《Java死锁问题解决方案及示例详解》死锁是指两个或多个线程因争夺资源而相互等待,导致所有线程都无法继续执行的一种状态,本文给大家详细介绍了Java死锁问题解决方案详解及实践样例,需要的朋友可以参考下... 目录1、简述死锁的四个必要条件:2、死锁示例代码3、如何检测死锁?3.1 使用 jstack3.2

解决JSONField、JsonProperty不生效的问题

《解决JSONField、JsonProperty不生效的问题》:本文主要介绍解决JSONField、JsonProperty不生效的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录jsONField、JsonProperty不生效javascript问题排查总结JSONField

github打不开的问题分析及解决

《github打不开的问题分析及解决》:本文主要介绍github打不开的问题分析及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、找到github.com域名解析的ip地址二、找到github.global.ssl.fastly.net网址解析的ip地址三

MySQL版本问题导致项目无法启动问题的解决方案

《MySQL版本问题导致项目无法启动问题的解决方案》本文记录了一次因MySQL版本不一致导致项目启动失败的经历,详细解析了连接错误的原因,并提供了两种解决方案:调整连接字符串禁用SSL或统一MySQL... 目录本地项目启动报错报错原因:解决方案第一个:第二种:容器启动mysql的坑两种修改时区的方法:本地