1、国家二级 C语言机试(操作题)模拟试卷 313及答案与解析 一、程序填空题 1 给定程序中,函数 fun的功能是:将不带头结点的单向链表结点数据域中的数据从小到大排序。即若原链表结点数据域从头至尾的数据为 10,4、 2、 8、 6,排序后链表结点数据域从头至尾的数据为 2、 4、 6、 8、 10。 请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。 注意:部分源程序给出如下。 不得增行或删行,也不得更改程序的结构 ! 试题程序: #include stdio h #include stdlib h #define N 6 typedef struct node int
2、data; struct node*next; NODE; void fun(NODE*h) NODE*p, *q; int t ; p=h; while(P) *found* q=【 1】 ; *found* while(【 2】 ) if(P data q data) t=P data; P data=q data ; q data=t; ) q=q next; *found* p=【 3】 ; NODE*creatlist(int a) NODE*h, *p, *q; int i; h=NULL; for(i=0; i N; i+) q=(NODE *)malloc(sizeof (NO
3、DE); q data=ai; q next=NULL; if(h=NULL)h=P=q; elseP next=q; P=q; ) return h; void outlist(NODE*h) NODE*P; p=h; if(P=NULL) printf(“The list is NULL! n“); else printf(“ nHead“); do printf(“ d“, P data); p=p next; ) while(p!=NULL); printf(“ End n“); main() NODE*head; int aN=0, 10, 4, 2, 8, 6); head=cre
4、atlist(a); printf(“ nThe original list: n“); outlist(head); fun(head); printf(“ nThe list after inverting: n“); outlist(head); 二、程序修改题 2 下列给定程序中函数 fun的功能是:求两个非零正整数的最大公约数,并作为函数值返回。 例如,若 num1和 num2分别为 49和 21,则输出的最大公约数为 7;若 num1和hum2分别为 27和 81,则输出的最大公约数为 27。 请改正程序中的错误,使它能得出正确结果。 注意:不要改动 main函数,不得增行或删行,
5、也不得更改程序的结构 ! 试题程序: #include stdio h int fun(int a, int b) int r, t; if(a b) *found* t=a; b=a; a; t; r=a b; while(r!=0) (a=b; b=r; r=a b; ) *found* return(a); void main() int hum1, hum2, a; printf ( “Input numl num2: “); scanf(“ d d“, &hum1, &hum2); printf(“num1= d hum2= d n n“, num1, num2); a=fun(nu
6、m1, num2); printf(“The maximun common divisor is d n n“, a); 三、程序设计题 3 请编写函数 fun,其功能是分别统计形参 t所指二维数组中字母 A和 C的个数。 注意:部分源程序存在 PROG1 C中,请勿改动主函数 mmn和其他函数中的任何内容,仅在函数 fun的花括号中填入所编写的若干语句。 试题程序: #include stdio h #include stdlib h #define M 14 void NONO(); void fun(char(*t)M, int, *a, int*c) void get(char(*s)
7、M) int i, j; for(i=0; i M; i+) for(j=0; j M; j+) sij=65+rand() 12; printf(“ c“, sij); ) printf(“ n“); main() ( char aMM; int x, y; get(a); fun(a, x, y); printf(“A= d C= d n“, x, y); NONO(); void NONO() *本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 * FILE*fp, *wf; int i, j, x, y; char aMM; fp=fopen(“c: test in dat
8、“, “r“”); wf=fopen(“c: test out dat“, “w“); for(i=0; i M; i+) for(j=0; j M; j+) fscanf(fp, “ c“, aij); ) fun(a, x, y); fprintf(wf, “A= d n“, x); fprintf(wf, “C= d n“, y); fclose(fp); fclose(wf); 国家二级 C语言机试(操作题)模拟试卷 313答案与解析 一、程序填空题 1 【正确答案】 (1)p next (2)q (3)p next 【试题解析】 填空 1:从第 2个 while循环可知, q的初值应
9、该为 p的 next,故此空应该填写 p next。 填空 2:第 2个 while循环表示的是每次从链表剩下的树中找出最小的数,因此此空应该以 q是否为空来判断循环是否结束,所以此空应该填写 q。 填空 3:当找到一个最小的数时 p应该向后移,因此此空应该填写 p next。 二、程序修改题 2 【正确答案】 (1)t=a; a=b; b=t; (2)retum(b);或 retum b; 【 试题解析】 本题考查: return语句,功能是计算表达式的值,并将其返回给主调函数。 求最大公约数算法一般采用辗转相除法。辗转相除法的算法为:首先将 m除以n(m n)得余数 r,再用余数 r去除原
10、来的除数,得到新的余数,重复此过程直到余数为 0时停止,此时的除数就是 m和 n的最大公约数。 程序首先判断参数 a和 b的大小,如果 a b则进行交换,这里是一个数学逻辑错误,应先将 a的值赋给中间变量 t,再将 b的值赋给 a,最后将 t的值赋给 b。当余数 r为 0时,除数 b即为所求的最大公约数,所以函数应返回 b。 三、程序设计题 3 【正确答案】 int i=0, j=0;循环统计的下标 *a=0;初始化 a字符统计的个数 *c=0;初始化 c字符统计的个数 for(i=0; i M; i+)行 for(j=0; j M; j+)列 if(tij=A)字符是 a,计数 (*a)+; if(tij=c)字符是 c,计数 (*c)+; 【试题解析】 对二维数组的行列分别循环,行优先,查找数组中元 素为 A或者C,分别对其进行计数。