计算机二级C语言上机真题(54)【附详解】
【真题1】 函数fun 的功能是:将形参a所指数组中的前半部分元素中的值和后半
部分元素中的值对换。形参n 中存放数组中数据的个数,若n 为奇数,则中间的元
素不动。
例如:若a 所指数组中的数据依次为:1、2、3、4、5、6、7、8、9,则调换后
为:6、7、8、9、5、1、2、3、4。
#include < stdio.h >#define N 9
void fun(int a[], int n)
{ int i, t, p;
/**********found**********/
p = (n%2==0)?n/2:n/2+___1___;
for (i=0; i< n/2; i++)
{
t=a[i];
/**********found**********/
a[i] = a[p+___2___];
/**********found**********/
___3___ = t;
}
}
main()
{ int b[N]={1,2,3,4,5,6,7,8,9}, i;
printf("\nThe original data :\n");
for (i=0; i< N; i++) printf("%4d ", b[i]);
printf("\n");
fun(b, N);
printf("\nThe data after moving :\n");
for (i=0; i< N; i++) printf("%4d ", b[i]);
printf("\n");
}
(2011年2月)
解析: 本题的考核点是c 语言中循环语句的使用。
解题思路:本程序先通过n%2 是否为0 判断数组中元素的个数是奇数还是偶
数,然后再通过"t=a[i];a[i] = a[p+i];a[p+i] = t;"三个语句对换数组中的前
半部分元素中的值和后半部分元素中的值。
答案:【1】1 【2】i 【3】i
【真题2】 给定程序modi.c 中,函数fun 的功能是:将十进制正整数m 转换成
k(2≤k≤9)进制数,并按位输出。
例如,若输入8 和2,则应输出1000(即十进制数8 转换成二进制表示是
1000)。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main 函数,
#include < conio.h >#include < stdio.h >void fun(int m,int k)
{ int aa[20],i;
for (i=0;m;i++)
{/************found************/
aa[i]=m/k;
m/=k;
}
/************found************/
for(;i;i--)
printf("%d",aa[i]);
}
main()
{ int b,n;
clrscr();
printf("\nPlease enter a number and a base:\n");
scanf("%d %d",&n,&b);
fun(n,b);
printf("\n");
}
(2011年2月)
解析: 本题的考核点是数制的转换。
k进制数有以下特点:
1.有0 到k-1共k个数码。
2.逢k进1,借1 当k。
k进制数某一位上的数码实际上代表该数码乘上该位上的权,如十进制数12,
1 实际代表1*10。原程序给出的fun 函数中,第一个for 循环用来将十进制的
整型数据m转换为k进制数据,并将结果按从低位到高位的顺序保存在数组
aa中。在for 循环之后,i 即为转换成的k进制数的位数,所以根据题义要求,
第一处应改为"aa[i]=m%k;"或相同作用的语句。
第二个错误处为:从后往前打印存有i个数的数组中的值,其下标应该为[i-1]
到[0]。所以"for(;i;i--)"应当改为" for(i=i-1;i >=0;i--)"。
【真题3】 学生的记录由学号和成绩组成,N 名学生的数据已在主函数中放入结构
体数组s 中,请编写函数fun,它的功能是:把分数最高的学生数据放在h 所指的数
组中,注意:分数最高的学生可能不止一个,函数返回分数最高的学生人数。
注意:部分源程序存在文件prog.c 中。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
本题的考核点是找出分数最高的学生数据的算法。
解题思路:先从所有的学生数据中找出最高的分值,然后将所有学生分数中与最高分
值相等的学生数据放到另一数组中,最后统计分数最高的学生人数并返回。
#include < stdio.h >#define N 16
typedef struct
{ char num[10];
int s;
} STREC;
int fun(STREC *a,STREC *b)
{……}
main()
{
STREC
s[N]={{"GA05",85},{"GA03",76},{"GA02",69},{"GA04",85},{"GA01",9
1},{"GA07",72},
{"GA08",64},{"GA06",87},{"GA015",85},{"GA013",91},{"GA012",64},{
"GA014",91},{"GA011",91},{"GA017",64},{"GA018",64},{"GA016",72}
};
STREC h[N];
int i,n;FILE *out;
n=fun(s,h);
printf("The %d highest score:\n",n);
for(i=0;i< n;i++)
printf("%s %4d\n",h[i].num,h[i].s);
printf("\n");
out=fopen("out15.dat","w");
fprintf(out,"%d\n",n);
for (i=0;i< n;i++)
fprintf(out,"%s %4d\n",h[i].num,h[i].s);
fclose(out);
}
(2011年2月)
解析: 本评析仅供参考。
int fun(STREC *a,STREC *b)
{int i,j=0,max,k,f=0;
max=(*a).s;
for (i=1;i< N;i++)
if (a[i].s >max) max=a[i].s; /*从所有的学生数据中找出最高的分值*/
for (i=0;i< N;i++)
if (a[i].s==max)
{ f++; /*统计分数最高的学生人数*/
for (k=0;k< 10;k++)
b[j].num[k]=a[i].num[k]; /*将所有学生分数中与最高分值相等的学生数据
放到另一数组b中*/
b[j].s=a[i].s;
j++;
}
return(f); /*返回分数最高的学生人数*/
}
部分元素中的值对换。形参n 中存放数组中数据的个数,若n 为奇数,则中间的元
素不动。
例如:若a 所指数组中的数据依次为:1、2、3、4、5、6、7、8、9,则调换后
为:6、7、8、9、5、1、2、3、4。
#include < stdio.h >#define N 9
void fun(int a[], int n)
{ int i, t, p;
/**********found**********/
p = (n%2==0)?n/2:n/2+___1___;
for (i=0; i< n/2; i++)
{
t=a[i];
/**********found**********/
a[i] = a[p+___2___];
/**********found**********/
___3___ = t;
}
}
main()
{ int b[N]={1,2,3,4,5,6,7,8,9}, i;
printf("\nThe original data :\n");
for (i=0; i< N; i++) printf("%4d ", b[i]);
printf("\n");
fun(b, N);
printf("\nThe data after moving :\n");
for (i=0; i< N; i++) printf("%4d ", b[i]);
printf("\n");
}
(2011年2月)
解析: 本题的考核点是c 语言中循环语句的使用。
解题思路:本程序先通过n%2 是否为0 判断数组中元素的个数是奇数还是偶
数,然后再通过"t=a[i];a[i] = a[p+i];a[p+i] = t;"三个语句对换数组中的前
半部分元素中的值和后半部分元素中的值。
答案:【1】1 【2】i 【3】i
【真题2】 给定程序modi.c 中,函数fun 的功能是:将十进制正整数m 转换成
k(2≤k≤9)进制数,并按位输出。
例如,若输入8 和2,则应输出1000(即十进制数8 转换成二进制表示是
1000)。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main 函数,
#include < conio.h >#include < stdio.h >void fun(int m,int k)
{ int aa[20],i;
for (i=0;m;i++)
{/************found************/
aa[i]=m/k;
m/=k;
}
/************found************/
for(;i;i--)
printf("%d",aa[i]);
}
main()
{ int b,n;
clrscr();
printf("\nPlease enter a number and a base:\n");
scanf("%d %d",&n,&b);
fun(n,b);
printf("\n");
}
(2011年2月)
解析: 本题的考核点是数制的转换。
k进制数有以下特点:
1.有0 到k-1共k个数码。
2.逢k进1,借1 当k。
k进制数某一位上的数码实际上代表该数码乘上该位上的权,如十进制数12,
1 实际代表1*10。原程序给出的fun 函数中,第一个for 循环用来将十进制的
整型数据m转换为k进制数据,并将结果按从低位到高位的顺序保存在数组
aa中。在for 循环之后,i 即为转换成的k进制数的位数,所以根据题义要求,
第一处应改为"aa[i]=m%k;"或相同作用的语句。
第二个错误处为:从后往前打印存有i个数的数组中的值,其下标应该为[i-1]
到[0]。所以"for(;i;i--)"应当改为" for(i=i-1;i >=0;i--)"。
【真题3】 学生的记录由学号和成绩组成,N 名学生的数据已在主函数中放入结构
体数组s 中,请编写函数fun,它的功能是:把分数最高的学生数据放在h 所指的数
组中,注意:分数最高的学生可能不止一个,函数返回分数最高的学生人数。
注意:部分源程序存在文件prog.c 中。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
本题的考核点是找出分数最高的学生数据的算法。
解题思路:先从所有的学生数据中找出最高的分值,然后将所有学生分数中与最高分
值相等的学生数据放到另一数组中,最后统计分数最高的学生人数并返回。
#include < stdio.h >#define N 16
typedef struct
{ char num[10];
int s;
} STREC;
int fun(STREC *a,STREC *b)
{……}
main()
{
STREC
s[N]={{"GA05",85},{"GA03",76},{"GA02",69},{"GA04",85},{"GA01",9
1},{"GA07",72},
{"GA08",64},{"GA06",87},{"GA015",85},{"GA013",91},{"GA012",64},{
"GA014",91},{"GA011",91},{"GA017",64},{"GA018",64},{"GA016",72}
};
STREC h[N];
int i,n;FILE *out;
n=fun(s,h);
printf("The %d highest score:\n",n);
for(i=0;i< n;i++)
printf("%s %4d\n",h[i].num,h[i].s);
printf("\n");
out=fopen("out15.dat","w");
fprintf(out,"%d\n",n);
for (i=0;i< n;i++)
fprintf(out,"%s %4d\n",h[i].num,h[i].s);
fclose(out);
}
(2011年2月)
解析: 本评析仅供参考。
int fun(STREC *a,STREC *b)
{int i,j=0,max,k,f=0;
max=(*a).s;
for (i=1;i< N;i++)
if (a[i].s >max) max=a[i].s; /*从所有的学生数据中找出最高的分值*/
for (i=0;i< N;i++)
if (a[i].s==max)
{ f++; /*统计分数最高的学生人数*/
for (k=0;k< 10;k++)
b[j].num[k]=a[i].num[k]; /*将所有学生分数中与最高分值相等的学生数据
放到另一数组b中*/
b[j].s=a[i].s;
j++;
}
return(f); /*返回分数最高的学生人数*/
}