1、国家二级( C语言)机试模拟试卷 380及答案与解析 一、程序填空题( 30分) 1 给定程序中已建立一个带有头结点的单向链表,在 main函数中将多次调用 fun函数,每调用一次 fun函数,输出链表尾部结点中的数据,并释放该结点,使链表缩短。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的 BLANKl C中。不得增行或删行,也不得更改程序的结构! 二、程序修改题( 30分) 2 下列给定的程序中,函数 fun()的功能是:计算并输出 k以内最大的 10个 能被 13或 17整除的自然数之和。 K的值由主函数传入,若 k的值为 500,
2、则函数的值为4622。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动 main函数,不得增行或删行,也不得更改程序的结构。 试题程序: #include stdio.h #include conio.h int fun(int k) int m=0,mc=0, j; while(k =2)mc+; k-; /*found*/ return m; main() clrscr(); printf(“%dn “,fun(500); 三、程序设计题( 40分) 3 请编写函数 fun(),它的功能是:判断字符串是否是回文 ?若是,函数返回 1,主函数中输出: YES,否则返回 0,主函数
3、输出 NO。回文是指顺读和倒读都一样的字符串。 例如,字符串 LEVEL是回文,而字符串 12312就不是回文。 注意 部分源程序给出如下。 请勿改动主函数 main和其他函数中的任何内容,仅在函数 fun的花括号中填入所编写的若干语句。 试题源程序 #include stdio.h #define N 80 int fun(char *str) main() char sN; printf(“Enter a string:“)“ gets(s); printf(“nn“); puts(s); if(fun(s) printf(“ YESn“); else printf(“ NOn“); NO
4、NO(); NONO() /*请在此函数内打开文件,输入测试数据,调用 fun函数,输出数据,关闭文件。 */ FILE *rf, *wf; int i ; char sN; rf=fopen(“K:k0624010001in.dat“, “r“); wf=fopen(“K:k0624010001out.dat“, “w“); for(i=0; i 10; i+) fscanf(rf, “%s“, s); if(fun(S) fprintf(wf, “%s YESn“, s); else fprintf(wf, “%s NOn“, s); fclose(rf); fclose(wf); 国家二
5、级( C语言)机试模拟试卷 380答案与解析 一、程序填空题( 30分) 1 【正确答案】 (1)next (2)t-data (3)t 【试题解析】 fun函数的功能是输出链表尾部结点中的数据,并释放该结点,使链表缩短。由于链表是单向的,找到链表尾部结点需要利用循环从头结点开始查找,直至找 到最后一个,找到之后输出尾部结点的数据,然后删除尾结点。 二、程序修改题( 30分) 2 【正确答案】 (1)错误: if(k%13=0)|(k%17=0) 正确: if(k%13=0)|(k%17=0) (2) 错误:缺少大括号 正确:加 【试题解析】 能被某个数整除的表示方法是 x%y=0,而并非像题
6、目中所表示的if(k%13=0)|(k%17=0),所以, if(k%13=0)|(k%17=0)修改后的结果应该是答案所示信息, (2)中缺少程序完整所需的 “”,此类信息在做题时一定注意,我们可以在上机考试的时候先运行一下程序,这样明显的错误一般都会有错误信息显示出来,比如丢失 “”的错误信息是 “Compound statement missing in function fun”,并在当前错误处停止光标,我们只要按回车键进行编辑就可以了。 三、程序设计题( 40分) 3 【正确答案】 int fun(char *str) int i, n=0, fg=1; char *p=str; while(*p) n+; P+; for(i=0; i n/2; i+) if(stri=strn-1-i); else fg=0; break; return fg; 【试题解析】 本题的设计思路是: (1)定义一个 int型变量 flag用做返回值,定义一个字符指针代替原串遍历,求字符串的长度; (2)利用循环及 if条件语句判断字符串首尾对应字符是否相等; (3)如果为回文数,修改 flag的值; (4)返回 flag