1、国家二级 C语言机试(操作题)模拟试卷 9及答案与解析 一、程序填空题 1 给定程序中,函数 fun的功能是:在 34的矩阵中找出在行上最大、在列上最小的那个元素,若没有符合条件的元素则输出相应信息。 例如,有下列矩阵: 1 2 13 4 7 8 10 6 3 5 9 7 程序执行结果为: find: a22=9 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 注意:源程序 存放在考生文件夹下的 BLANK1 C中。 不得增行或删行,也不得更改程序的结构 ! #include stdio h #define M 3 #define N 4 void fun(int(*a
2、)N) ( int i=0, j, find=0, rmax, c, k; while(i M)&(!find) rmax=ai0; c=0; for(j=1; j N; j+) if(rmax aij) *found* rmax=aij; c=_1_; ) find=1; k=0; while(k M & find) *found* if(k!=i & akc =rmax)find=_2_; k+; if(find)printf(“find: a d d= d n“, i, c, aic); *found* _3_; if(!find)printf(“not found! n“); main
3、() int xMN, i, j; printf(“Enter number for array: n“); for(i=0; i M; i+) for(j=0; j N; j+) scanf(“ d“, &xij); printf(“The ar ray: n“); for(i=0; i M; i+) for(j=0; j N; j+) printf(“ 3d“, xij); printf(“ n n“); fun(x); 二、程序修改题 2 已知一个数列从第 0项开始的前三项分别为 0, 0, 1,以后的各项都是其相邻的前三项之和。给定程序 MODI1 C中函数 fun的功能是:计算并输出
4、该数列前 n项的平方根之和。 n的值通过形参传入。 例如,当 n=10时,程序的输出结果应为: 23 197745。 请改正程序中的错误,使程序能输出正确的结果。 注意:不要改动 main函数,不得增行或删行,也不得更改程序的结构 ! #include stdio h #include math h *found* fun(int n) double sum, s0, s1, s2, s; int k; sum=1 0; if(n =2) sum=0 0; s0=0 0; s1=0 0; s2=1 0; for (k=4; k =n; k+) s=s0+s1+s2; sum+=sqrt(s);
5、 s0=s1; s1=s2; s2=s; *found* return sum main() int n; printf(“Input N=“); scanf(“ d“, &n); print f(“ f n“, fun(n); 三、程序设计题 3 假定输入的字符串中只包含字母和 *号。请编写函数 fun,它的功能是:将字符串尾部的 *号全部删除,前面和中间的 *号不删除。 例如,字符串中的内容为: *A*BC*DEF*G*料,删除后,字符串中的内容应当是: *A*BC*DEF*G。在编写函数时,不得使用 C语言提供的字符串函数。 注意:部分源程序在文件 PROG1 C文件中。 请勿改动主函数
6、 main和其他函数中的任何内容,仅在函数 fun的花括号中填入你编写的若干语句。 #include stdio h void fun(char *a) main() char s81; void NONO(); printf(“Enter a string: n“); gets(s); fun(s); printf(“The string after deleted: n“); puts(s); NONO(); void NONO() *本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 * FILE *in, *out; int i; char s81 ; in=fopen(“i
7、n dat“, “r“); out=fopen(“out dat“, “w“); for(i=0; i 10 ; i+) fscanf(in, “ s“, s); fun(s); fprintf(out, “ s n“, s); fclose(in); fclose(out); 国家二级 C语言机试(操作题)模拟试卷 9答案与解析 一、程序填空题 1 【正确答案】 (1)j (2)0 (3)i+ 【试题解析】 第一空: “rmax=aij; c=_1_; ”ramx存放行上最大值,根据下面一个循环体内 “if(k!=i&akc =rmax)”可知, c存放 rmax所在的列的位置,故第一空处应
8、为 “j”。 第二空: “if(k!-i&akc =rmax) find=_2_; ”如果列上的元素 akc比rmax还小,说明 rmax不是列上最小值,那么标识变量 find应该为假,下次就无须进入 while(k M&find)循环进行比较,所以第二空处应为 “0”。 第三空:第三空处是外循环变量 i自增,下一次进入循环的时候在下一行里面继续寻找行上最大、列上最小的元素,故第三空应为 “i+”。 二、程序修改题 2 【正确答案】 (1)double fun(int n) (2)return sum; 【试题解析】 (1)第一个错误标识下 fun函数的定义根据题干要返回前 n项的平方根之和,
9、函数具有返回值,所以 “fun(int n)”应改为 “double fun(int n)”,其中double为双精度型变量。 (2)第二个标识符下返回平方根之和,根据 C语言语法每一句 C语言后面应该以“; ”为结尾,所以 “return sum”改为 “return sum; ”。 三、程序设计题 3 【正确答案】 int i=0; char *p, *q; p=q=a; while(*P) p+; p-; while(*p=*) p-; while(q =p) ai=*q; i+; q+; ai= 0; 【试题解析】 (1)首先,使用一个指针 p指向串尾,然后对指向串尾的指针 p指向的字符进行判断,如果是 “*”,指针 p就跳过,这样来设置一个指针变量 q指向字符串的头位置。 (2)然后,将由字符串起始到最后一个字母之间的字符拷贝到字符串 a。 (3)最后,在新生成的字符串尾加 0。