1、二级 C 语言机试-278 及答案解析(总分:100.00,做题时间:90 分钟)一、程序填空题(总题数:1,分数:30.00)1.下列给定程序中,函数 fun 的功能是:把形参 s 所指字符串中下标为奇数的字符右移到下一个奇数位置,最右边被移出字符串的字符绕回放到第一个奇数位置,下标为偶数的字符不动(注意:字符串的长度大于等于 2)。例如,形参 s 所指字符串为“abcdefah”,执行结果为“ahcbedaf”。请在下划线处填入正确的内容并将下划线删除,使程序得出正确的结果。注意:部分源程序给出如下。不得增行或删行,也不得更改程序的结构!试题程序:#includestdio.hvoid f
2、un(char*s)int i,n,k;char c;n=0;for(i=0;s1=/0;i+)n+,if(n%2=0)/*found*/k=n- (1) ;elsek=n-2;/*found*/c= (2) ;for(i=k-2;i=1;i=i-2)(si+2=si;/*found*/s1= (3) ;)main()char s80=“abcdefgh“;printf(“/nThe original string is:%s/n“,s);fun(s);printf(“/nThe result is:%s/n“,s);(分数:30.00)_二、程序改错题(总题数:1,分数:30.00)2.下列
3、给定程序中,fun 函数的功能是:求表达式 s=aaaa-aaa-aa-a(此处 aaaa 表示 n 个 a,a 和n 的值在 19)。例如,a=3,n=6,则以上表达式为:s=333333-33333-3333-333-33-3其值是 296298。a 和 n 是 fun 函数的形参,表达式的值作为函数值传回 main 函数。请改正程序中的错误,使它能计算出正确的结果。注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构!试题程序:#includesfdio.hlong fun(int a,int n)int j;/*found*/long s=0,t=1;for(i=0;j
4、n;j+)t=t*10+a;s=f;for(j=1;jn;j+)/*found*/t=t%10s=s-t;return(s);main()int a,n;printf(“/nPlease enter a and n:“);scanf(“%d%d“,printf(“The value of function is:%ld/n“,fun(a,n);(分数:30.00)_三、程序设计题(总题数:1,分数:40.00)3.编写函数 void fun(char*tt,int PP),统计在 tt 所指的字符串中“a”到“z”26 个小写字母各自出现的次数,并依次放在 PP 所指的数组中。例如,当输入字符
5、串“abcdefgabcdeabc”后,程序的输出结果应该是:3 3 3 2 2 1 1 0000000000000000000注意:部分源程序给出如下。请勿改动主函数 main 和其他函数中的任何内容,仅在函数 fun 的花括号中填入你编写的若干语句。试题程序:#includesfdio.h#includestring.hvoid fun(char*tt,int pp)main()char aa1000;int bb26,k;printf(“/nPlease enter a char string:“);scanf(“%s“,aa);funiaa,bb);for(k=0;k26;k+)pri
6、ntf(“%d“,bbk);printf(“/n“);(分数:40.00)_二级 C 语言机试-278 答案解析(总分:100.00,做题时间:90 分钟)一、程序填空题(总题数:1,分数:30.00)1.下列给定程序中,函数 fun 的功能是:把形参 s 所指字符串中下标为奇数的字符右移到下一个奇数位置,最右边被移出字符串的字符绕回放到第一个奇数位置,下标为偶数的字符不动(注意:字符串的长度大于等于 2)。例如,形参 s 所指字符串为“abcdefah”,执行结果为“ahcbedaf”。请在下划线处填入正确的内容并将下划线删除,使程序得出正确的结果。注意:部分源程序给出如下。不得增行或删行,
7、也不得更改程序的结构!试题程序:#includestdio.hvoid fun(char*s)int i,n,k;char c;n=0;for(i=0;s1=/0;i+)n+,if(n%2=0)/*found*/k=n- (1) ;elsek=n-2;/*found*/c= (2) ;for(i=k-2;i=1;i=i-2)(si+2=si;/*found*/s1= (3) ;)main()char s80=“abcdefgh“;printf(“/nThe original string is:%s/n“,s);fun(s);printf(“/nThe result is:%s/n“,s);(
8、分数:30.00)_正确答案:(1 (2)sk或*(s+k) (3)c)解析:解析 本题关键字有:指针型变量;ifelse 语句;赋值语句。微分析填空 1:变量 n 存放字符串的长度,长度为偶数,则 k=n-1;长度为奇数,则 k=n-2,使得下标为奇数的最后一个元素有效(不是/0)。填空 2:变量 C 存放最右边奇数位置的元素,即下标 k 对应的元素。填空 3:第一个奇数位置存储最后一个下标为奇数的元素。二、程序改错题(总题数:1,分数:30.00)2.下列给定程序中,fun 函数的功能是:求表达式 s=aaaa-aaa-aa-a(此处 aaaa 表示 n 个 a,a 和n 的值在 19)。
9、例如,a=3,n=6,则以上表达式为:s=333333-33333-3333-333-33-3其值是 296298。a 和 n 是 fun 函数的形参,表达式的值作为函数值传回 main 函数。请改正程序中的错误,使它能计算出正确的结果。注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构!试题程序:#includesfdio.hlong fun(int a,int n)int j;/*found*/long s=0,t=1;for(i=0;jn;j+)t=t*10+a;s=f;for(j=1;jn;j+)/*found*/t=t%10s=s-t;return(s);main(
10、)int a,n;printf(“/nPlease enter a and n:“);scanf(“%d%d“,printf(“The value of function is:%ld/n“,fun(a,n);(分数:30.00)_正确答案:(long s=0,t=0; (2)t=f/10;)解析:解析 本题关键字有:变量赋初值;求余运算和除法运算的区别。用除法运算去掉一个数的个位数,用求余运算取出一个数的个位数。微分析(1)t 用来存放每次循环后的多位数,第一次循环时,t 应当是个位数,所以 t 的初始值应为 0。(2)本题不需要求余数,而是要去掉个位数,因此运用除法运算而非取余运算。三、程
11、序设计题(总题数:1,分数:40.00)3.编写函数 void fun(char*tt,int PP),统计在 tt 所指的字符串中“a”到“z”26 个小写字母各自出现的次数,并依次放在 PP 所指的数组中。例如,当输入字符串“abcdefgabcdeabc”后,程序的输出结果应该是:3 3 3 2 2 1 1 0000000000000000000注意:部分源程序给出如下。请勿改动主函数 main 和其他函数中的任何内容,仅在函数 fun 的花括号中填入你编写的若干语句。试题程序:#includesfdio.h#includestring.hvoid fun(char*tt,int pp)
12、main()char aa1000;int bb26,k;printf(“/nPlease enter a char string:“);scanf(“%s“,aa);funiaa,bb);for(k=0;k26;k+)printf(“%d“,bbk);printf(“/n“);(分数:40.00)_正确答案:(void fun(char*tt,int pp) int i;for(i=0;i26;i+)/*初始化 pp 数组备元素为 0*/ppi=0;/*遍历字符串,统计小写字母出现的个数*/for(;*tt!=/0;tt+)/*如果字符为小写字母*/if(*tt)=a)解析:解析 本题关键字有:for 循环语句;数组操作;if 语句条件表达式;字符串结束标识/0;指针操作。微分析先使用 for 循环语句初始化 pp 数组中各元素为 0,再通过循环判断语句判断 tt 所指字符串中的字符是否为小写字母,若是则相对应的 pp 数组元素值加 1。