1、全国计算机等级考试二级 C 语言机试真题 2009 年 3 月及答案解析(总分:100.00,做题时间:90 分钟)一、程序填空题(总题数:1,分数:30.00)1.请补充 fun 函数,该函数的功能是:按0到9统计一个字符串中的奇数数字字符各自出现的次数,结果保存在数组 num 中。注意:不能使用字符串库函数。例如,输入“x=1123.456+0.909*bc”,结果为:1=2,3=1,5=1,7=0,9=2。注意 部分源程序给出如下。请勿改动主函数 main 和其他函数中的任何内容,仅在函数 fun 的横线上填入所编写的若干表达式或语句。试题源程序#includeconio.h#inclu
2、destdio.h#define N 20fun(char*tt, int num)int i, j;int bb10;char *p=tt;for(i=0;i10; i+)numi=0;bbi=0;while( (1) )if(*p=0*p=9)(2) ;p+;for(i=i, J=0; i10; i=i+2, j+)(3) ;main()char strN;int num10, k;cirscr();printf(“/nplease enter a string:“);gets(str);printf(“/n*The original string*/n“);puts(str);fun(s
3、tr, num);printf(“/n*The number of letter*/n”);for(k=0; k5; k+)printf(“/n“);printf(“%d=%d “, 2*k+1, humk);printf(“/n“);return;(分数:30.00)填空项 1:_二、程序修改(总题数:1,分数:30.00)2.给定程序中函数 fun 的功能是:根据整型形参 m,计算如下公式的值。(分数:30.00)_三、程序设计(总题数:1,分数:40.00)3.学生的记录由学号和成绩组成,N 名学生的数据已在主函数中放入结构体数组 s 中,请编写函数 fun,它的功能是:按分数的高低排列
4、学生的记录,高分在前。注意 部分源程序给出如下。请勿改动主函数 main 和其他函数中的任何内容,仅在函数 fun 的花括号中填入所编写的若干语句。试题源程序#includestdio.h#define N 16typedef structchar numi0;int s;STREC;int fun(STREC a)main()STREC sN=“GA005“, 85, “GA003“, 76, “GA002“, 69, “GA004“, 85, “GA001“, 91, “GA007“, 72, “GA008“, 64, “GA006“, 87, “GA015“, 85, “GA013“,
5、91, “GA012“, 64, “GA014“, 91, “GA011“, 66, “GA017“, 64, “GA018“, 64, “GA016“, 72;int i;FILE *out;fun(s);printf(“The data after sorted:/n“);for(i=0;iN; i+)if(i)%4=0)printf(“/n“);printf(“%s%4d“, si. num, si.s);printf(“/n“);(分数:40.00)_全国计算机等级考试二级 C 语言机试真题 2009 年 3 月答案解析(总分:100.00,做题时间:90 分钟)一、程序填空题(总题数
6、:1,分数:30.00)1.请补充 fun 函数,该函数的功能是:按0到9统计一个字符串中的奇数数字字符各自出现的次数,结果保存在数组 num 中。注意:不能使用字符串库函数。例如,输入“x=1123.456+0.909*bc”,结果为:1=2,3=1,5=1,7=0,9=2。注意 部分源程序给出如下。请勿改动主函数 main 和其他函数中的任何内容,仅在函数 fun 的横线上填入所编写的若干表达式或语句。试题源程序#includeconio.h#includestdio.h#define N 20fun(char*tt, int num)int i, j;int bb10;char *p=t
7、t;for(i=0;i10; i+)numi=0;bbi=0;while( (1) )if(*p=0*p=9)(2) ;p+;for(i=i, J=0; i10; i=i+2, j+)(3) ;main()char strN;int num10, k;cirscr();printf(“/nplease enter a string:“);gets(str);printf(“/n*The original string*/n“);puts(str);fun(str, num);printf(“/n*The number of letter*/n”);for(k=0; k5; k+)printf(
8、“/n“);printf(“%d=%d “, 2*k+1, humk);printf(“/n“);return;(分数:30.00)填空项 1:_ (正确答案:1 *D2 bb*p-0+3 numj=bbi)解析:解析 本题的设计思路是:先把数组 num 的各元素清 0;遍历字符串,利用数字字符在ASCAII 码中的连续规律,使用(数字字符-0)作为数组的下标,个数作为数组元素的值。填空 1:此处应该是使用临时指针 p 遍历字符串 str,所以应填*p。填空 2:因为 10 个数字字符是连续的,将它们和0做差运算刚好构成数组的下标。所以此处应该填bb*p-0+。填空 3:最后要把奇数数字出现的
9、次数赋给数组 num 保存。所以此处应填 numj=bbi。二、程序修改(总题数:1,分数:30.00)2.给定程序中函数 fun 的功能是:根据整型形参 m,计算如下公式的值。(分数:30.00)_正确答案:(1)错误:for(i=2; im; i+)正确:for(i=2; i=m; i+)(2)错误:y+=1/(i*i)正确:y+=1./(i*i)错误 2:在除法运算中,如果除数和被除数都是整数,所以所除结果也是整数,因此应改为 y+=1./(i*i)。)解析:解析 错误 1:由 C 语言的基础知识可以知道,使用 for 循环计算公式,必须计算到 m,所以应改为 for(i=2;i=m;
10、i+)。三、程序设计(总题数:1,分数:40.00)3.学生的记录由学号和成绩组成,N 名学生的数据已在主函数中放入结构体数组 s 中,请编写函数 fun,它的功能是:按分数的高低排列学生的记录,高分在前。注意 部分源程序给出如下。请勿改动主函数 main 和其他函数中的任何内容,仅在函数 fun 的花括号中填入所编写的若干语句。试题源程序#includestdio.h#define N 16typedef structchar numi0;int s;STREC;int fun(STREC a)main()STREC sN=“GA005“, 85, “GA003“, 76, “GA002“,
11、 69, “GA004“, 85, “GA001“, 91, “GA007“, 72, “GA008“, 64, “GA006“, 87, “GA015“, 85, “GA013“, 91, “GA012“, 64, “GA014“, 91, “GA011“, 66, “GA017“, 64, “GA018“, 64, “GA016“, 72;int i;FILE *out;fun(s);printf(“The data after sorted:/n“);for(i=0;iN; i+)if(i)%4=0)printf(“/n“);printf(“%s%4d“, si. num, si.s);printf(“/n“);(分数:40.00)_正确答案:(#includestdi0.h#define N 16typedef structchar num10;int s;STREC;int fun(STREC a)STREC tmp;int i, j;for(i=0; iN; i+)for(j=i+1; jN; J+)if(ai.saj.S)tmp=ai;ai=aj;aj=tmp;)解析:解析 本题较简单,主要是按结构体中的成绩 s 进行降序排列,其结果仍存入当前结构体中。