初级程序员下午试题-88
- 格式:doc
- 大小:30.67 KB
- 文档页数:12
初级程序员下午试题-88 (总分:120.00,做题时间:90分钟) 一、试题一(总题数:1,分数:15.00) 1.【流程图】
下面的流程图描述了对16位二进制整数求补的算法。计算过程是:从二进制数的低位 (最右位)开始,依次向高位逐位查看,直到首次遇到“1”时,停止查看。然后,对该“1”位左面的更高位(如果有的话),逐位求反,所得的结果就是对原二进制数求补的结果。 例如:对二进制整数10111001 10101000求补的结果是01000110 01011000。 设16位二进制整数中的各位,从低位到高位,依次存放在整型数组BIT的BIT[1]~BIT[16]中。例如,二进制整数10111001 10101000存放在数组BIT后,就有BIT1[1]=0, BIT[2]=0,……,BIT[15]=0,BIT[16]=1。 流程图(如图1所示)中 (1) 处按“循环变量名:循环初值,增量,循环终值”格式描述。若流程图中存在空操作,则用NOP表示。
(分数:15.00) 填空项1:__________________ (正确答案:i: 1, 1, 16 (2)1->sw (3)0→BIT[i] (4) NOP,或空操作 (5)1->BIT[i]) 解析:[解析] 该流程图的功能在说明中已经解释了,要解该题关键要搞清楚流程图中引用的变量sw的含义。通过阅读流程图的说明和流程图可知,变量sw主要用来定义是否已经找到某一位是“1”:当sw=0时,说明到目前为止还没有哪一位是“1”,不需要对该位求反;当sw=1时,说明已经有一位是“1”,需要对该位求反。 先来看(1)空。(1)空是要写出循环变量名、循环初值、增量和循环终值,该题要从遍历整型数组BIT的所有元素,从BIT[1]开始到BIT [16]结束,再看流程图的第1个判断用的变量是i,这样就可判断循环变量名为i,循环初值为1,增量为1,循环终值为16。这样(1)空的答案为“i:1,1,6”。 在这个循环中,当第i位是1时,即BIT(i)=1,进入左分支。这时需要判断sw值,若sw=0,需要将sw置为1;“若sw=1,需要对将BIT(i)置为 0。这样(2)空的答案为“1->sw”;(3)空的答案为“0->BIT[i]”。 同样,当第i位是。时,即BIT(i)=0,进入右分支。这时需要判断 sw值,若sw=0,将不作任何操作;若sw=1,需要对将BIT(i)置为1。这样(4)空的答案为“NOP”;(5)空的答案为“1->BIT[i]”。 二、试题二(总题数:1,分数:15.00)
2.【说明】 程序8用于计算某公司每个职工应缴纳的个人所得税额和全体职工缴纳的个人所得税总额,职工的当月收入(工资或薪金)通过键盘输入,每次输入一个职工的工号和工资(或薪金)。由于该公司的工资或薪金是不定时发放的,所以输入过程中每个职工的收入会出现多次输入,整个输入以工号小于等于0结束。 假设个人所得税法规定:个人收入所得,按月计税,以每月收入总额减除免税金额800元后的余额作为该月的月应纳税所得额。适用税率如表2所示。 表 2 级数 月应纳税所得额 适用税率(%) 1 2 3 4 5 6 不超过500元的部分 501元~2000元的部分 2001元~5000元的部分 5001元~2000元的部分 2001元~4000元的部分 4001元~6000元的部分 5 10 15 20 25 30 7 8 9 6001元~8000元的部分 8001元~100000元的部分 超过100000元的部分 35 40 45 上表表明,个人收入所得税是按照超额累进的税率来征收的。 设一个人的月应纳税所得额为K(元),用下面的公式计算其应缴纳的个人所得税额S (元); 若0<K≤500,则S=K×5%; 若500<K≤2000,则S=500×5%+(K-500)×10%; 若2000<K≤5000,则S=500×5%+1500×10%+(K-2000)×15%; 若5000<K≤20000,则S=500×5%+1500×10%+3000×15%+(K-5000)×20%; ... 例如,某人某月收入总额为4100元,减去800元后,应纳税所得额为3300元,其应缴纳的个人所得税额为500*5%+1500*10%+1300*15%=370元。 【程序】 #include<stdio.h> #define MaxNum 50 #define BASE 800 /*免税金额基数*/ int paylevel[]=0,500,2000,5000,20000,40000,60000,80000,100000,1000001; int taxPrate[]=5,10,15,20,25,30,35,40,45; /*税率表*/ typedef struct int ld; /*职工的工号*/ long Salary; /*职工的工资*/ Info; /*查找工号为ld的职工在数组employee中的下标,返回值为0表示没有*/ int find (int ld ,Info employee[], int m) int j; employee[0]. Id=Id; for(j=m; (1) ;j--); return j;
void main(void) Info employee[MaxNum+1]; long Wage; double sum=0, K,S; int i,j,N=0,Code; scanf("%d %Id",&Code,&Wage); while(Code>0) i=find (Code, empolyee, N ); if(i>0)employee [i]. Salary+=Wage; else (2) ; employee[N]. Id=Code;employee[N]. Salary =Wage;
scanf("%d %Id", &Code, &Wage); for(i=1;i<=N;i++) K= (3) ; /*计算月应纳税所得额*/ S=0; /*月应纳税额赋初值*/ if(K>0) for(j=1;j<=9;j++) if (4) /*月应纳税所得额超过第j级*/ S=S+(paylevel[j]-paylevel[j-1])*taxPrate[j-1]/100; elseS =S+ (5) * taxPrate[j-1]/100; break;
printf("职工%d应缴纳的个人所得税额:%10.21f/n",employee[i].Id,S); sum+=S;
printf("全体职工个人所得税总额:%10.21f/n",sum);
(分数:15.00) 填空项1:__________________ (正确答案:employee[j].Id!=Id (2) ++N 或N++或N=N+1 (3) employee [i]. Salary-BASE (4) K>paylevel[j] (5)K-paylevel[j-1]) 解析:[解析] (1)find函数的功能是找到了号为Id的职工在数组employee中的下标。显然,循环进行下去的条件是employee[j].Id!=Id。 (2)当i=0时,表明该职工的信息是第一次录入,所以应当在数组employee中创建一个新元素,于是此处应填入N++或其他等价表达式。 (3)K表示该月应纳的所得税额,所以应填入employee[i].SalaryBASE。(4)此处是判断当前职工的工资是否超过第j级,所以应填入 K>paylevel[j])。(5)当前职工的工资不超过第j级,应当计算它与第j-1级的差额的所得税,所以应填入K-paylevel[j-1]。 三、试题三(总题数:1,分数:15.00)
3.【说明】 下面的程序功能的功能是以行为单位对字符串按下面的条件进行排序。排序条件为:从字符串中间一分为二,右边部分按字符的ASCII值降序排序,排序后左边部分与右边部分进行交换。如果原字符串长度为奇数,则最中间的字符不参加排序,字符仍放在原位置上 例如:位置:0 1 2 3 4 5 6 7 源字符串:h g f e a b c d 则处理后字符串:d c b a h g f e 函数ReadDat()实现从文件in.dat中读取数据(每行字符串长度均小于80),函数WriteDat()把结果dat输出到文件out.dat中。 #include<stdio.h> #include<siring.h> #include<conio.h> char dat[20] [80]; void jsSort()
int i,j,k,strl; char ch; for(i=0;i<20;i++) strl=strlen(date[i]); for(j= (1) ;j<strl;j++) /*对后半部分的字符串进行排序*/ for(k=j+1;k<strl;k++) if( (2) )
ch=dat[i] [j]; dot[i] [j]=dat[i] [k]; dat[i] [k]=ch;
for(j=0; (3) j++) /*前后两部分进行交换*/ ch = date [i] [j]; dote [i] [j] = date [i] [(strl+1)/2+j]; dat [i] [(strl+1)/2+j]=ch;
void main() reodDat(); isSort(); writeDot();
readDat () FILE * in; int i=0; char * p; (4) ; while(i<20 && fgets(dat[i],80,in)!=NULL)
p = strchr(date [i],"/n"); if(p) *p=0; i++;
fclose (in); writeDat() FILE * out; int i; clrscr (); out = fopen("out. dat" ,"W"); for(i=0;i<20;i++)
printf("%s/n",dar[i]); printf ( (5) );
fclose (out);
(分数:15.00) 填空项1:__________________ (正确答案:(strl+1)/2 (2)dat[i][j]<dat[i][k] (3)j<strl/2 (4)in=fopen("in. dat","r") (5)out,"% s/n",dat[i]) 解析:[解析] 程序的思路是:先调用函数ReadDat()从文件in.dat中读取20行数据存放到字符中数组dat中,然后调用函数jsSort()对字符串数组dar按照排序规则进行排序,排序后的结果仍按行重新存入字符串数组dat中,最后调用函数WriteDat()把结果dat输出到文件out.dat中。