1、国家二级 C语言机试(操作题)模拟试卷 365及答案与解析 一、程序填空题 1 给定程序中,函数 fun的功能是:有 NN矩阵,将矩阵的外围元素顺时针旋转。操作顺序是:首先将第一行元素的值存入临时数组 r,然后使第一列成为第一行,最后一行成为第一列,最后一列成为最后一行,临时数组中的元素成为最后一列。 例如,若 N=3,有下列矩阵: 1 2 3 计算结果为 7 4 1 4 5 6 8 5 2 7 8 9 9 6 3 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 注意:源程序存放在考生文件夹下的 BLANK1 C中。 不得增行或删行,也不得更改程序的结构 ! 1 #in
2、clude stdio h 2 #define N 4 3 void fun(int(*t)N) 4 int j, rN; 5 for(j=0; j N; j+)rj=t0j; 6 for(j=0; j N; j+) 7 *found* 8 t0N-j-1=tj_1_; 9 for(j=0; j N; j+) 10 tj0=tN-1j; 11 *found* 12 for(j=N-1; j =0; _2_) 13 tN-1N-1-j=tjN-1; 14 for(j=N-1; j =0; j-) 15 *found* 16 tjN-1=r_3_; 17 18 main() 19 int tN=2
3、1, 12, 13, 24, 25, 16, 47, 38, 29, 11, 32, 54, 42, 21,33, 10, i, j; 20 printf( nThe original array: n); 21 for(2=0; i N; i+) 22 for(j=0; j N; j+)printf( 2d”, tij); 23 printf( n); 24 25 fun(t); 26 printf( nThe result is: n); 27 for(i=0;i N; i+) 28 for(j=0; j N; j+)printf( 2d, tij); 29 printf( n); 30
4、31 二、程序修改题 2 给定程序 MODI1 C中函数 fun的功能是:求出 s所指字符串中最后一次出现的t所指子字符串的地址,通过函数值返回,在主函数中输出从此地址开始的字符串:若未找到,则函数值为 NULL。 例如,当字符串中的内容为 abcdabfabcdx“, t中的内容为 “ab”时,输出结果应是“abcdx”。 当字符串中的内容为 “abcdabfabcdx”, t中的内容为 “abd”时,则程序输出未找到信息 “notbe found!”。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动 main函数,不得增行或删行,也不得更改程序的结构 ! 1 #include
5、stdio h 2 #include string h 3 char *fun(char*s, char*t) 4 5 char *p, *r, *a; 6 *found* 7 a=Null; 8 while(*s) 9 p=s; r=t; 10 while(*r) 11 *found* 12 if(r=p) 13 r+; p+; ) 14 else break; 15 if(*r= 0)a=s; 16 s+; 17 18 return a; 19 20 main() 21 22 char s100, t100, *p; 23 printf( nPlease enter string s: )
6、; scanf( s, s); 24 printf( nPlease enter substringt: ); scanf( s, t); 25 p=fun(s, t); 26 if (p)printf( nThe result is: sin, p); 27 else printf( nNot found! n); 28 三、程序设计题 3 请编写函数 fun,函数的功能是:将 M行 N列的二维数组中的数据,按列的顺序依次放到一维数组中。 例如,二维数组中的数据为: 33 33 33 33 44 44 44 44 55 55 55 55 则一维数组中的内容应是: 33 44 55 33 44
7、 55 33 44 55 33 44 55。 注意:部分源程序在文件 PROGl C中。 请勿改动主函数 main和其他函数中的任何内容,仅在函数 fun的花括号中填入你编写的若干语句。 1 #include stdio h 2 void fun(int s10, int b, int*n, int mm, int nn) 3 4 5 main() 6 int w1010=33, 33, 33, 33, 44, 44, 44, 44, 55, 55, 55, 55,i, j; 7 int a100=(0), n=0; void NONO(); 8 printf(The matrix: n);
8、9 for(i=0; i 3; i+) 10 for(j=0; j 4; j+) printf( 3d, wij); 11 printf( n); 12 fun(w, a, n, 3, 4); 13 printf(The A array: n); 14 for(i=0; i n; i+) printf( 3d, ai); printf( n n); 15 NONO(); 16 void NONO() 17 *请在此函数内打开文件,输入测试数据,调用 fun函数,输出数据,关闭文件。 * 18 FILE *rf, *wf; int i, j, k; 19 int w1010, a100, n=0
9、, mm, nn; 20 rf=fopen(in dat, r); 21 wf=fopen(out dat, w); 22 for(k=0; k 5; k+) 23 fscanf(rf, d d, j nn ; j+) fscanf(rf, d, wij); 26 fun(w, a, n, mm, nn); 27 for(i=0; i n; i+) fprintf(wf, 3d, ai); fprintf(wf, n); 28 29 fclose(rf); fclose(wf); 国家二级 C语言机试(操作题)模拟试卷 365答案与解析 一、程序填空题 1 【正确答案】 (1)0 (2)j-
10、(3)j 【试题解析】 第一空:由审题分析可知,此处是使第一列成为第一行,即把第一列元素移动到第一行,第一列元素是 “tj0”,第一行元素是 “t0N-j-1”,故第一空处应为 “0”。 第二空:第四个循环是最后一列成为最后一行,即将最后一列移动到最后一行, “for(j=N-1; j =0; _2_)”循环变量 i从 N-1开始,到 0结束,共循环 N次,故 j每次减 1,第三空处是 “i-”。 第三空:最后一个循环将临时数组中的元素成为最后 1列,即 “t=iN-1=rj”,故第三空处应为 “j”。 二、程序修改题 2 【正确答案】 (1)a=NULL; (2)if(*r=*p) 【试题解
11、析】 函数功能是求得字符串中某子串最后一次出现的地址。 (1)第一个标识下面:语句 “a=Null; ”中的 Null未定义。 NULL代表空值,但程序中写成了Null。所以,改成 “a=NULL; ”。 (2)程序的主体是二重循环,其中外循环使指针 s逐个指向字符串的字符,直到遇到串结束符退出循环,内循环检查指针 p与 r所指字符串是否匹配。因为这里 p、 r是指针,如果使用判断表达式 “if(r=p)”,那么比较的是地址,而题目要求比较它们所指的字符。所以,改为: “if(*r=*p)”。 三、程序设计题 3 【正确答案】 1 int i, j; 2 for(j=0 ; j nn; j+) 3 for(i=0; i mm; i+) 4 b*n=*(*(s+i)+j); 5 *n=*n+1; 【试题解析】 (1)利用两重循环,依次取矩阵中的元素。 (2)其中注意指针数组与数组指针的区别,其中数组指针 s,它指向包含 4个元素的一维数组。其数据元素的表 示方式为: “*(*c(s+i)+j)”。