1、国家二级 C语言机试(操作题)模拟试卷 613及答案与解析 一、程序填空题 1 使用 VC+2010打开考生文件夹下 blank1中的解决方案。此解决方案的项目中包含一个源程序文件 blank1 c。在此程序中,函数 fun的功能是:将 NN矩阵中元素的值按列向右移动 1个位置,右边被移出矩阵的元素绕回左边第 1列。 例如, N=3,有下列矩阵 1 2 3 4 5 6 7 8 9 计算结果为: 3 1 2 6 4 5 9 7 8 请在程序的下画线处填入正确的内容并将下画线删除,使程序得出正确的 结果。 注意:部分源程序给出如下。 不得增行或删行,也不得更改程序的结构 ! 试题程序: #incl
2、ude stdio h #define N4 void fun(int(*t)N) int i, j, x; for(i=0; i 【 1】 ; i+) x=ti【 2】 ; for(j=N-1; j 0; j-) tij=tij-1; ti【 3】 =x; main() int i, j, tN=21, 12, 13, 24, 25, 16, 47, 38, 29, 11, 32, 54, 42, 21,33, 10; print f(“The orriginal array: n“); for(i=0; i N; i+) for(j=0; j N; j+) printf(“ 2d“, ti
3、j); printf(“ n“); fun(t); printf(“ nThe result is: n“); for(i=0; i N; i+) for(j=0; j N; j+) pr2ntf(“ 2d“, tij); printf(“ n“); 二、程序修改题 2 使用 VC+2010打开考生文件夹下 modi1中的解决方案。此解决方案的项目中包含一个源程序文件 modi1 c。在此程序中,函数 fun的功能是:统计 substr所指的字符串在 str所指的字符串中出现的次数。 例如,若字符串为 aaas1kaaas,子字符串为 as,则应输出 2。 请改正程序中的错误,使它能得出正确的
4、结果。 注意:不要改动 main函数,不得增行或删行,也不得更改程序的结构 ! 试题程序: #include stdio h int fun(char*str, char*substr) int i, j, k, num=0; *found* for(i=0, stri, i+) for(j=i, k=0; substrk=strj; k+, j+) *found* If(substrk+1= 0) num+; break; return num; main() char str80, substr80; printf(“Tnput a string: “); gets(str); print
5、f(“Input a substring: “); gets(substr); printf(“ d n“, fun(str, substr); 三、程序设计题 3 使用 VC+2010打开考生文件夹下 prog1中的解决方案。此解决方案的项目中包含一个源程序文件 prog1 c。在此程序中,请编写函数 fun,该函数的功能是:将M行 N列的二维数组中的数据,按行的顺序依次放到一维数组中,一维数组中数据的个数存放在形参 n所指的存储单元中。 例如,若二维数组中的数据为: 33 33 33 33 44 44 44 44 55 55 55 55 则一维数组中的内容应该是: 33 33 33 33
6、44 44 44 44 55 55 55 55。 注意:部分源程序在文件 PROG1 C中。 请勿改动 main函数和其他函数中的任何内容,仅在函数 fun的花括号中填入你编写的若干语句。 试题程序: #include stdio h void fun(int(*s)10, int*b, int*n, int mm, intnn) void main() FILE*wf; int w1010=33, 33, 33, 33, 44, 44, 44, 44, 55, 55, 55, 55, i, j; int a100=0, n=0; printf(“The matrLx: n“); for(i=
7、0; i 3; i+) for(j=0; j 4; j+) printf(“ 3d“, wij); printf(“ n“); fun(w, a, &n, 3, 4); printf(“The A array: n“); for(i=0; i n; i+) printf(“ 3d“, ai); printf(“ n n“); *found* wf=fopen(“out dat“, “w“); for(i=0; i n; i+) fprintf(wf, “ 3d“, ai); fclose(wf); *found* 国家二级 C语言机试(操作题)模拟试卷 613答案与解析 一、程序填空题 1 【
8、正确答案】 (1)N (2)N-1 (3)0 【试题解析】 填空 1:因为是 NN的矩阵, 所以行列数是相同的。第一个 for循环用来循环行,因此填入一个循环界限 N。 填空 2:此语句将移出矩阵的元素暂存,移出矩阵的元素的列下标为 N-1,因此填入 N-1。 填空 3:此语句将移出矩阵的元素放人最左边,也就是第一列,第一列元素的列下标为 0,因此填入 0。 二、程序修改题 2 【正确答案】 (1)for(i=0; stri; i+) (2)if(substrk+1= 0) 【试题解析】 先看循环条件 for(i=0, stri, i+),不难发现此处 for循环语句的格式有误,其中表达式之
9、间应以 “; ”相隔;同时很容易发现 if条件语句处的关键字书写错误。 三、程序设计题 3 【正确答案】 void fun(int(*s)10, int*b, int*n, int mm, int nn) int i, j, k=0; for(i=0; i mm; i+) *将二维数组 s中的数据按行的顺序依次放到一维数组 b中* for(j=0; j nn; j+) bk+=sij; *n=k; *通过指针返回元素个数 * 【试题解析】 本题可以用两个循环来处理,由于是按行的顺序取出,所以 第 1个循环用于控制行下标,第 2个循环用于控制列下标;若改成按列的顺序取出,则循环应改成: for(i=0; i nn; i+) for(j=0; j mm; j+) bk+=sji; 要注意 sji的下标,不能用 sij。 若按行取出则列标变化较快,若按列取出则行标变化较快,即循环嵌套时,越在内层的循环,其循环变量变化就越快。