1、二级 C 语言机试 38 及答案解析(总分:100.00,做题时间:90 分钟)一、B填空题/B(总题数:1,分数:30.00)1.从键盘:输入一组无符号整数并保存在数组 xxN中,以整数 0 结束输入,要求这些数的最大位数不超过 4 位,其元素的个数通过变量 num 传入函数 fun()。请补充函数 fun(),该函数的功能是:从数组 xx 中找出个位和十位的数字之和大于 5 的所有无符号整数,结果保存在数组 yy 中,其个数由函数 fun()返回。例如:当 xx8=123,11,25,222,42,333,14,5451时, bb4=25,42,333,5451。 注意:部分源程序给出如下
2、。 请勿改动主函数 main 和其他函数中的任何内容,仅在函数 fun 的横线上填入所编写的若干表达式或语句。 试题程序: #include stdio.h #define N 1000 int fun(int xx ,int bb ,int num) int i,n=0; int g,s; for(i=0;inum;i+) g=U 【1】 /U; s=xxi/10%10; if(g+s)5) U【2】 /U; returnU 【3】 /U; main() int xxN;int yyN; int num=0,n=0,i=0; printf(“Input number:/n“); do sca
3、nf(“%u“,&xxnum); while(xxnum+!=0); n=fun(xx,yy,num); printf(“/nyy=“); for(i=0;in;i+) printf(“%u“,yyi); (分数:30.00)填空项 1:_二、B改错题/B(总题数:1,分数:30.00)2.下列给定程序中,函数 fun()的功能是:在字符串 str 中找出 ASCII 码值最小的字符,将其放在第一个位置上,并将该字符前的原字符向后顺序移动。例如,调用 fun()函数之前给字符串输入 fagAgBDh,调用后宁符串中的内容为 AfaggBDh。 请改正程序中的错误,使它能得到正确结果。 注意:不
4、要改动 main 函数,不得增行或删行,也不得更改程序的结构。 试题程序: #includestdioh /*found*/ void fun(char p) char min,*q; int i=0; min=pi; while (pi!=0) if (minpi) /*found*/ p=q+i; min=pi; i+; while(qp) *q=*(q-1); q-; p0=min; main() char str80; printf(“Enter a string:“); gets(str); printf(“/nThe original string:“); puts(str); f
5、un(str); printf(“/nThe string after moving:“); puts(str); printf(“/n/n“); (分数:30.00)填空项 1:_三、B编程题/B(总题数:1,分数:40.00)3.N 名学生的成绩已在主函数中放入一个带头节点的链表结构中,h 指向链表的头节点。请编写函数 fun(),它的功能是:找出学生的最低分,由函数值返回。 注意:部分源程序给出如下。 请勿改动主函数 main和其他函数中的任何内容,仅在函数 fun 的花括号中填入所编写的若干语句。 试题程序: #include stdioh #include stdlibh #defi
6、ne N 8 struct slist double 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) /*产生 8 个节点的链表,各分数存入链表中*/ q=(STREC*) malloc(sizeOf(STREC); p-S=Si; i+; p-next=q; p=q; p-next=NULL;
7、return h; /*返回链表的首地址*/ outlist(STREC *h) STREC *p; p=h; printf(“head“); do printf(“-%2.of “,p-s);p=p-next; /*输/出各分数*/ while(p!=NULL); printf(“/n/n “); main() double sN=56,89,76,95,91,68,75, 85,min; STREC *h; h=creat(s); outlist(h); min=fun(h); printf(“min=%6.If/n “,min); (分数:40.00)_二级 C 语言机试 38 答案解析
8、(总分:100.00,做题时间:90 分钟)一、B填空题/B(总题数:1,分数:30.00)1.从键盘:输入一组无符号整数并保存在数组 xxN中,以整数 0 结束输入,要求这些数的最大位数不超过 4 位,其元素的个数通过变量 num 传入函数 fun()。请补充函数 fun(),该函数的功能是:从数组 xx 中找出个位和十位的数字之和大于 5 的所有无符号整数,结果保存在数组 yy 中,其个数由函数 fun()返回。例如:当 xx8=123,11,25,222,42,333,14,5451时, bb4=25,42,333,5451。 注意:部分源程序给出如下。 请勿改动主函数 main 和其他
9、函数中的任何内容,仅在函数 fun 的横线上填入所编写的若干表达式或语句。 试题程序: #include stdio.h #define N 1000 int fun(int xx ,int bb ,int num) int i,n=0; int g,s; for(i=0;inum;i+) g=U 【1】 /U; s=xxi/10%10; if(g+s)5) U【2】 /U; returnU 【3】 /U; main() int xxN;int yyN; int num=0,n=0,i=0; printf(“Input number:/n“); do scanf(“%u“,&xxnum); w
10、hile(xxnum+!=0); n=fun(xx,yy,num); printf(“/nyy=“); for(i=0;in;i+) printf(“%u“,yyi); (分数:30.00)填空项 1:_ (正确答案:1 xxi%10 2 bbn+xxi 3 n)解析:解析 填空 1:将个整数对 10 取余,则得到这个整数的个位数,将一个整数除以 10 再对 10 取余,则得到这个整数的十位数。由程序可以看出,变量 s 保存了整数的十位数,所以应该将整数的个位数保存于变量 g 中。填空 2:当整数的个位与十位的数字之和大于 5 时,则将这个整数存于数组 bb 中,同时,变量 n 记录了满足条件
11、的无符号整数的个数。填空 3:题目要求满足条件的无符号整数的个数由 fun函数返回,所以函数返回 n。二、B改错题/B(总题数:1,分数:30.00)2.下列给定程序中,函数 fun()的功能是:在字符串 str 中找出 ASCII 码值最小的字符,将其放在第一个位置上,并将该字符前的原字符向后顺序移动。例如,调用 fun()函数之前给字符串输入 fagAgBDh,调用后宁符串中的内容为 AfaggBDh。 请改正程序中的错误,使它能得到正确结果。 注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构。 试题程序: #includestdioh /*found*/ void f
12、un(char p) char min,*q; int i=0; min=pi; while (pi!=0) if (minpi) /*found*/ p=q+i; min=pi; i+; while(qp) *q=*(q-1); q-; p0=min; main() char str80; printf(“Enter a string:“); gets(str); printf(“/nThe original string:“); puts(str); fun(str); printf(“/nThe string after moving:“); puts(str); printf(“/n/
13、n“); (分数:30.00)填空项 1:_ (正确答案:(1)错误:void fun(char p) 正确:void fun(char *p))解析:(2) 错误:p=q+i; 正确:q=p+i; 解析 错误 1:由于本题中函数的功能是对字符串进行处理,而不是对单个字符进行处理,因此,函数的参数应为字符串指针。错误 2:使指针 q 指向 ASCII 码最小的字符 本题解答需要 3 个步骤: (1) 找到字符串中 ASCII 码值最小的字符,并保存。 (2) 将该字符复制,并将该字符前面的字符串顺次后移。 (3) 将 ASCII 码值最小的字符赋给字符串的第 1 个字符。找到ASCII 码值最
14、小的字符可以通过定义一个字符 min,该字符初始时等于字符串的第 1 个字符,若字符串的下一个字符小于 min,则将下一个字符赋给 min,如此循环到字符尾,即可得到 ASCII 码值最小的字符,同时令指针 q 指向最小字符。之后对最小字符前面的子串顺次后移,可采用 while 语句实现。 此题需要熟练掌握和灵活应用 C 语言的字符与整型变量的关系以及字符中操作。三、B编程题/B(总题数:1,分数:40.00)3.N 名学生的成绩已在主函数中放入一个带头节点的链表结构中,h 指向链表的头节点。请编写函数 fun(),它的功能是:找出学生的最低分,由函数值返回。 注意:部分源程序给出如下。 请勿
15、改动主函数 main和其他函数中的任何内容,仅在函数 fun 的花括号中填入所编写的若干语句。 试题程序: #include stdioh #include stdlibh #define N 8 struct slist double 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) /*产生 8
16、 个节点的链表,各分数存入链表中*/ q=(STREC*) malloc(sizeOf(STREC); p-S=Si; i+; p-next=q; p=q; p-next=NULL; return h; /*返回链表的首地址*/ outlist(STREC *h) STREC *p; p=h; printf(“head“); do printf(“-%2.of “,p-s);p=p-next; /*输/出各分数*/ while(p!=NULL); printf(“/n/n “); main() double sN=56,89,76,95,91,68,75, 85,min; STREC *h; h=creat(s); outlist(h); min=fun(h); printf(“min=%6.If/n “,min); (分数:40.00)_正确答案:()解析:double fun(STREC *h) double min=h-s; while(h!=NULL) /*通过循环找到最低分数*/ if(minh-s) min=h-s; h=h-next; return min; 解析 在本题中,h 为个指向结构体的指针变量,若要引用它所指向的结构体中的某一成员时,要用指向运算符“-”。由于是链表,所以要使 h 逐一往后移动,使用的是 h=h-next。