1、国家二级(C 语言)机试-试卷 80 及答案解析(总分:12.00,做题时间:90 分钟)一、程序填空题(总题数:2,分数:4.00)1.程序填空题()(分数:2.00)_2.给定程序中,函数 fun 的功能是:对形参 ss 所指字符串数组中的 M 个字符串按长度由短到长进行排序。ss 所指字符串数组中共有 M 个字符串,且串长 #include #define M 5 #define N 20 void fun(char (*ss)N) int i, j, k, nM; char tN; for(i=0; inj) 【2】; if(k!=i) strcpy(t,ssi); strcpy(ss
2、i,ssk); /*found*/ strcpy(ssk,【3】); nk=ni; main() char ssMN=“shanghai“,“guangzhou“,“beijing“, “tianjing“,“cchongqing“; int i; printf(“/nThe original strings are :/n“); for(i=0; i_二、程序修改题(总题数:2,分数:4.00)3.程序修改题()(分数:2.00)_4.给定程序 MODllC 中函数 fun 的功能是:计算并输出下列级数的前 N 项之和 s N ,直到 S N+1 大于 q为止,q 的值通过形参传入。 (分数
3、:2.00)_三、程序设计题(总题数:2,分数:4.00)5.程序设计题()(分数:2.00)_6.函数 fum 的功能是:将 s 所指字符串中 ASC值为偶数的字符删除,串中剩余字符形成一个新串放在 t所指的数组中。 例如,若 s 所指字符串中的内容为:”ABCDEFGl2345“,其中字符 B 的 ASC码值为偶数、字符 2 的 ASC码值为偶数、都应当删除,其他依此类推。最后 t 所指的数组中的内容应是:”ACEGl35”。 注意:部分源程序存在文件 PROGlC 中。 请勿改动主函数 main 和其他函数中的任何内容,仅在函数 fun 的花括号中填入你编写的若干语句。 #include
4、 #include void fun(char *s, char t) main() char s100, t100; printf(“/nPlease enter string S:“); scanf(“%s“, s); fun(s, t); printf(“/nThe result is: %s/n“, t); NONO(); NONO () /* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */ char s100, t100 ; FILE *rf, *wf ; int i ; rf = fopen(“in.dat“,“r“); wf = fopen(“out.dat“
5、,“w“); for(i = 0 ; i nj,则把 j 赋给 k,即第二空处应为“k=j”。 第三空:if(k!=i)说明找到了新的更短的字符串,那么把它和第 i 个字符串交换,因此第三空处应为“t”。二、程序修改题(总题数:2,分数:4.00)3.程序修改题()(分数:2.00)_解析:4.给定程序 MODllC 中函数 fun 的功能是:计算并输出下列级数的前 N 项之和 s N ,直到 S N+1 大于 q为止,q 的值通过形参传入。 (分数:2.00)_正确答案:(正确答案:s=s+(n+1.)/n; return t;)解析:解析:(1)注意到 n 是整型变量,n+1 也是整数,因
6、此(n+1)/n 是两个整数相除,得到的结果也是整数即 1。而“s=s+(n+1)/n;”是 s 和 1 转化成 double 类型之后的和,相当于 s=s+1.0,因此计算结果不正确。第一标识下应改为“s=s+(n+1.)/n;”,n+1.计算结果是浮点数,(n+1.)/n 得到的结果也是浮点数而不是整数。 (2)注意到在循环体内部“t=s;”,即将 s 的值赋给 t,然后 s 再累加了下一个级数项。在最后一次进入循环的时候,t 记录 s 的值,s 再加一个级数项,下次循环进入之前判断的时候发现 s 已经大于 q 了,此时 while 不再执行,而是执行后面的 printf 语句,即 st,
7、sq。题干要求返回级数的前N 项之和 SN,而 SN+1 大于 q,因此只能返回 t,而不是返回 s。第二标识下应改为“return t;”。三、程序设计题(总题数:2,分数:4.00)5.程序设计题()(分数:2.00)_解析:6.函数 fum 的功能是:将 s 所指字符串中 ASC值为偶数的字符删除,串中剩余字符形成一个新串放在 t所指的数组中。 例如,若 s 所指字符串中的内容为:”ABCDEFGl2345“,其中字符 B 的 ASC码值为偶数、字符 2 的 ASC码值为偶数、都应当删除,其他依此类推。最后 t 所指的数组中的内容应是:”ACEGl35”。 注意:部分源程序存在文件 PR
8、OGlC 中。 请勿改动主函数 main 和其他函数中的任何内容,仅在函数 fun 的花括号中填入你编写的若干语句。 #include #include void fun(char *s, char t) main() char s100, t100; printf(“/nPlease enter string S:“); scanf(“%s“, s); fun(s, t); printf(“/nThe result is: %s/n“, t); NONO(); NONO () /* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */ char s100, t100 ; FIL
9、E *rf, *wf ; int i ; rf = fopen(“in.dat“,“r“); wf = fopen(“out.dat“,“w“); for(i = 0 ; i 10 ; i+) fscanf(rf, “%s“, s); fun(s, t); fprintf(wf, “%s/n“, t); fclose(rf); fclose(wf); (分数:2.00)_正确答案:(正确答案: int i, j=0; for(i=0; i解析:解析:(1)判断一个字符串中的某一字符 ASCII 值是否为奇数,可用“stri%2!=0”来判断。 (2)对串 s 中各个字符逐个进行考查,ASCII 值为奇数的字符就顺序放在新串 t 中,否则就不存放。 (3)所有字符处理完后,记得在新串 s 的末尾加上结束符“/0”。