冲刺必看!名师讲解二级C真题之程序题

技术与开发

很多考生都害怕上机考试,担心那些程序题(包括改错以及编程)会很难,心中没有底。如果你也是他们中的一员,不妨听听专家是如何求解的(全部程序题的解析请到http://www.cpcw.com/bzsoft下载),快速掌握程序题的解法。

改错题:下列给定程序中,函数fun()的功能是从n个学生的成绩中统计出低于平均分的学生人数,此人数由函数值返回,平均分存放在形参aver所指的存储单元中。例如输入8名学生的成绩:80.5 60 72 90.5 98 51.5 88 64,则低于平均分的学生人数为4(平均分为75.5625)。请改正程序中的错误,使它能得出正确的结果。注意:不要改动main( )函数,不得增加或者删行,也不得改变程序的结构。

#include

#include

#include

#define N 20

int fun(float *s, int n, float *aver)

{

float ave ,t=0.0;

int count=0,k,i;

for(k=0;k

/*********found********/

t=s[k];

ave=t/n;

for(i=0;i

if (s[i]

/********found*******/

*aver=&ave;

return count;

}

void main( )

{ float s[30],aver;

int m,i;

system("cls");

printf("\n please enter m:");

scanf("%d",&m);

printf("\n please enter %d mark:\n",m);

for(i=0;i

printf("\n the number of students: %d\n",fun(s,m,&aver));

printf("ave=%f\n",aver);

}

本题难度:中等

涉及知识:循环语句与条件选择语句的结合使用

专家解析:本题是上机常见的数值操作类题型,主要考查数组运用及指针编程。根据题目要求,可利用循环语句,累计计算n个学生的总分;求得平均成绩后,再利用循环语句与条件选择语句。

若小于平均值,则将该值存放于aver存储单元中。错误1:循环叠加出错,没有实现累加效果;错误2:语法错误,正确语法为:*指针变量=值(不能将地址存入指针变量所指向的地址中)。

编程题:学生的记录由学号和成绩组成,n名学生的数据已在主函数中放入结构体数组s中,请编写函数fun( ),它的功能是:把低于平均分的学生数据放在b所指的数组中,低于平均分的学生人数通过形参n传回,平均分通过函数值返回。注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

#include

#define N 8

typedef struct

{

char num[10];

double s;

}STREC;

double fun(STREC *a, STREC *b, int *n)

{

}

void main( )

{

STREC s[N]={{"GA05",85},{"GA03",76},{"GA02",69},{"GA04",85},{"GA01",91},{"GA07",72},{"GA08",64},{"GA06",87}};

STREC h[N];

int i,n;

double ave;

ave=fun(s,h,&n);

printf("the %d student data which is lower than %7.3f:\n",n,ave);

for(i=0;i

/*输出成绩低于平均值的学生记录*/

printf("%s %4.1f\n",h[i].num, h[i].s);

printf("\n");

}

本题难度:难

涉及知识:结构体应用

专家解析:本题是上机编程中最为典型的考题,也是考题中考生最为疏忽的知识点(结构体应用)。答题时,考生首先要注意所编写函数的形参与主函数实参之间传递数据内容,只有清楚每个参数数据表示含义,才能进行下一步编程。

其次,找出答题的主干(本题主干为求和、求平均后判断),故而可以得到二个循环体(第一个循环——求和,第二个循环——求出低于平均分的值并存入指定的结构体数组。最后,注意函数的返回值要求。特别注意,答题结束后,一定要运行所编写的程序,若没有运行,则系统不予给分。

改错题答案:

(1)错误:t=s[k]

正确为:t+=s[k]

(2)错误:*aver=&ave;

正确为:*aver=ave;

编程题答案:

double fun(STREC *a, STREC *b, int *n)

{

int i,j=0;

double av=0.0;

for(i=0;i

av=av+a[i].s;

av=av/N;

for(i=0;i

if(a[i].s

*n=j;

return av;

}

总结

2007年9月的二级C语言考试名师点评结束了,大家是不是觉得受益匪浅?从这次考试我们可以看出指针的考核要求非常高,而且多个知识点的融合题也多了,大家在这次4月的考试复习中要注意这两点。