1、二级 C语言机试-262 及答案解析(总分:100.00,做题时间:90 分钟)一、填空题(总题数:1,分数:30.00)1.下列给定程序中,函数 fun的功能是进行数字字符转换。若形参 ch中是数字字符09,则将0转换成9, 1转换成8,2转换成7,9转换成0;若是其他字符则保持不变;并将转换后的结果作为函数值返回。请在下画线处填入正确的内容并将下画线删除,使程序得出正确的结果。注意:部分源程序给出如下。不得增行或删行,也不得更改程序的结构!试题程序:#include stdio.h /*found* /(1) fun (char ch)/*found* /if(ch0 (2) )/*fou
2、nd* /return 9-(ch- (3) ); return ch; main ()char c1, c2; printf (“/nThe result :/n“); c1=2; c2=fun (c1); printf (“c1=% c c2=% c/n“, c1, c2); c1=8; c2=fun (c1); printf (“c1=% c c2=% c/n“, c1, c2); c1=a; c2=fun (c1); printf (“c1=% c c2=% c/n“, c1, c2); (分数:30.00)_二、改错题(总题数:1,分数:30.00)2.下列给定程序中,函数 fun的
3、功能是:将 p所指字符串中的所有字符复制到 b中,要求每复制 3个字符之后插入一个空格。请改正程序中的错误,使它能得出正确结果。注意:不要改动 main函数,不得增行或删行,也不得更改程序的结构!试题程序:#include stdio.h void fun (char * p, char * b)int i, k=0; while (* p)i=1; while (i=3 * p) /*found* /bk=p; k+; p+; i+; if(* p)/*found* /bk+“ “; bk=/0; main ()char a80, b80; printf (“Enter a string:“
4、); gets (a); printf (“The original string: “); puts (a); fun (a, b); printf (“/nThe string after insertspace: “); puts (b); printf (“/n/n“); (分数:30.00)_三、编程题(总题数:1,分数:40.00)3.N名学生的成绩已在主函数中放入一个带头结点的链表结构中,h 指向链表的头结点。请编写函数fun,其功能是:求出平均分,并由函数值返回。注意:部分源程序给出如下。请勿改动主函数 main和其他函数中的任何内容,仅在函数 fun的花括号中填入你编写的若干
5、语句。试题程序#include stdlib.h#include stdio.h#define N 8struct slistdouble s; struct slist * next; ; typedef struct slist STREC; double fun(STREC * h)STREC * creat (double * s) /*创建链表* /STREC * h, * p, * q; int i=0; h=p=(STREC*) malloc (sizeof(STREC); p-s=0; while (iN)q=(STREC *)malloc (sizeof(STREC); q-
6、s=si; i+; p-next=q; p=q; p-next=0; return h; outlist (STREC * h)STREC * p; p=h-next; printf (“head “); doprintf(“-% 4.1f “, p-s); p=p-next; /*输出成绩* /while (p !=NULL); printf (“/n/n“); void main ()double sN=85, 76, 69, 85, 91, 72, 64, 87 , ave; STREC * h; h=creat (s); outlist (h); ave=fun (h); printf
7、(“ave=% 6.3f/n“, ave); (分数:40.00)_二级 C语言机试-262 答案解析(总分:100.00,做题时间:90 分钟)一、填空题(总题数:1,分数:30.00)1.下列给定程序中,函数 fun的功能是进行数字字符转换。若形参 ch中是数字字符09,则将0转换成9, 1转换成8,2转换成7,9转换成0;若是其他字符则保持不变;并将转换后的结果作为函数值返回。请在下画线处填入正确的内容并将下画线删除,使程序得出正确的结果。注意:部分源程序给出如下。不得增行或删行,也不得更改程序的结构!试题程序:#include stdio.h /*found* /(1) fun (ch
8、ar ch)/*found* /if(ch0 (2) )/*found* /return 9-(ch- (3) ); return ch; main ()char c1, c2; printf (“/nThe result :/n“); c1=2; c2=fun (c1); printf (“c1=% c c2=% c/n“, c1, c2); c1=8; c2=fun (c1); printf (“c1=% c c2=% c/n“, c1, c2); c1=a; c2=fun (c1); printf (“c1=% c c2=% c/n“, c1, c2); (分数:30.00)_正确答案:
9、(char (2) ch=9 (3)0答案考生文件夹)解析:解析 本题考查:函数定义,注意函数定义的一般形式以及有参函数和无参函数的区别;if 语句条件表达式,本题的条件表达式是判断数字字符;函数返回值,其一般形式为“return 表达式;“。解题思路 填空 1:函数定义时,类型标识符指明了本函数的类型,函数的类型实际上是函数返回值的类型,所以此处应该填入 char。填空 2:通过 if条件语句判断字符串中字符是否是数字字符,既大于等于字符0,同时小于等于字符9。填空 3:return 语句完成函数返回操作,要实现字符转换,应填入 return 9- (ch-0)。解题宝典 有参函数定义,其一
10、般形式为:类型标识符 函数名(形式参数表列)声明部分语句在形参表中给出的参数称为形式参数,它们可以是各种类型的变量,各参数之间用逗号间隔。在进行函数调用时,主调函数将赋予这些形式参数实际的值。形参既然是变量,必须在形参列表中给出类型说明。二、改错题(总题数:1,分数:30.00)2.下列给定程序中,函数 fun的功能是:将 p所指字符串中的所有字符复制到 b中,要求每复制 3个字符之后插入一个空格。请改正程序中的错误,使它能得出正确结果。注意:不要改动 main函数,不得增行或删行,也不得更改程序的结构!试题程序:#include stdio.h void fun (char * p, cha
11、r * b)int i, k=0; while (* p)i=1; while (i=3 * p) /*found* /bk=p; k+; p+; i+; if(* p)/*found* /bk+“ “; bk=/0; main ()char a80, b80; printf (“Enter a string:“); gets (a); printf (“The original string: “); puts (a); fun (a, b); printf (“/nThe string after insertspace: “); puts (b); printf (“/n/n“); (分
12、数:30.00)_正确答案:(bk=*p;(2) bk= ;k+;答案考生文件夹)解析:解析 本题考查:指针类型变量作为函数的参数,函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传送到另一个函数中。解题思路 (1)题目中 p是指针型变量作函数参数,因此给 bk赋值时出现错误。(2) 题目要求赋值 3个字符后加一个空格,所以应该是先给 bk赋值空格,然后变量 k再加 1。解题宝典 C 语言中为了表示指针变量和它所指向的变量之间的关系,在程序中用“*“符号表示“指向“,例如,pointer 代表指针变量,而*pointer 是 pointer所指向的变量
13、。三、编程题(总题数:1,分数:40.00)3.N名学生的成绩已在主函数中放入一个带头结点的链表结构中,h 指向链表的头结点。请编写函数fun,其功能是:求出平均分,并由函数值返回。注意:部分源程序给出如下。请勿改动主函数 main和其他函数中的任何内容,仅在函数 fun的花括号中填入你编写的若干语句。试题程序#include stdlib.h#include stdio.h#define N 8struct slistdouble s; struct slist * next; ; typedef struct slist STREC; double fun(STREC * h)STREC
14、* creat (double * s) /*创建链表* /STREC * h, * p, * q; int i=0; h=p=(STREC*) malloc (sizeof(STREC); p-s=0; while (iN)q=(STREC *)malloc (sizeof(STREC); q-s=si; i+; p-next=q; p=q; p-next=0; return h; outlist (STREC * h)STREC * p; p=h-next; printf (“head “); doprintf(“-% 4.1f “, p-s); p=p-next; /*输出成绩* /wh
15、ile (p !=NULL); printf (“/n/n“); void main ()double sN=85, 76, 69, 85, 91, 72, 64, 87 , ave; STREC * h; h=creat (s); outlist (h); ave=fun (h); printf(“ave=% 6.3f/n“, ave); (分数:40.00)_正确答案:(double fun( STREC *h )double ave=0.0;STREC *p=h-next;while(p!=NULL)ave=ave+p-s; p=p-next;return ave/N;答案考生文件夹)解析:解析 本题考查:链表的操作,对链表的主要操作有以下几种:建立链表、结构的查找与输出、插入一个结点、删除一个结点。解题思路 题目要求求链表中数据域的平均值,应首先使用循环语句遍历链表,求各结点数据域中数值的和,再对和求平均分。遍历链表时应定义一个指向结点的指针 p,因为“头结点“中没有数值,所以程序中让 p直接指向“头结点“的下一个结点,使用语句 STREC *ph-next。