1、国家二级 C语言机试(操作题)模拟试卷 698及答案与解析 一、程序填空题 1 给定程序中,函数 fun的功能是:将 NN矩阵主对角线元素中的值与反向对角线对应位置上元素中的值进行交换。例如,若 N=3,有下列矩阵: 1 2 3 4 5 6 7 8 9 交换后为: 3 2 1 4 5 6 9 8 7 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 注意:源程序存放在考生文件夹下的 BLANK1 C中。 不得增行或删行,也不得更改程序的结构 ! 1 #include stdio h 2 #define N 4 3 *found* 4 void fun(int _1_, i
2、nt n) 5 int i, s; 6 *found* 7 for( _2_ ; i+) 8 s=tii; 9 tii=tin-i-1; 10 *found* 11 tin-1-i=_3 _; 12 13 14 main() 15 int tN=21, 12, 13, 24, 25, 16, 47, 38, 29, 11, 32, 54, 42, 21,33, 10, i, j; 16 printf( nThe original array: n); 17 for(i=0; i N; i+) 18 for(j=0, j N; j+)printf( d, tij); 19 printf( n);
3、 20 21 fun(t, N); 22 printf( nThe result is: n); 23 for(i=0; i N; i+) 24 for(j=0; j N; j+)printf( d, tij); 25 printf( n); 26 27 二、程序修改题 2 由 N个有序整数组成的数列已放在一维数组中,给定程序 MODI1 C中函数fun的功能是:利用折半查找算法查找整数 m在数组中的位置。若找到,返回其下标值;反之,返回 -1。 折半查找的基本算法是:每次查找 前先确定数组中待查的范围: low和 high(low high),然后把 m与中间位置 (mid)中元素的值进行比
4、较。如果 m的值大于中间位置元素中的值,则下一次的查找范围落在中间位置之后的元素中;反之,下一次的查找范围落在中间位置之前的元素中。直到 low high,查找结束。 请改正程序中的错误,使它能得出正确结果。 注意:不要改动 main函数,不得增行或删行,也不得更改程序的结构。 1 #include stdio h 2 #define N 10 3 *found* 4 void fun(int a, int m) 5 int low=0, high=N-1, mid; 6 while(low =high) 7 mid=(10w+high) 2; 8 if(m amid) 9 high=mid-
5、1; 10 *found* 11 else If(m amid) 12 low=mid+1; 13 else return(mid); 14 15 return(-1); 16 17 main() 18int i, aN=-3, 4, 7, 9, 13, 45, 67, 89, 100, 180), k, m; 19 printf(a数组中的数据如下: ); 20 for(i=0; i N; i+)printf( d, ai); 21 printf(Enter m: ); scanf( d, m); 22 k=fun(a, m); 23 if(k =0)printf(m= d, index=
6、d n, m, k); 24 else printf(Not be found! n); 25 三、程序设计题 3 假定输入的字符串中只包含字母和 *号。请编写函数 fun,它的功能是:除了尾部的 *号之外,将字符串中其他 *号全部删除。形参 p己指向字符串中最后的一个字母。在编写函数时,不得使用 C语言提供的字符串函数。 例如,字符串中的内容为: *A*BC*DEF*G*,删除后,字符串中的内容应当是: ABCDEFG*。 注意:部分源程序在文件 PROG1 C中。 请勿改动主函数 main和其他函 数中的任何内容,仅在函数 fun的花括号中填入你编写的若干语句。 1 #include st
7、dio h 2 void fun(char *a, char *p) 3 4 5 main() 6 char s81, *t; 7 void NONO(); 8 printf(Enter a string: n); gets(s); 9 t=s; 10 while(*t)t+; 11 t-; 12 while(*t=*)t-; 13 fun(s, t); 14 printf(The string after deleted: n); puts(s); 15 NONO(); 16 17 void NONO() 18 *本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 * 19 FIL
8、E *in, *out; 20 int i; char s81, *t; 21 in=fopen(in dat, r); 22 out=fopen(out dat, w); 23 for(i=0; i 10; i+) 24 fscanf(in, s, S); 25 t=s; 26 while(*t)t+; 27 t-; 28 while(*t=*)t-; 29 fun(s, t); 30 fprintf(out, s n, s); 31 32 fclose(in); 33 fclose(out); 国家二级 C语言机试(操作题)模拟试卷 698答案与解析 一、程序填空题 1 【正确答案】 (1
9、)tN (2)i=0; i n (3)s 【试题解析】 函数 fun的功能是将 NN矩阵主对角线元素中的值与反向对角线对应位置上元素中的值进行交换,在 NN的矩阵 t中, i标识行下标,对角线元素为 tii,反向对角元素为 tiN-i-1。 第一空:在主函数中 fun函数的调用形式是 “fun(t, N); ”, t是二维数组名,故fun函数的第一个参数为指针,因此,第一空处应为 “tN”。第二空: fun函数的第二个参数 n指明了矩阵的大小为 n,对角线元素与反向对角线元素有 n个,故循环有 n次,因此,变量 i从 0开始,到 n 1结束,因此,第一空处应为 “i=0; in”。第三空:循环
10、体内部是对角线元素与反向对角线元素的交换, “s=tii; ”s保存了对角元素 tii,故,第三处应填 “s”。 二、程序修改题 2 【正确答案】 (1)int fun(int a, int m) (2)else if(m amid) 【试题解析】 (1)该题中函数功能是利用折半查找算法查找整数 m在数组中的位置。其中,折半查找法是在有序数组中进行的,过程是先将待找的数和数组中间的元素进行比较,若待找的数大于数组中间元素的值 ,就在数组的后一半继续查找,若待找的数小于数组中间的值,就在数组的前一半继续查找,然后在取新区间的中间元素进行比较,不断重复以上过程,直到找到待找的元素为止。 (2)从己
11、给定源程序的 main主函数开始入手,从键盘输入获得要查找的值m“scanf( d, &m); ”,调用函数 fun来实现折半查找。 (1)根据主函数中 “k=fun(a, m); ”,知道函数 fun应该是返回 int型的函数,所以第一个标识下面定义的 “void fun(int a, int m)”应该改为 “intfun(int a, int m)”。 (2)第二个标识下的 “else If(m amid)”是判断 m是否比 amid大,在 while循环中采用的是 if-elseif-else语句,显然 “else If”当中 “If”应当小写,故第二标识下“else If(m ami
12、d)”应改为 “elseif(m amid)”。 三、程序设计题 3 【正确答案】 1 char *q=a; 2 int j=0; 3 while(*q& q p) 4 if(*q !=*)aj+=*q; 5 q+; 6 7 while(*p)aj+=*p+; 8 aj= 0; 【试题解析】 该程序功能是除了尾部的 “*”号之外,将字符串中其他 “*”号全部删除。其中,实现删除指定元素的功能,一般是使用循环语句,通过指针变量在字符串中前后的移动,判断其是否为要删除的元素。若是,则进行相应的操作。还要注意的是,删除字符后,要将其后的字符依次移动。 (1)首先,主函数中使指针移到字符串的最后一个字符,对字符串由串尾开始进行操作。 (2)然后,指针由尾开始向头移动,查找第一 个非 “*”号字符,指针 t指向后一个非 “*”,即从最后一个非 “*”,字符开始的字符都不需要删除,将前面的其他 “*”号全部删除后,将尾部的 “*”字符往前移动即可。 (3)确定了字符数组的最后一个字符非 “*”后,调用 fun函数,在 fun函数中,将原串中由起始位置的字符开始到最后一个非 “*”逐个查询该字符是否是 “*”字符,如果是则删除,并将后面的字符往前移动;然后将 t之后的字符移动到前面,最后在字符串的后面添加 “ 0”即可。
copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1