1、二级 C 语言机试 87 及答案解析(总分:100.00,做题时间:90 分钟)一、B填空题/B(总题数:1,分数:30.00)1.从键盘输入一组小写字母,保存在字符数组 str 中。请补充函数 fun(),该函数的功能是:把字符数组str 中字符下标为奇数的小写字母转换成对应的大写字母,结果仍保存在原数组中。 例如,输入“acegikm”,输出“aCeGiKm”。 注意:部分源程序给出如下。 请勿改动主函数 main 和其他函数中的任何内容,仅在函数 fun()的横线上填入所编写的若干表达式或语句。 试题程序: #include stdio.h #define N 80 void fun (
2、char s) int i=0; while (U 【1】 /U) if (i%2!=0) si-=U 【2】 /U; U 【3】 /U; main () char str N; clrscr (); printf(“/n Input a string:/n“); gets (str); printf(“/n* original string */n“); puts (str); fun (str); printf (“In* new string */n“); puts (str); (分数:30.00)填空项 1:_二、B改错题/B(总题数:1,分数:30.00)2.下列给定程序中,函数
3、fun()的功能是:对 N 名学生的学习成绩,按从高到低的顺序找出前叫 m10)名学生来,并将这些学生数据存放在一个动态分配的连续存储区中,此存储区的首地址作为函数值返回。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构 试题程序: #include conio.h #include string.h #include stdio.h #include alloc.h #define N 10 typedef struct ss char num10; int s; STU; STU *funSTU a, int m) STU
4、bN ,*t; int i, j,k; /*found*/ *t=calloc (m, slzeof (STU); for(i=0;iN;i+) bi=ai; for(k=0; km; k+) for (i=j=0;iN;i+) if (bi.sbj.s) j=i; /*found*/ tk.num=b j.num; tk.s=bj s; bj.s=0; return t; outresult(STU a,FILE *pf) int i; for (i=0; iN; i+) fprintf(pf, “No=%s Mark-%d/n “, a i .num, ai.s); fprintf(pf,
5、 “/n/n “); main ( ) STU aN= “A01 “,81, “A02 “,89, “A03 “,66, “A04 “,87, “A05 “,77, “A06 “,90, “A07 “,79, “A08 “,61, “A09 “,80, “Al0 “,71; STU *pOrder; int i, m; clrscr (); printf (“*THE RESULT* /n“); outresult (a, stdout); printf (“/nGive the number of the students who have better score: “); scanf (
6、“%d“, while (m10) printf(“lnGive the number of the students who have better score: “); scanf (“%d“, %m); pOrder=fun (a,m); printf(“* THE RESULT*kn“); printf(“The top :/n“); for (i=0; im; i+) printf(“%s %d/n“,pOrderi.num, p0rder i. s); free (pOrder); (分数:30.00)填空项 1:_三、B编程题/B(总题数:1,分数:40.00)3.编写一个函数,
7、从传入的 num 个字符中找出最长的一个字符串,并通过形参指针 max 传回该串地址(用*作为结束输入的标志)。 注意:部分源程序给出如下 请勿改动主函数 main 和其他函数中的任何内容,仅在函数 fun 的花括号中填入所编写的若干语句。 试题程序: #includeconio.h #includestdio.h #includestring.h fun(char (*a) 81, int num, char *max) main () char ssl0 81,*ps; int n, i=0; clrscr(); prlntf(“输入若干个字符串“); gets(ssi); puts(ss
8、i); while(!strcmp(ssi, “*“)=0) /*用*作为结束输入的标志*/ i+; gets(ssi);puts(ssi); n=i; ps=fun(ss,n, print(“/nmax=%s/n“,ps); (分数:40.00)_二级 C 语言机试 87 答案解析(总分:100.00,做题时间:90 分钟)一、B填空题/B(总题数:1,分数:30.00)1.从键盘输入一组小写字母,保存在字符数组 str 中。请补充函数 fun(),该函数的功能是:把字符数组str 中字符下标为奇数的小写字母转换成对应的大写字母,结果仍保存在原数组中。 例如,输入“acegikm”,输出“a
9、CeGiKm”。 注意:部分源程序给出如下。 请勿改动主函数 main 和其他函数中的任何内容,仅在函数 fun()的横线上填入所编写的若干表达式或语句。 试题程序: #include stdio.h #define N 80 void fun (char s) int i=0; while (U 【1】 /U) if (i%2!=0) si-=U 【2】 /U; U 【3】 /U; main () char str N; clrscr (); printf(“/n Input a string:/n“); gets (str); printf(“/n* original string */n
10、“); puts (str); fun (str); printf (“In* new string */n“); puts (str); (分数:30.00)填空项 1:_ (正确答案:1 si!= /0或 si 2 32 或a-A 3 i+)解析:解析 填空 1:while 循环的条件是当前参加判断的字符不为/0,即还没有到字符串的最后一个字符。填空 2:将小写字母转换为对应的大写字母的力法是,将字母的 ASCII 码减去 32。a-A的结果就是 32。填空 3:通过 i+依次访问字符串 s 中的各个字符。二、B改错题/B(总题数:1,分数:30.00)2.下列给定程序中,函数 fun()
11、的功能是:对 N 名学生的学习成绩,按从高到低的顺序找出前叫 m10)名学生来,并将这些学生数据存放在一个动态分配的连续存储区中,此存储区的首地址作为函数值返回。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构 试题程序: #include conio.h #include string.h #include stdio.h #include alloc.h #define N 10 typedef struct ss char num10; int s; STU; STU *funSTU a, int m) STU bN ,*
12、t; int i, j,k; /*found*/ *t=calloc (m, slzeof (STU); for(i=0;iN;i+) bi=ai; for(k=0; km; k+) for (i=j=0;iN;i+) if (bi.sbj.s) j=i; /*found*/ tk.num=b j.num; tk.s=bj s; bj.s=0; return t; outresult(STU a,FILE *pf) int i; for (i=0; iN; i+) fprintf(pf, “No=%s Mark-%d/n “, a i .num, ai.s); fprintf(pf, “/n/
13、n “); main ( ) STU aN= “A01 “,81, “A02 “,89, “A03 “,66, “A04 “,87, “A05 “,77, “A06 “,90, “A07 “,79, “A08 “,61, “A09 “,80, “Al0 “,71; STU *pOrder; int i, m; clrscr (); printf (“*THE RESULT* /n“); outresult (a, stdout); printf (“/nGive the number of the students who have better score: “); scanf (“%d“,
14、 while (m10) printf(“lnGive the number of the students who have better score: “); scanf (“%d“, %m); pOrder=fun (a,m); printf(“* THE RESULT*kn“); printf(“The top :/n“); for (i=0; im; i+) printf(“%s %d/n“,pOrderi.num, p0rder i. s); free (pOrder); (分数:30.00)填空项 1:_ (正确答案:错误: *t=calloc(m,sizcof(STU); 正确
15、: t=calloc(m,sizeof(STU);)解析:(2) 错误: tk.num=bj.num; 正确: tk=bj; 解析 calloc 也用于分配内存空间。调用形式:(类型说明符*)calloc(n,size),功能:在内存动态存储区中分配 n 块长度为“size”字节的连续区域。函数的返回值为该区域的首地址。(类型说明符*)用于强制类型转换。calloc 函数与 malloc 函数的区别仅在于一次可以分配 n 块区域。例如: ps=(struet stu*)calloc(2,sizeof(struct stu);,其中的 sizeof(struct stu)是求 stu 的结构长度
16、。因此该语句的意思是:按 stu 的长度分配两块连续区域,强制转换为 stu 类型,并把其首地址赋予指针变量 ps。在本例中我们可别考虑那么复杂厂,根据定义类型 STUbN,*t;就可以看出*t=calloc(m,sizeof(STU);中的错误,tk.num=bj.num;的错误旨在考查对结构体概念的掌握和灵活应用程度。三、B编程题/B(总题数:1,分数:40.00)3.编写一个函数,从传入的 num 个字符中找出最长的一个字符串,并通过形参指针 max 传回该串地址(用*作为结束输入的标志)。 注意:部分源程序给出如下 请勿改动主函数 main 和其他函数中的任何内容,仅在函数 fun 的
17、花括号中填入所编写的若干语句。 试题程序: #includeconio.h #includestdio.h #includestring.h fun(char (*a) 81, int num, char *max) main () char ssl0 81,*ps; int n, i=0; clrscr(); prlntf(“输入若干个字符串“); gets(ssi); puts(ssi); while(!strcmp(ssi, “*“)=0) /*用*作为结束输入的标志*/ i+; gets(ssi);puts(ssi); n=i; ps=fun(ss,n, print(“/nmax=%s/n“,ps); (分数:40.00)_正确答案:()解析:fun(char (*a)81, int num, char *max) int i=0; max=a0; for (i=0; inum; i+) /*找出最长的一个字符串*/ if(strlen(max)strlen(ai) max=ai; return max; /*传回最长字符串地址*/ 解析 做本题之前,我们先应该明白 ss 是一个指向一维数组的指针变量,max 是指向指针变量的指针变量。所以引用时要注意加上*。我们不可能只用 max,因为 ss0是一个数组地址而不是一个指针的地址。