C语言个人所得税问题
问题描述
编写一个计算个人所得税的程序,要求输入收入金额后,能够输出应缴的个人所得税。 个人所得税征收办法如下:◎ 起征点为3500元;
◎ 不超过1500元的部分,征收3%;
◎ 超过1500〜4500元的部分,征收10%;
◎ 超过4500〜9000元的部分,征收20%;
◎ 超过9000〜35000元的部分,征收25%;
◎ 超过35000〜55000元的部分,征收30%;
◎ 超过55000〜80000元的部分,征收35%;
◎ 超过80000元以上的,征收45%。
问题分析
个人所得税是根据收入金额划分为不同阶段征收的,分析题目特点,可以使用结构体来描述题目中的条件。算法设计
可以使用结构体数组存放不同的税率范围。接着使用 for 循环遍历每一个征税范围,将个人收入中超出起征点的金额在每个征税范围内应缴纳的税款累加起来,就得到最后应缴纳的个人所得税。纳税金额流程图:
下面是完整的代码:
#include <stdio.h> #include <limits.h> #define TAXBASE 2000 /*定义结构体*/ 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, LONG_MAX, 0.45} }; double CaculateTax(long profit) { int i; double tax = 0.0; profit -= TAXBASE; for(i=0; i<sizeof(TaxTable)/sizeof(TAXTABLE); i++) { if(profit>TaxTable[i].start) { if(profit>TaxTable[i].end) { tax += (TaxTable[i].end-TaxTable[i].start) * TaxTable[i].taxrate; } else { 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() { long profit; double tax; printf("请输入个人收入金额: "); scanf("%ld", &profit); tax = CaculateTax(profit); printf("您的个人所得税为: %.2f\n", tax); return 0; }运行结果:
请输入个人收入金额: 100000 征税范围: 0~ 1500 该范围内缴税金额: 45.00 超出该范围的金额: 96500 征税范围: 1500~ 4500 该范围内缴税金额:345.00 超出该范围的金额: 92000 征税范围: 4500~ 9000 该范围内缴税金额:1245.00 超出该范围的金额: 83000 征税范围: 9000~ 35000 该范围内缴税金额:7745.00 超出该范围的金额: 48000 征税范围: 35000~ 55000 该范围内缴税金额:11645.00 超出该范围的金额: 0 您的个人所得税为: 11645.00
知识点补充
使用结构体指针来改写原来程序中的 CaculateTax() 函数,改写后的代码如下:double CaculateTax(long profit) { TAXTABLE *p; double tax=0.0; profit-=TAXBASE; for( p=TaxTable; p<TaxTable+sizeof(TaxTable)/sizeof(TAXTABLE); p++ ) { if(profit>p->start) { if( profit>p->end ) { tax+=(p->end-p->start)*p->taxrate; } else { tax+=(profit-p->start)*p->taxrate; } profit-=p->end; printf( "征税范围:%61d~%61d 该范围内缴税金额:%6.2f 超出范围的金额:%61d\n", p->start, p->end, tax, (porfit)>0 ? profit : 0); } } return tax; }在在改写后的 CaculateTax() 函数中,指针 p 是指向 TAXTABLE 类型数据的指针变量。 在 for 循环语句中先给 p 赋初值 TaxTable, TaxTable 也就是数组 TaxTable 的起始地址。这样,就可以使用指针变量来引用 TaxTable 中的各个数组元素(每个数组元素是一个结构体变量)的成员值。
在第一次循环时,p 指向 TaxTable[0],则 p->start、p->end 和 p->taxrate 引用的都是 TaxTable[0] 中的成员。然后执行 p++,使 p 自增 1,此时p所增加的值为结构体数组 TaxTable 中一个元素所占有的字节数,即 sizeof(TAXTABLE)。在执行 p++ 后,p 的值变为 TaxTable+1, 即 p 指向数组元素 TaxTable[1] 的起始地址了,这样在第二次循环时的 p->start、p->end 和 p->taxrate 引用的就都是 TaxTable[1] 中的成员了。接着再执行 p++,此时 p 的值变为 TaxTable+2,即 p 指向数组元素 TaxTable[2] 的起始地址,这样在第三次循环时的p->start、 p->end 和 p->taxrate 引用的就都是 TaxTable[2] 中的成员了。这样不断循环下去,p的值不断自增,直到对 TaxTable 数组中最后一个数组元素操作完毕为止。