1、二级 C语言机试-182 及答案解析(总分:100.00,做题时间:90 分钟)一、填空题(总题数:1,分数:30.00)在给定程序中,函数 fun的功能是:把形参 a所指数组中的偶数按原顺序依次存放到 a0、a1、a2、中,把奇数从数组中删除,将偶数的个数通过函数值返回。例如:若 a所指数组中的数据最初排列为:9、1、4、2、3、6、5、8、7,删除奇数后 a所指数组中的数据为:4、2、6、8,返回值为 4。请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的 BLANK1.C中。不得增行或删行,也不得更改程序的结构。文件 BLANK1.C内
2、容如下:#includestdio.h#define N 9int fun(int a ,int n)int i,j;j=0;for(i=0;in;i+)/*found*/if( (1) =0)/*found*/(2) =ai;j+;/*found*/return (3) ;void main( )int bN=9,1,4,2,3,6,5,8,7,i,n;printf(“/nThe original data: in“);for(i=0;iN;i+)printf(“%4d“,bj);printf(“/n“); n=fun(b,N);printf(“/nThe nunlber of even:
3、%d/n“,n);printf(“/n The even: in“);for(i=0;in;i+)printf(“%4d“,hi);printf(“/n“):(分数:30.00)填空项 1:_填空项 1:_填空项 1:_二、改错题(总题数:1,分数:30.00)1.给定程序 MODI1.C函数 fun的功能是:依次取出字符串中所有数字字符,形成新的字符串,并取代原字符串。请改正程序中的错误,使它能得出正确的结果。注意:不要改动 main函数,不得增行或删行,也不得更改程序的结构。文件 MODI1.C内容如下:#includestdio.hvoid fun(char *s)int i,j;for
4、(i=0,j=0; si!=/0;i+)if(si=0 n=fun(b,N);printf(“/nThe nunlber of even: %d/n“,n);printf(“/n The even: in“);for(i=0;in;i+)printf(“%4d“,hi);printf(“/n“):(分数:30.00)填空项 1:_ (正确答案:ai%2)解析:填空项 1:_ (正确答案:aj)解析:填空项 1:_ (正确答案:i)解析:解析 题目要求将奇数删除,将偶数放入数组相应的元素中。函数 fun使用的算法实质就是将偶数往前移动,放入 a0、a1、a2、中。程序中利用循环对所有的元素进行判
5、断,若是偶数则往a0、a1、a2、中赋值,因此第 1空处应填入 ai%2,判断 ai的奇偶性。循环中利用变量 i作为数组元素下标,依次取出数组元素进行奇偶性的判断,利用变量 j记录要覆盖的数组元素的位置,满足条件的 ai赋值给 aj,所以第 2空处应填入 aj。循环结束后,变量 j的值就是最后偶数的个数,所以将其返回,第 3空处应填入 j。二、改错题(总题数:1,分数:30.00)1.给定程序 MODI1.C函数 fun的功能是:依次取出字符串中所有数字字符,形成新的字符串,并取代原字符串。请改正程序中的错误,使它能得出正确的结果。注意:不要改动 main函数,不得增行或删行,也不得更改程序的
6、结构。文件 MODI1.C内容如下:#includestdio.hvoid fun(char *s)int i,j;for(i=0,j=0; si!=/0;i+)if(si=0& si=9)/*found*/sj=si;/*found*/Sj=“/0“;void main( )char item80;printf(“/nEnter a string:“);gets(item);printf(“/n/nThe string is:/“%s/“/n“,item);fun(item);printf(“/n/nThe string of changing is: /“%s/“/n“,item);(分数
7、:30.00)填空项 1:_ (正确答案:第 1处:将“sj=si;”改为“sj+=si;”。第 2处:将“sj=“/0“;”改为“sj=/0;”。)解析:解析 题目要求将数字字符取出,实际就是将其他字符删除。函数 fun中使用的删除算法是:将数字字符往前移动,依次放入 s0、s1、s2、等数组元素中,最后将字符串结束标记放入适当的位置。变量 i作为每次取出元素的下标,变量 j记录赋值的位置。在 for循环中,每次判断当前要处理的字符 si是否为数字字符,若是则将其赋值到字符数组相应的单元 sj中。循环结束后,给新字符串加上字符串结束标记。对于第 1处错误,j 变量的值始终为 0,没有改变,元
8、素下标出现错误,当 si赋给 sj后,j 应该自加 1,由于题目不允许增加行或删除行,所以只能将下标 j改为“j+”;对于第 2处错误,混淆了字符和字符串的区别,sj是一个字符变量,只能存储一个字符,而“/0”是一个字符串,所以将字符串的结束标记赋值给 sj只能用单引号括起来。归纳总结 处理数组问题时,错误通常出现在数组元素下标的表示上。数组元素的下标从 0开始编号,下标值不能超过数组大小的定义。要修改此类错误,必须弄清楚程序的算法、循环的执行过程、下标的变换规律及程序中数组下标的最小值和最大值是否超过数组的范围,从而发现错误位置。对于字符数组,除了注意数组元素的下标表示外,还要注意字符串的结
9、束标记/0的位置及书写方法。数组处理的常见错误有:(1)数组元素下标出错,尤其是出现两个数组时,如果采用不同的变量来表示两个数组元素的下标,一定要注意下标名要前后统一。(2)字符数组中,单引号和双引号的使用错误。如果是字符应该用单引号括起来,如果是字符串应该用双引号括起来;(3)字符串结束标记/0使用错误。三、编程题(总题数:1,分数:40.00)2.假定输入的字符串中只包含字母和*号。请编写函数 fun,它的功能是:删除字符串中所有的*号。在编写函数时,不得使用 C语言提供的字符串函数。例如,字符串中的内容为:*A*BC*DEF*G*,删除后,字符串中的内容应当是:ABCDEFG。注意:部分
10、源程序在文件 PROG1.C中。请勿改动主函数 main和其他函数中的任何内容,仅在函数 fun的花括号中填入你编写的若干语句。文件 PROG1.C内容如下:#includestdio.hvoid fun(char *a)void main( )char s81;printf(“Enter a string: /n“);gets(s);fun(s);printf(“The string after deleted:/n“);pats(s);(分数:40.00)_正确答案:(void fun(char *a)int i,j;for(i=0,j=0;ai!=/0;i+)if(ai!=*)aj=ai
11、;j+;aj=/0;)解析:解析 参考答案中使用的算法是:将不是*号的字符往前移动,依次放入 a0、a1、a2、等数组元素中。程序中利用 for循环,从第一个字符开始依次取出字符进行判定,若不是*号,则往前赋值。变量 i作为每次取出元素的下标,变量 j记录赋值的位置。跳出循环后,将字符串结束标记/0赋值到相应位置,完成删除操作。本题还派生了很多题目:(1)假定输入的字符串中只包含字母和*号。请编写函数 fun,它的功能是:删除字符串中前导*号。在编写函数时,不得使用 C语言提供的字符串函数。例如,字符串中的内容为:*A*BC*DEF*G*,删除后,字符串中的内容应当是:A*BC*DEF*G*。
12、参考程序:#includestdio.hvoid fun(char *a)int i,j;i=j=0;while(ai=*)i+;while(ai!=/0)aj=ai;j+;i+;aj=/0;void main( )char s81;printf(“Enter a string: /n“);gets(s);fun(s);printf(“The string after deleted: /n“);puts(s);(2)假定输入的字符串中只包含字母和*号。请编写函数 fun,它的功能是:除了字符串前导和尾部的*号之外,将串中的其他*号全部删除。形参 h已指向字符串中第一个字母,形参 p已指向字符
13、串中最后一个字母。在编写函数时,不得使用 C语言提供的字符串函数。例如,字符串中的内容为:*A*BC*DEF*G*,删除后,字符串中的内容应当是:*ABCDEFG*。参考程序:#includestdio.hvoid Nn(char *a,char *h,char *p)int i,j;a=h;for(i=j=0;a+i=p;i+)/*将字符串中从第一个字母开始到最后一个字母之间的*号删除*/if(ai!=*)aj=ai;j+;while(ai!=/0)aj=ai;j+;i+; /*将字符串尾部的*号顺序前移*/aj=/0*; /*给字符串赋上字符串结束标记*/void main( )char
14、s81,*t,*f;printf(“Enter a string: in“);gets(s);t=f=s:while(*t)t+;t-;while(*t=*)t-;while(*f=*)f+;fun(s,f,t);printf(“The string after deleted: in“);puts(s);(3)假定输入的字符串中只包含字母和*号。请编写函数 fun,它的功能是:删除字符串中后导*号。在编写函数时,不得使用 C语言提供的字符串函数。例如,字符串中的内容为:*A*BC*DEF*G*,删除后,字符串中的内容应当是:*A*BC*DEF*G。参考程序:#includestdio.hvo
15、id fun(char *a)int i,j;for(i=0;ai!=/0;i+) /*找到最后一个字母的位置记录在变量 j中*/if(ai!=*)j=i;aj+1=/0;/*将字符串结束标志赋值到最后一个字母后面,即可删除后续*号*/void main( )char s81;printf(“Enter a string: /n“);gets(s);fun(s);printf(“The string after deleted: /n“);puts(s);归纳总结 本套试题的程序填空和程序设计题考查的是数据的删除。数据的删除操作可以采用两种方法:第一种方法,可以在原数组基础上,通过数据移动,将需要删除的数据覆盖;第二种方法,引入一个中间数组,将不需要删除的数据放入其中,再将该数组赋值给原数组,从而达到删除某些数据的目的。实际上,数据的删除实质也是数据的移动,即将不需要删除的字符往前移动,依次放入数组对应的单元中。删除字符算法的常用程序如下:void fun(char *s)int i,j;fnr(i=j=0;si!=/0;i+)if() /*需要保留字符的条件*/sj=si;j+;sj=/0;