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

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

相关文章

Redis 热 key 和大 key 问题小结

《Redis热key和大key问题小结》:本文主要介绍Redis热key和大key问题小结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、什么是 Redis 热 key?热 key(Hot Key)定义: 热 key 常见表现:热 key 的风险:二、

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

Spring 中的循环引用问题解决方法

《Spring中的循环引用问题解决方法》:本文主要介绍Spring中的循环引用问题解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录什么是循环引用?循环依赖三级缓存解决循环依赖二级缓存三级缓存本章来聊聊Spring 中的循环引用问题该如何解决。这里聊

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

SpringBoot项目中报错The field screenShot exceeds its maximum permitted size of 1048576 bytes.的问题及解决

《SpringBoot项目中报错ThefieldscreenShotexceedsitsmaximumpermittedsizeof1048576bytes.的问题及解决》这篇文章... 目录项目场景问题描述原因分析解决方案总结项目场景javascript提示:项目相关背景:项目场景:基于Spring

Spring Boot 整合 SSE的高级实践(Server-Sent Events)

《SpringBoot整合SSE的高级实践(Server-SentEvents)》SSE(Server-SentEvents)是一种基于HTTP协议的单向通信机制,允许服务器向浏览器持续发送实... 目录1、简述2、Spring Boot 中的SSE实现2.1 添加依赖2.2 实现后端接口2.3 配置超时时

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决