2015年上半年软件水平考试(初级)程序员下午(应用技术)真题试

  • 格式:doc
  • 大小:47.00 KB
  • 文档页数:7

2015年上半年软件水平考试(初级)程序员下午(应用技术)真题试卷 (题后含答案及解析)

题型有:1. 必答题 2. 选答题

必答题(共4道大题,每道大题15分)

1. 阅读以下说明和流程图,填补流程图中的空缺。【说明】 下面流程图的功能是:在给定的两个字符串中查找最长的公共子串,输出该公共子串的长度L及其在各字符串中的起始位置(L一O时不存在公共字串)。例如,字符串“Thelight is not bright tonight”与“Tonight the light is not bri.ght”的最长公共子串为“he light isnot bright”,长度为22,起始位置分别为2和10。 设A[1:M]表示由M个字符A[l],A[2],…,A[M]依次组成的字符串;B[1:N]表示由N个字符B[l],B[2],…,B[N]依次组成的字符串,M≥N≥l。 本流程图采用的算法是:从最大可能的公共子串长度值开始逐步递减,在A、B字符串中查找是否存在长度为L的公共子串,即在A、B字符串中分别顺序取出长度为L的子串后,调用过程判断两个长度为L的指定字符串是否完全相同(该过程的流程略)。【流程图】

正确答案:(1)N或min(M,N)(2)M一L+1(3)N一L+1(4)1一1(5)L,I,J

解析:本题考查对算法流程图的理解和绘制能力。这是程序员必须具有的技能。 本题的算法可用来检查某论文是否有大段抄袭了另一论文。“The light is

not brighttonight”是著名的英语绕口令,它与“Tonight the light is not bright”大同小异。 由于字符串A和B的长度分别为M和N,而且M≥N≥l,所以它们的公共子串长度L必然小于或等于N。题中采用的算法是,从最大可能的公共子串长度值L开始逐步递减,在A、B字符串中查找是否存在长度为L的公共子串。因此,初始时,应将min(M, N)送L,或直接将N送L。(1)处应填写N或min(M,N),或其他等价形式。 对每个可能的L值,为查看A、B串中是否存在长度为L的公共子串,显然需要执行双重循环。A串中,长度为L的子串起始下标可以从1开始直到M一L+1(可以用实例来检查其正确性);B串中,长度为L的子串起始下标可以从1开始直到N一L+1。因此双重循环的始值和终值就可以这样确定,即(2)处应填M一L+l,或等价形式;(3)处应填N一L+l或等价形式(注意循环的终值应是最右端子串的下标起始值)。 A串中从下标I开始长度为L的子串可以描述为A[I:I+L一1];B串中从下标J开始长度为L的子串可以描述为A[J:J+L一l]。因此,双重循环体内,需要比较这两个子串(题中采用调用专门的函数过程或子程序来实现)。 如果这两个子串比较的结果相同,那么就已经发现了A、B串中最大长度为L的公共子串,此时,应该输出公共子串的长度值L、在A串中的起始下标I、在B串中的起始下标J。因此,(5)处应填L,I,J(可不计顺序)。 如果这两个子串比较的结果不匹配,那么就需要继续执行循环。如果直到循环结束仍然没有发现匹配子串时,就需要将L减少l((4)处填L一l或其等价形式)。只要L非0,则还可以继续对新的L值执

行双重循环。如果直到L=0,仍没有发现子串匹配,则表示A、B两串没有公共子串。

2. 阅读以下说明和C函数,填补函数代码中的空缺。【说明1】函数f(double

eps)的功能是:利用公式计算并返回π的近似值。 double f(double

eps){ double n一1一0, s = 1.0, term = 1.0, pi = 0.0;while( fabs(term》一eps ){ pi=pi+term; n=(1); s=(2); term=s /n; } return

pi*4;}【说明2】 函数fun(char *str)的功能是:自左至右顺序取出非空字符串str中的数字字符,形成一个十进制整数(最多8位)。例如,若str中的字符串为“iyt?67kp f398d5.j4ia2e3p12”,则函数返回值为67385423。I:C函数2] long

fun(char *str){ int.i=0; long num=0; char*p=str; while(i<8 &&(3)){ if(*p>= ‘0’ &&*p<= ‘9’ ){ num=(4)+*p一’0’;

++i; }(5); } return num;}

正确答案:(1)n+2(2)s或一1*s(3)*p!=‘\0’或等价形式(4)num*10或等价形式(5)p++或等价形式

