1、国家二级 C语言机试(操作题)模拟试卷 183及答案与解析 一、程序填空题 1 给定程序中已建立一个带有头结点的单向链表,在 main函数中将多次调用 fun函数,每调用一次 fun函数,输出链表尾部结点中的数据,并释放该结点,使链表缩短。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 注意:源程序存放在考生文件夹下的 BLANKl C中。 不得增行或删行,也不得更改程序的结构 ! #include #include #define N 8 typedef Struct list int data; struct list*next; SLIST; void fun(
2、SLIST *p) SLIST *t, *s; t=p-next ; s=p ; while(t-next!=NULL) s=t ; *found* t=t-_1_; *found* printf(“ d“, _2_); s-next=NULL; *found* free(_3_); SLIST*creatlist(int *a) SLIST *h, *p, *q; int i ; h=p=(SLIST*)malloc(sizeof(SLIST); for(i=0; idata=ai; p-next=q; p=q; p-next=0: return h; void outlist(SLIST
3、*h) SLIST *p; p=h-next; if(p=NULL)printf(“ nThe list is NULL! n“); else printf(“ nHead“); doprintf(“- d“, p-data); p=p-next; while(p!=NULL); printf(“-End n“); main() SLIST*head; int aN=11, 12, 15, 18, 19, 22, 25, 29; head=creatliSt(a); printf(“ nOutput from head: n“); outlist(head); printf(“ nOutput
4、 from tail: n“); while(head-next!=NULL) fun(head); printf(“ n n“); printf(“ nOutput from head again: n“); out=list(head); 二、程序修改题 2 由 N个有序整数组成的数列已放在一维数组中,给定程序 MODIl C中函数 fun的功能是:利用折半查找算法查找整数 m在数组中的位置。若找到,返回其下标值;反之,返回 -1。 折半查找的基本算法是:每次查找前先确定数组中待查的范围: low和high(10whigh,查找结束。 请改正程序中的错误,使它能得出正确结果。 注意:不要改
5、动 main函数,不得增行或删行,也不得更改程序的结构。 #include define N 10 *found* void fun(int a, int m) int low=0, high=N一 1, mid; while(lowamid) low=mid+1; else return(mid); return(一 1); main() int i, aN=一 3, 4, 7, 9, 13, 45, 67, 89, 100, 180, k, m; printf(“a数组中的数据如 F: “); for(i=0 ; i=0) printf(“m= d, index= d n“, m, k);
6、 else printf(“Not be found! n“); 三、程序设计题 3 编写函数 fun,它的功能是:利用以下所示的简单迭代方法求方程: cos(x) x=0的一个实 根。 xn+1=cos(xn) 迭代步骤如下: (1)取 x1初值为 0 0; (2)x0=x1,把 x1的值赋给 x0; (3)x1=cos(x0),求出一个新的 x1; (4)若 x0-x1的绝对值小于0 000001,执行步骤 (5),否则执行步骤 (2); (5)所求 x1就是方程 cos(x)-x=0的一个实根,作为函数值返回。 程序将输出结果 Root=0 739086。 注意:部分源程序在文件 PRO
7、Gl C中。 请勿改动主函数 main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。 #include #include double fun() main() void NONO(); printf(“Root= f n“, fun(); NONO(); void NONO() *本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 * FTLE*wf; wf=fopen(“out dat“, “w“); fprintf(wf, “ f n“, fun(); fclose(wf); 国家二级 C语言机试(操作题)模拟试卷 183答案与解析 一、程序填空题 1
8、【正确 答案】 (1)next (2)t-data (3)t 【试题解析】 第一空: fun函数中的循环 “while(t-next!=NULL)”目的是找到尾结点,利用结点变量 s和 t, s指向当前节点, t不断指向下一个结点,因此第一空处应该是 “t=t-next; ”。 第二空:这里是输出尾结点中的数据,已经利用循环找到了尾结点 t, t的数据是 t-data,因此第二空处应该为 “printf(“ d“, t-data); ”。 第三空:输出尾结点数据之后删除尾结点,使用 free,又因为尾 结点是 t,因此第三空处应该为 “free(t); ”。 二、程序修改题 2 【正确答案】
9、(1)int fun(int a, int m) (2)else if(mamid) 【试题解析】 (1)根据主函数中 “k=fun(a, m); ”,知道函数 fun应该是返回 int型的函数,所以第一个标识下面定义的 “void fun(int a, int m)”应该改为 “int fun(int a, int m)”。 (2)第二个标识下的 “else If(mamid)”是判断 m是否比 amid大,在 while循环中采用的是 if-else if-else语句,显然 “else lf”当中 “If”应当小写,故第二标识下 “else If(mamid)”应改为 “else if(mamid)”。 三、程序设计题 3 【正确答案】 float x0, x1=0 0; do x0=x1; x1=cos(x0); while(fabs(x0一 x1)0 000001); return x1; 【试题解析】 进入 fun函数,根据前面的分析: 根据题中 给出的求解步骤,首先 x1初值为 0 0;若 x0-x1的绝对值大于0 000001就循环进行迭代,即 “x0=x1; x1=cos(x0); ”直到满足题目中的要求,返回 x1,即实根。