1、国家二级 C语言机试(操作题)模拟试卷 340及答案与解析 一、程序填空题 1 给定程序中已建立一个带有头结点的单向链表,链表中的各结点按结点数据域中的数据递增有序链接。函数 fun的功能是:把形参 x的值放入一个新结点并插入到链表中,插入后各结点数据域的值仍保持递增有序。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 注意:源程序存放在考生文件夹下的 BLANK1 C中。 不得增行或删行,也不得更改程序的结构 ! 1 #include stdio h 2 #include stdlib h 3 #define N 8 4 typedef struct list 5
2、int data; 6 struct list *next; 7 SLIST; 8 void fun(SLIST *h, int x) 9 SLIST *p, *q, *s; 10 s=(SLIST *)malloc(sizeof(SLIST); 11 *found* 12 s- data= _1_; 13 q=h; 14 p=h- next; 15 while(p!=NULL x p- data) 16 *found* 17 q=_2_; 18 p=p- next; 19 20 s- next=p; 21 *found* 22 q- next=_3_; 23 24 SLIST*creatli
3、St(int *a) 25 SLIST *h, *p, *q; int i; 26 h=p=(SLIST *)malloc(sizeof(SLIST); 27 for(i=0; i N; i+) 28 q=(SLIST *)malloc(sizeof(SLIST); 29 q- data=ai; p- next=q; p=q; 30 31 p- next=0; 32 return h; 33 34 void outlist(SLIST *h) 35 SLIST *p; 36 p=h- next; 37 if(p=NULL)printf( nThe list is NULL! n); 38 el
4、se 39 printf( nHead); 40 do printf(- d, p- data); p=p- next; while(p!=NULL); 41 printf(- End n); 42 43 44 main() 45 SLIST *head; int x; 46 IntaN=11, 12, 15, 18, 19, 22, 25, 29; 47 head=creatlist(a); 48 printf( nThe list before inserting: n); outlist(head); 49 printf( nEnter a number: ); scanf( d, x)
5、; 50 fun(head, x); 51 printf( nThe list after inserting: n); outlist(head); 52 二、程序修改题 2 给定程序 MODI1 C中函数 fun的功能是:统计字符串中各元音 字母 (即: A、E、 I、 O、 U)的个数。注意:字母不分大、小写。例如:若输入: THIs is a boot,则输出应该是: 1、 0、 2、 2、 0。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动 main函数,不得增行或删行,也不得更改程序的结构 ! 1 #include stdio h 2 void fun(char *s
6、, int num5) 3 int k, 2=5; 4 for(k=0; k i; k+) 5 *found* 6 numi=0; 7 for(; *s; s+) 8 i=-1 ; 9 *found* 10 switch(s) 11 case a: case A: i=0; break; 12 casee: caseE: i=1; break; 13 case i: case T: i=2; break; 14 case o: case0: i=3; break; 15 caseu: caseU: i=4; break; 16 17 if( =0) 18 numi+; 19 20 21 mai
7、n() 22 char s181; int num15, i; 23 printf( nPlease enter a string: ); gets(s1); 24 fun(s1, num1); 25 for(i=0; i 5; i+)printf( d, num1i); printf( n); 26 三、程序设计题 3 请编写函数 fun:在形参指针所指的 4个整数中找出最大值和最小值,最大的放在 a中,最小的放在 d中。 注意:部分源程序存在 PROG1 C中,请勿改动主函数 main和其他函数中的任何内容,仅在函数 fun的花括号中填入所编写的若干语句。 1 #include stdio
8、 h 2 void NONO(); 3 void fun(int *a, int *b, int *c, int*d) 4 5 6 main() 7 int a, b, c, d; 8 printf(请输入 4个整数: ); 9 scanf( d d d d, 19 fp=fopen(in dat, r); 20 wf=fopen(out dat, w); 21 for(i=0; i 5; i+) 22 fscanf(fp, d d d d, a, b, c, d); 23 fun( a, b, c, d); 24 fprintf(wf, a= d, d= d n, a, d); 25 26
9、fclose(fp); 27 fclose(wf); 国家二级 C语言机试 (操作题)模拟试卷 340答案与解析 一、程序填空题 1 【正确答案】 (1)x (2)p (3)s 【试题解析】 第一空: “s=(SLIST *)malloc(sizeof(SLIST); ”显然 s是一个新结点,第一空处是给新结点的数据域赋值 x,因此第一空处应该是 “s- data=x; ”。 第二空:循环 “while(p!=NULL 6 if(*a *c)(t=*a; *a=*c; *c=t; 7 if(*a *d)t=*a; *a=*d; *d=t; 8 if(*b *c)t=*b; *b=*c; *c=
10、t; 9 if(*b *d)t=*b; *b=*d; *d=t; 10 if(*c *d)t=*c; *c=*d;*d=t; 【试题解析】 首先在主函数 main中我们需要的就是四个数字,这四个数字需要手动输入,件程序代码第 13 15行,四个数字输入完城后就可以进入 fun函数进行数据处理了。进入到 fun函数中,只要从 a到 d进行比较,按照一开始的规则即可,如果 a大于 b,不变,比较 a与 c,若 a小 b, a与 b交换位置,交换过后 a就大于 b了,这样就进行 a与 c的比较; a与 c的比较同理,这样的循环比较,就能发现,每比较一次,较大的数字就能交换到 a的位置,较小的数字就离 a越来越远,也就是到了 d的位置,这样就完成了题目所给出的要求了,最大的数字放在 a中,最小的数字放在 d中。当新的排序排好后,就可以返回主函数进行输出了。