解析:本题考查C语言程序设计基本技能。考生需认真阅读题目中的说明,从而确定代码的运算逻辑,在阅读代码时,还需注意各变量的作用。 函数f(double eps)的功能是计算兀的近似值。观察题中给出的计算公式,可知在循环中n每次递增2,因此空(1)处应填入“n+2”。由于公式中的各项是正负交替的,因此结合表达式“term=s/n”可知变量s就是起此作用的。空(2)处应填入“一s”或“一1*s”。 对于函数fun(char *str),从字符序列中取出数字并组合为一个整数时,对于每个数字,只需将之前获取的部分乘以10再加上该数字的值即可。

以67385423为例。

67385423=(((((((0+6)*10+7)*10+3)*10+8)*10+5)*10+4)*10+2)*10+3 函数中的变量i是用来计算位数的,num用来计算所获得的整数值。显然,最多读取字符序列中的前8个数字,或者到达字符序列的末尾(*p!=‘\0’)时,计算也需结束。因此,空(3)处应填入“*p!=‘\0’”。 根据num的作用,空(4)处应填入“num*10”。 根据指针p的作用,空(5)处的代码应使得p指向下一个字符,因此应填入“p++”。

选答题(共3道大题,每道大题15分)从下列3道试题中任选1道解答,如果解答的试题数超过1道,则仅题号小的1道题解答有效。

3. 阅读以下说明和C代码,填补代码中的空缺。【说明】 下面的程序代码根据某单位职工的月工资数据文件(名称为Salary.dat,文本文件),通过调用函数Get1ncomeTax计算出每位职工每月需缴纳的个人所得税额并以文件(名称为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 针对工资薪金收入的个人所得税计算公式为: 个人所得税额=应纳税所得额×税率一速算扣除数 其中,应纳税所得额=月工资一三险一金一起征点 税率和速算扣除数分别与不同的应纳税所得额对应,如表3一1所示。 设三险一金为月工资的19%,起征点为3500元。 例如,某人月工资为5800元,按规定19%缴纳三险一金,那么: 其应纳税所得额X=5800一5800x19%一3500=1198元,对应税率和速算扣除数分别为3%和0元,因此,其个人所得税额为1198×3%一0=35.94元。【C代码】 #include <stdio.h> #define BASE 3500

//起征点 #define RATE 0.19 //三险一金比例(1); //声明函数GetIncomeTax int main( ){ int id; double salary; FILE *fin,*fout; fin=fopen(“Salary.dat”,”r”); if((2))return 0; fout=fopen

“‘IncomeTax.dat”,”w”); if((3))return 0;

while(!feof(fin)){ if(fscanf(fin,”ood%lf”,(4))!=2)break; fprintf(fout, “%d\ too.21f\t%.21f\n”, id, salary,(5)); } fclose(fin); fclose(fout);

return 0; } double GetIncomeTax(double salary){ double yns_sd;

yns_sd=(6)一BASE; /*计算应纳税所得额*/ if(yns_sd<=0)return 0.0;

else if(yns sd<=1500)return yr.cs_sd*0.03; else if(yns sd<=4500)return

yrs_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; }

正确答案:(1)double Get1ncomeTax(double salary)或double

GetIncomeTax(double)(2)!fin或fin==NULL或fin==0(3)!fout或fout==NULL或fout==0(4)&id,&salary(5)GetIncomeTax(salary)(6)salary*(1一RATE)或等价形式注:RATE可替换为0.19

解析:本题考查C语言程序设计基本技能。考生需认真阅读题目中的说明,以便理解问题并确定代码的运算逻辑,在阅读代码时,还需注意各变量的作用。

根据注释,空(1)处应填入“double GetIncomeTax(double salary)”或“double

GetIncomeTax(double)”,对函数GetIncomeTax进行声明。 空(2)、(3)处所在的代码是判断文件打开操作是否成功,因此应分别填入“!fin”、“!fout”。 根据说明可知,变量id和salary分别表示工号和月工资数。 空(4)处所在语句为从文件中读取数据的操作,从fscanf的格式控制串可知读取的两个数是整数和双精度浮点数,则输入表列的两个变量分别为接收整数值的变量id和接收整数值的变量salary,因此空(4)应填入“&id, &salary”。 空(5)处所在代码向fout关联的文件写入计算出的所得税额,显然需调用函数GetIncomeTax来计算,因此应填入“GetIncomeTax(salary)”。 空(6)处的代码计算应纳税所得额,根据说明中给出的计算公式及三险一金的计算方法: 应纳税所得额=月工资一三险一金一起征点 空(6)处应填入“salary *(1一RATE)”。