初级系列11.个人所得税问题
个人所得税问题
问题描述
编写一个计算个人所得税的程序,
要求输入收入金额后,能够输出应缴的个人所得税,
个人所得税征收方法如下:
起征点为3500元
不超过1500元的部分,征收3%
超过1500-4500元的部分,征收10%
超过4500-9000元的部分,征收20%
超过9000-35000元的部分,征收25%
超过35000-55000元的部分,征收30%
超过55000-80000元的部分,征收35%
超过80000元以上的,征收45%
问题分析
分析题目特点,考虑使用结构体来描述题目中的条件
c语言中允许用户自己定义结构体,它相当于其它高级语言中的记录
声明一个结构体类型的一般形式为
struct 结构体名
{结构体成员列表}
算法设计
使用结构体存放不同的税率范围,接着使用for循环遍历每一个征税范围
将个人收入中超出起征点的金额在每个征税范围内应缴纳的税款累加起来
就得到最后应缴纳的个人所得税
#include <stdio.h>
#define TAXBASE 3500
/* !<定义结构体 */
typedef struct {
long start;
long end;
double taxrate;
} TAXTABLE;
/* 定义结构体数组 */
TAXTABLE TaxTable[] = {
{0, 1500, 0.03},
{1500, 4500, 0.10},
{4500, 9000, 0.20},
{9000, 35000, 0.25},
{35000, 55000, 0.30},
{55000, 80000, 0.35},
{80000, 1e10, 0.45}
};
/* !<Caculate function */
double CaculateTax(long profit)
{
int i;
double tax = 0.0;
profit -= TAXBASE; /* !< 超过个税起征点的收入 */
for (i = 0; i < sizeof(TaxTable)/sizeof(TAXTABLE); i++) {
/* !<判断profit是否在当前的缴税范围内 */
if (profit > TaxTable[i].start) {
if (profit > TaxTable[i].end) {
tax += (TaxTable[i].end - TaxTable[i].start)*TaxTable[i].taxrate;
}
else { /* !< profit 未超过当前的缴税范围 */
tax += (profit - TaxTable[i].start)*TaxTable[i].taxrate;
}
profit -= TaxTable[i].end;
printf("征税范围: %6ld-%6ld 该范围内缴税金额: %6.2f 超出该范围的金额:%6ld\n",
TaxTable[i].start,TaxTable[i].end,tax,(profit)>0 ? profit : 0);
}
}
return tax;
}
int main(void)
{
long profit;
double tax;
printf("请输入个人收入金额:");
scanf("%ld", &profit);
tax = CaculateTax(profit);
printf("您的个人所得税为: %12.2f\n",tax);
}
/* !< output */
请输入个人收入金额:9876
征税范围: 0- 1500 该范围内缴税金额: 45.00 超出该范围的金额: 4876
征税范围: 1500- 4500 该范围内缴税金额: 345.00 超出该范围的金额: 376
您的个人所得税为: 345.00
Process returned 0 (0x0) execution time : 2.772 s
Press any key to continue.