问答题 阅读以下说明和C代码,填补代码中的空缺,将解答填入答题纸的对应栏内。
[说明]
下面的程序代码根据某单位职工的月工资数据文件(名称为Salary.dat,文本文件),通过调用函数GetIncomeTax计算出每位职工每月需缴纳的个人所得税额并以文件(名称为IncomeTax.dat,文本文件)方式保存。
例如,有4个职工工资数据的Salary.dat内容如下,其中第一列为工号(整数),第2列为月工资(实数)。
1030001 6200.00
1030002 5800.00
2010001 8500.00
2010010 8000.00
相应地,计算所得IncomeTax.dat的内容如下所示,其中第3列为个人所得税额:
1030001 6200.00 47.20
1030002 5800.00 35.94
2010001 8500.00 233.50
2010010 8000.00 193.00
针对工资薪金收入的个人所得税计算公式为:
个人所得税额=应纳税所得额×税率-速算扣除数
其中,应纳税所得额=月工资-三险一金-起征点
税率和速算扣除数分别与不同的应纳税所得额对应,如下表所示。
级数 全月应纳税所得额X(元) 税率(%) 速算扣除数(元)
1 0<X≤1500 3 0
2 1500<X≤4500 10 105
3 4500<X≤9000 20 555
4 9000<X≤35000 25 1005
5 35000<X≤55000 30 2755
6 55000<X≤80000 35 5505
7 X>80000 45 13505
设三险一金为月工资的19%,起征点为3500元。
例如,某人月工资为5800元,按规定19%缴纳三险一金,那么:
其应纳税所得额X=5800-5800×19%-3500=1198元,对应税率和速算扣除数分别为3%和0元,因此,其个人所得税额为1198×3%-0=35.94元。
[C代码]
#include <stdio.h>
#define BASE 3500 //起征点
#define RATE 0.19 //三险一金比例
______; //声明函数GetIncomeTax
int main()
{
int id;
double salary;
FILE *fin,*fout;
fin = fopen("Salary.dat","r");
if (______) return 0;
fout = fopen("IncomeTax.dat","w");
if (______) return 0;
while (!feof(fin)) {
if (fscanf(fin,"%d%if", ______) !=2) break;
fprintf(fout,"%d\t%.21f\t%.21f\n",id, salary, ______);
}
fclose(fin);
fclose(fout);
return 0;
}
double GetIncomeTax(double salary)
{
double yns_sd;
yns_sd = ______ - BASE; /*计算应纳税所得额*/
if (yns_sd<=0) return 0.0;
else if (yns_sd<=1500) return yns_sd*0.03;
else if (yns_sd<=4500) return yns_sd*0.1-105;
else if (yns_sd<=9000) return yns_sd*0.2-555;
else if (yns_sd<=35000) return yns sd*0.25-1005;
else if (yns_sd<=55000) return yns_sd*0.3-2755;
else if(yns_sd<=80000) return yns_sd*0.35-5505;
return yns_sd*0.45-13505;
}
【正确答案】
【答案解析】double GetIncomeTax(double salary)或double GetIncomeTax(double)
!fin或fin=NULL或fin==0
!fout或fout==NULL或fout==0
&id.&salary
GetIncomeTax(salary)
salary*(1-RATE)或等价形式
注:RATE可替换为0.19 [解析] 本题考查C语言程序设计基本技能。考生需认真阅读题目中的说明,以便理解问题并确定代码的运算逻辑,在阅读代码时,还需注意各变量的作用。
根据注释,空(1)处应填入“double GetIncomeTax(double salary)”或“double GetIncomeTax(double)”,对函数GetlncomeTax进行声明。
空(2)、(3)处所在的代码是判断文件打开操作是否成功,因此应分别填入“!fin”、“!fout”。
根据说明可知,变量id和salary分别表示工号和月工资数。
空(4)处所在语句为从文件中读取数据的操作,从fscanf的格式控制串可知读取的两个数是整数和双精度浮点数,则输入表列的两个变量分别为接收整数值的变量id和接收整数值的变量salary,因此空(4)应填入“&id,&salary”。
空(5)处所在代码向fout关联的文件写入计算出的所得税额,显然需调用函数GetIncomeTax来计算,因此应填入“GetIncomeTax(salary)”。
空(6)处的代码计算应纳税所得额,根据说明中给出的计算公式及三险一金的计算方法:
应纳税所得额=月工资-三险一金-起征点
空(6)处应填入“salary*(1-RATE)”。