计算机二级C语言上机真题(52)【附详解】
【真题1】 给定程序BLANK1.C 是建立一个带头结点的单向链表,并用随机函数为
各结点赋值。函数fun 的功能是将单向链表结点(不包括头结点)数据域为偶数的值
累加起来,并且作为函数值返回。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确结果。
#include < stdio.h >#include < stdlib.h >typedef struct aa
{ int data; struct aa *next; }NODE;
int fun(NODE *h)
{ int sum = 0 ;
/***********found**********/
___1___ *p;
/***********found**********/
p=___2___;
while(p)
{ if(p- >data%2==0)
sum +=p- >data;
/***********found**********/
p=___3___;
}
return sum;
}
NODE *creatlink(int n)
{ NODE *h, *p, *s, *q;
int i, x;
h=p=(NODE *)malloc(sizeof(NODE));
for(i=1; i< =n; i++)
{ s=(NODE *)malloc(sizeof(NODE));
s- >data=rand()%16;
s- >next=p- >next;
p- >next=s;
p=p- >next;
}
p- >next=NULL;
return h;
}
outlink(NODE *h, FILE *pf)
{ NODE *p;
p = h- >next;
fprintf(pf ,"\n\nTHE LIST :\n\n HEAD " );
while(p)
{ fprintf(pf ,"- >%d ",p- >data ); p=p- >next; }
fprintf (pf,"\n");
}
outresult(int s, FILE *pf)
{ fprintf(pf,"\nThe sum of even numbers : %d\n",s);}
main()
{ NODE *head; int even;
head=creatlink(12);
head- >data=9000;
outlink(head , stdout);
even=fun(head);
printf("\nThe result :\n"); outresult(even, stdout);
}
(2011年2月)
答案:1:NODE 2:h- >next 3:p- >next
【真题2】 下列给定程序中,函数fun()的功能是:从n 个学生的成绩中统计出高
于平均分的学生人数,人数由函数值返回,平均分存放在形参aver 所指的存储单元
中。例如输入8 名学生的成绩:
85 65.5 69 95.5 87 55 62.5 75
则高于平均分的学生人数为4(平均分为74.312500)。
请改正程序中的错误,使它能得到正确结果。
注意:不要改动main 函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include < stdio.h >#include < conio.h >#define N 20
int fun(float *s, int n,float *aver)
{/**********************found***********************/
int ave ,t=0;
int count=0,k,i;
for(k=0;k< n;k++)
t+=s[k];
ave=t/n;
for(i=0;i< n;i++)
/**********************found***********************/
if(s[i]< ave)
count++;
/**********************found***********************/
aver=ave;
return count;
}
main()
{ float s[30],aver;
int m,i;
clrscr();
printf("\nPlease enter m: ");
scanf("%d",&m);
printf("\nPlease enter %d mark :\n",m);
for(i=0;i< m;i++)
scanf("%f",s+i);
printf("\nThe number of students :%d\n",fun(s,m,&aver));
printf("Ave=%f\n",aver);
}
(2011年2月)
解析: (1)错误:int ave ,t=0; 正确:float ave ,t=0.0;
(2)错误:if(s[i]< ave) 正确:if(s[i] >ave)
(3)错误:aver=ave; 正确:*aver=ave;
错误1:ave和t分别用来存放成绩的平均值和总分,应为实型数。
错误2:根据题意,找出高于平均分的数,所以此处的关系运算符应为" >"
错误3:aver 是指针,而ave是一个数,不能将一个数赋值给一个指针,而要
用符号'*'。
【真题3】 学生的记录由学号和成绩组成,N 名学生的数据已在主函数中放入结构
体数组s 中,请编写函数fun(),它的功能是:按分数的高低排列学生的记录,低分
在前。
注意:部分源程序给出如下。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入所编
写的若干语句。
试题程序:
#include < stdio.h >#define N 16
typedef struct
{ char num[10];
int s ;
}STREC;
int fun (STREC a[])
{……}
main ()
{ STREC
s[N]={{ "GA005",88},{"GA003",64},{"GA002",77},{"GA004",89},
{"GA001",54},{"GA007",72},{"GA008",72},{"GA006",65},
{"GA015",83},{"GA013",95},{"GA012",55},{"GA014",68},
{"GA011",78},{"GA017",53},{"GA018",92},{"GA016",82}};
int i;
FILE *out;
fun(s);
printf("The data after sorted :\n");
for (i=0; i< N; i++)
{
if((i)%4==0) /*每行输出4 个学生记录*/
printf("\n");
printf("%s %4d ",s[i].num,s[i].s);
}
printf("\n");
out=fopen("out21.dat", "w");
for(i=0; i< N; i++);
{
if((i)%4==0&&i)
fprintf(out, "\n");
fprintf(out, "%4d",s[i].s);
}
fprintf(out, "\n");
fclose(out);
}
(2011年2月)
解析: int fun (STREC a[])
{ int i,j;
STREC t;
for(i=1;i< N;i++) /*用冒泡法进行排序,进行N-1次比较*/
for(j=0;j< N-1;j++) /*在每一次比较中要进行N-1 次两两比较*/
if(a[j].s >a[j+1].s) /*按分数的高低排列学生的记录,低分在前*/
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
【解析】冒泡法算法思路:如果有N 个数,则要进行N-1 次比较,在每一次比
较中要进行N-1 次两两比较(这种算法较好理解但不是最精的)。所谓两两比较
就是从头到尾依次将相邻两个数进行比较并将其中大的数放在前或在后(若要求
从小到大排序,则大的数要放在后。反之则对调),即两两比较后这两个数要形
成题中所要求的顺序。由于总是从头到尾进行比较,所以第1 次比较结束后,
最大(或最小)数肯定在最后,第2 次比较结束后,次最大(或次最小)数肯定在倒
数的第2 个数,依次类推,所以进行第一次比较时必须比较到最后一个数,而
进行第2 次比较时只要比较到倒数的第2个数即可,所以进行第i 次比较时只
需比较N-i 次即可(这种算法较难理解,但它是最好的)。
各结点赋值。函数fun 的功能是将单向链表结点(不包括头结点)数据域为偶数的值
累加起来,并且作为函数值返回。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确结果。
#include < stdio.h >#include < stdlib.h >typedef struct aa
{ int data; struct aa *next; }NODE;
int fun(NODE *h)
{ int sum = 0 ;
/***********found**********/
___1___ *p;
/***********found**********/
p=___2___;
while(p)
{ if(p- >data%2==0)
sum +=p- >data;
/***********found**********/
p=___3___;
}
return sum;
}
NODE *creatlink(int n)
{ NODE *h, *p, *s, *q;
int i, x;
h=p=(NODE *)malloc(sizeof(NODE));
for(i=1; i< =n; i++)
{ s=(NODE *)malloc(sizeof(NODE));
s- >data=rand()%16;
s- >next=p- >next;
p- >next=s;
p=p- >next;
}
p- >next=NULL;
return h;
}
outlink(NODE *h, FILE *pf)
{ NODE *p;
p = h- >next;
fprintf(pf ,"\n\nTHE LIST :\n\n HEAD " );
while(p)
{ fprintf(pf ,"- >%d ",p- >data ); p=p- >next; }
fprintf (pf,"\n");
}
outresult(int s, FILE *pf)
{ fprintf(pf,"\nThe sum of even numbers : %d\n",s);}
main()
{ NODE *head; int even;
head=creatlink(12);
head- >data=9000;
outlink(head , stdout);
even=fun(head);
printf("\nThe result :\n"); outresult(even, stdout);
}
(2011年2月)
答案:1:NODE 2:h- >next 3:p- >next
【真题2】 下列给定程序中,函数fun()的功能是:从n 个学生的成绩中统计出高
于平均分的学生人数,人数由函数值返回,平均分存放在形参aver 所指的存储单元
中。例如输入8 名学生的成绩:
85 65.5 69 95.5 87 55 62.5 75
则高于平均分的学生人数为4(平均分为74.312500)。
请改正程序中的错误,使它能得到正确结果。
注意:不要改动main 函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include < stdio.h >#include < conio.h >#define N 20
int fun(float *s, int n,float *aver)
{/**********************found***********************/
int ave ,t=0;
int count=0,k,i;
for(k=0;k< n;k++)
t+=s[k];
ave=t/n;
for(i=0;i< n;i++)
/**********************found***********************/
if(s[i]< ave)
count++;
/**********************found***********************/
aver=ave;
return count;
}
main()
{ float s[30],aver;
int m,i;
clrscr();
printf("\nPlease enter m: ");
scanf("%d",&m);
printf("\nPlease enter %d mark :\n",m);
for(i=0;i< m;i++)
scanf("%f",s+i);
printf("\nThe number of students :%d\n",fun(s,m,&aver));
printf("Ave=%f\n",aver);
}
(2011年2月)
解析: (1)错误:int ave ,t=0; 正确:float ave ,t=0.0;
(2)错误:if(s[i]< ave) 正确:if(s[i] >ave)
(3)错误:aver=ave; 正确:*aver=ave;
错误1:ave和t分别用来存放成绩的平均值和总分,应为实型数。
错误2:根据题意,找出高于平均分的数,所以此处的关系运算符应为" >"
错误3:aver 是指针,而ave是一个数,不能将一个数赋值给一个指针,而要
用符号'*'。
【真题3】 学生的记录由学号和成绩组成,N 名学生的数据已在主函数中放入结构
体数组s 中,请编写函数fun(),它的功能是:按分数的高低排列学生的记录,低分
在前。
注意:部分源程序给出如下。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入所编
写的若干语句。
试题程序:
#include < stdio.h >#define N 16
typedef struct
{ char num[10];
int s ;
}STREC;
int fun (STREC a[])
{……}
main ()
{ STREC
s[N]={{ "GA005",88},{"GA003",64},{"GA002",77},{"GA004",89},
{"GA001",54},{"GA007",72},{"GA008",72},{"GA006",65},
{"GA015",83},{"GA013",95},{"GA012",55},{"GA014",68},
{"GA011",78},{"GA017",53},{"GA018",92},{"GA016",82}};
int i;
FILE *out;
fun(s);
printf("The data after sorted :\n");
for (i=0; i< N; i++)
{
if((i)%4==0) /*每行输出4 个学生记录*/
printf("\n");
printf("%s %4d ",s[i].num,s[i].s);
}
printf("\n");
out=fopen("out21.dat", "w");
for(i=0; i< N; i++);
{
if((i)%4==0&&i)
fprintf(out, "\n");
fprintf(out, "%4d",s[i].s);
}
fprintf(out, "\n");
fclose(out);
}
(2011年2月)
解析: int fun (STREC a[])
{ int i,j;
STREC t;
for(i=1;i< N;i++) /*用冒泡法进行排序,进行N-1次比较*/
for(j=0;j< N-1;j++) /*在每一次比较中要进行N-1 次两两比较*/
if(a[j].s >a[j+1].s) /*按分数的高低排列学生的记录,低分在前*/
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
【解析】冒泡法算法思路:如果有N 个数,则要进行N-1 次比较,在每一次比
较中要进行N-1 次两两比较(这种算法较好理解但不是最精的)。所谓两两比较
就是从头到尾依次将相邻两个数进行比较并将其中大的数放在前或在后(若要求
从小到大排序,则大的数要放在后。反之则对调),即两两比较后这两个数要形
成题中所要求的顺序。由于总是从头到尾进行比较,所以第1 次比较结束后,
最大(或最小)数肯定在最后,第2 次比较结束后,次最大(或次最小)数肯定在倒
数的第2 个数,依次类推,所以进行第一次比较时必须比较到最后一个数,而
进行第2 次比较时只要比较到倒数的第2个数即可,所以进行第i 次比较时只
需比较N-i 次即可(这种算法较难理解,但它是最好的)。