1、国家二级 C语言机试(操作题)模拟试卷 651及答案与解析 一、程序填空题 1 使用 VC+2010打开考生文件夹下 blank1中的解决方案。此解决方案的项目中包含一个源程序文件 blank1 c。在此程序中,函数 fun的功能是:判定形参 a所指的 NN(规定 N为奇数 )的矩阵是否是 ”幻方 ”,若是,函数返回值为 1;若不是,函数返回值为 0。 ”幻方 ”的判定条件是:矩阵每行、每列、主对角线及反对角线上元素之和都相等。 例如,以下 3X3的矩阵就是一个 “幻方 “: 4 9 2 3 5 7 8 1 6 请在程序的 下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。 注意:部
2、分源程序在文件 BLANK1 C中。 不得增行或删行,也不得更改程序的结构 ! 试题程序: #include stdio h #define N3 int fun(int(*a)N) int i, j, m1, m2, row, colum; m1=m2=0; for(i=0; i N; i+) j=N-i-1; m1+=aii; m2+=aij; if(m1!=m2)return0; for(i=0; i N; i+) *found* EOW=colum=【 1】 ; for(j=0; j N; j+) row+=aij; colum+=aji; ) *found* if(row!=colu
3、m)【 2】 (row!=m1) return0; *found* return【 3】 ; main() int xNN, i, j; printf(“Enter number for array: n“); for(i=0; i N; i+) for(j=0; j N; j+) scanf(“ d“, &xij); printf(“Array: n“); for(i=0; i N; i+) for(j=0; j Njj+) printf(“ 3d“, xij); printf(“ n“); if(fun(x) printf(“The Array is a magic square n“);
4、 else printf(“The Array isnt amagic square n“); 二、程序修改题 2 使用 VC+2010打开考生文件夹下 modil中的解决方案。此解决方案的项目中包含一个源程序文件 modi1 c。在此程序中,函数 fun的功能是:从 11个学生的成绩中统计出低于平均分的学生人数,此人数作为函数值返回,平均分存放在形参aver所指的存储单元中。 例如,输入 8名学生的成绩: 80 5、 60、 72、 90 5、 98、 51 5、 88、 64 则低于平均分的学生人数为 4(平均分为 75 5625)。 请改正程序中的错误,使它能得出正确的结果。 注意:部
5、分源程序在文件 MODI1 C中,不要改动 main函数,不得增行或删行,也不得更改程序的结构 ! 试题程序: #2nclude stdlib h #include stdio h #include conio h #define N20 int fun(float*s, int n, float*caver) float ave, t=0 0; int count=0, k, i; for(k=0; k n; k+) *found* t=sk; ave=t n; for(i=0; i n; 1; i+) if(si ave)count+; *found* *aVer=&aVe; return
6、 count; void main() float s30, aver; int m, i; system(“CLS“); printf(“ nPlease enter m: “); scanf(“ d“, &m); printf(“ nPlease enter d mark: n“, m); for(i=0; i m; i+) scanf(“ f“, s+i); printf(“ nThe number of students: d n“, fun(s, rm,&aver); printf(“Ave= f n“, aver); 三、程序设计题 3 使用 VC+2010打开考生文件夹下 pro
7、g1中的解决方案。此解决方案的项目中包含一个源程序文件 prog1 c。在此程序中,请编写函数 fun,其功能是:移动字符串中的内容,移动的规则是把第 1 m个字符,平移到字符串的最后,把第 m+1到最后的字符移到字符串的前部。 例如,字符串中原有的内 容为 “ABCDEFGHIJK“, m的值为 3,移动后,字符串中的内容应该是 “DEFGHIJKABC“。 注意:部分源程序在文件 PROG1 C中。 请勿改动 main函数和其他函数中的任何内容,仅在函数 fun的花括号中填入你编写的若干语句。 试题程序: #include stdio h #include string h #define
8、 N80 void fun(char*w, int m) void main() FILE*wf; char aN=“ABCDEFGHIJK“, b N=“ABCDEFGHIJK“; int m; printf(“The origina string: n“); puts(a); printf(“ n nEnter m: “); scanf(“ d“, &m); fun(a, m); printf(“ nThe string after moving: n“); puts(a); printf(“ n n“); *found* wf=fopen(“out dat“, “w“); fun(b,
9、3); fprintf(wf, “ s“, b); fclose(wf); *found* 国家二级 C语言机试(操作题)模拟试卷 651答案与解析 一、程序填空题 1 【正确答案】 (1)0 (2)| (3)1 【试题解析】 填空 1:本题考查为变量赋初值,在这里 row+=aij代表是每行的总和, eolum+=aji代表的是每列的总和,因而 row, eolum在初始化时应该为零,此空应该填 0。 填空 2:本题考查了 if条件语句,此句 if判断代表每行的总和与列是否相等,每行的总和是否与对角线的 总和相等,两者若有一个不成立,即返回 0,因而此空应该填写 If。 填空 3:题目要求若
10、矩阵是 “幻方 ”,则函数返回值为 1,因而此空应该填写 1。 二、程序修改题 2 【正确答案】 (1)t+=sk; (2)*aver=ave; 【试题解析】 根据题目要求,可利用循环语句累计 n个学生的总分,求得平均成绩后,再利用循环语句和条件选择语句进行后面的操作。若小于平均值,则将该值存放于 aver存储单元中。 t=sk是循环叠加错误, *aver=&ave为语法指向的错误。 三、程序设计题 3 【正确答案】 void fun(char*w, int m) int i, j; char t; for(i=1; i =m; i+)/*进行 m次的循环左移 * t=w0; for(j=1; wj!= 0; j+) *从第 2个字符开始以后的每个字符都依次前移一个字符 * wj-1=wj; wj-1=t; *将第 1个字符放到最后一个字符中 * 【试题解析】 本题应采用 “循环左移 ”的算法,多层循环用于控制移动的字符的个数,即需进行多少次循环,内嵌循环的作用是将从第 2个字符以后的每个字符依次 前移一个位置,最后将第 1个字符放到最后 个字符中。