计算机二级C语言上机真题(78)【附详解】
【真题1】 下列给定程序中,函数fun()的功能是:对N 名学生的学习成绩,按从
高到低的顺序找出前m(m≤10)名学生来,并将这些学生数据存放在一个动态分配的
连续存储区中,此存储区的首地址作为函数值返回。
试题程序:
#include < conio.h >#include < string.h >#include < stdio.h >#include
< malloc.h >#define N 10
typedef struct ss
{ char num[10];
int s;
} STU;
__1___ *fun(STU a[], int m)
{ STU b[N],*t;
int i, j,k;
t=calloc(m,__2__);
for(i=0;i< N;i++) b[i]=a[i];
for(k=0;k< m;k++)
{ for (i=j=0;i< N;i++)
if(b[i].s >b[j].s)__3__;
t[k]=b[j];
t[k].s=b[j].s;
b[j].s=0;
}
return t;
}
outresult(STU a[],FILE *pf)
{ int i;
for(i=0;i< N;i++)
fprintf(pf, "No=%s Mark=%d\n ",a[i].num, a[i].s);
fprintf(pf, "\n\n ");
}
main()
{ STU a[N]={{ "A01 ",81},{ "A02 ",89},{ "A03 ",66},{ "A04
",87},{ "A05 ",77},
{ "A06 ",90},{ "A07 ",79},{ "A08 ",61},{ "A09 ",80},{ "A10 ",71}};
STU *pOrder;
int i, m;
printf("*****THE RESULT*****\n");
outresult(a,stdout);
printf("\nGive the number of the students who have better score: ");
scanf("%d",&m);
while(m >10)
{ printf("\nGive the number of the students who have better score: ");
scanf("%d",&m);
}
pOrder=fun(a,m);
printf("***** THE RESULT*****\n");
printf("The top :\n");
for(i=0;i< m;i++)
printf("%s %d\n",pOrder[i].num, pOrder[i].s);
free(pOrder);
}
(2011年2月)
解析: 填空1:根据题目的意思,这里应该是子函数的声明,很明显这里需要
填写返回值类型,题目中已经给出了是指针型的,根据后面返回的参数t可以判
断这里应该是结构STU 类型。
填空2:根据题目的意思,这里是动态申请空间,calloc 是用于分配内存空间的
函数,其调用形式为 (类型说明符*)calloc(n,size),功能:在内存动态存储区
中分配n 块长度为"size"字节的连续区域,函数的返回值为该区域的首地址,
(类型说明符*)用于强制类型转换,calloc 函数与malloc 函数的区别仅在于一
次可以分配n 块区域。例如: ps=(struet stu*) calloc(2,sizeof (struct
stu));,其中的sizeof(struct stu)是求stu 的结构长度。因此该语句的意思
是:按stu 的长度分配两块连续区域,强制转换为stu 类型,并把其首地址赋
予指针变量ps。
填空3:由算法可以看出,这里应该是从大到小进行排序,所以一旦发现有比第
j个元素还大的某个i,就应该把i 作为当前最大的元素,直到循环结束,这种算
法考生应该掌握。
答案:【1】STU 【2】sizeof(STU) 【3】j=i
【真题2】 给定程序modi.c 中函数fun的功能是:计算n 的5 次方的值(规定n
的值大于2、小于8),通过形参指针传回主函数。并计算该值的个位、十位、百位
上数字之和作为函数值返回。例如,7 的5 次方是16807,其低3 位数的和值是
15。
请改正函数fun 中指定部位的错误,使它能得出正确的结果。
注意:不要改动main 函数,
#include < stdio.h >#include < math.h >int fun( int n ,int *value )
{ int d,s,i;
/**************found**************/
d=0; s=1;
for(i=1; i< =5; i++) d=d*n;
*value=d;
for(i=1; i< =3; i++)
{ s=s+d%10;
/**************found**************/
s=s/10;
}
return s;
}
main()
{ int n, sum, v;
do
{ printf("\nEnter n( 2< n< 8): ");scanf("%d",&n); }
while(n< =2||n >=8);
sum=fun( n,&v );
printf("\n\nThe result:\n value=%d sum=%d\n\n",v,sum);
}
(2011年2月)
解析: 本题的考核点是C语言中for循环的使用。
解题思路:程序中第一个for 循环的作用是计算n的5 次方,计算结果存放于
变量d中,第二个for 循环语句实现了计算变量d中个位、十位、百位上数字
之和,结果存放于变量s 中,并返回s。
本题中的第一个错误:程序中d和s初始化错误,导致d和s 的值为0,所以
应该将程序中的语句"d=0; s=1;"改为"d=1;s=0;"或相同作用的语句。
本题中的第二个错误:程序要实现的是计算变量d个位、十位和百位上的数
值,所以应该将程序中的语句" s=s/10;"改为"d=d/10;"或相同作用的语句。
【真题3】 编写函数fun,函数的功能是:从字符串中删除指定的字符。同一字母的
大、小写按不同字符处理。若程序执行时,输入字符串为:turbo c and borland
c++,从键盘上输入字符:n,则输出后变为:turbo c ad borlad c++,如果输入
的字符字符串中不存在,则字符串照原样输出。
注意:部分源程序存在文件prog.c 中。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < stdio.h >#include < conio.h >int fun(char s[],int c)
{……}
main()
{ static char str[]="turbo c and borland c++";
char ch;
clrscr();
printf("原始字符串:%s\n",str);
printf("输入一个字符:");
scanf("%c",&ch);
fun(str,ch);
printf("str[]=%s\n",str);
}
(2011年2月)
解析: 本题的考核点是从字符串中删除指定字符的算法。
解题思路:从字符串中的第一个字符开始,依次与要删除的字符进行比较,若
相同,则将它之后的字符逐个向前移动一个位置,即将该字符删除,直到字符
串尾,将所有与指定字符相同的字符删除。
本评析仅供参考。
int fun(char s[],int c)
{ int i=0,j;
while (s[i]!='\0') /*判断s[i]是否为句末结束符*/
{ if (s[i]==c) /*判断s[i]是否为指定要删除的字符c*/
{j=i+1;
while (s[j-1]!='\0')/*将c 字符后的所有字符顺序向前移一位*/
{s[j-1]=s[j];j=j+1;}
}
i=i+1;
}
}
高到低的顺序找出前m(m≤10)名学生来,并将这些学生数据存放在一个动态分配的
连续存储区中,此存储区的首地址作为函数值返回。
试题程序:
#include < conio.h >#include < string.h >#include < stdio.h >#include
< malloc.h >#define N 10
typedef struct ss
{ char num[10];
int s;
} STU;
__1___ *fun(STU a[], int m)
{ STU b[N],*t;
int i, j,k;
t=calloc(m,__2__);
for(i=0;i< N;i++) b[i]=a[i];
for(k=0;k< m;k++)
{ for (i=j=0;i< N;i++)
if(b[i].s >b[j].s)__3__;
t[k]=b[j];
t[k].s=b[j].s;
b[j].s=0;
}
return t;
}
outresult(STU a[],FILE *pf)
{ int i;
for(i=0;i< N;i++)
fprintf(pf, "No=%s Mark=%d\n ",a[i].num, a[i].s);
fprintf(pf, "\n\n ");
}
main()
{ STU a[N]={{ "A01 ",81},{ "A02 ",89},{ "A03 ",66},{ "A04
",87},{ "A05 ",77},
{ "A06 ",90},{ "A07 ",79},{ "A08 ",61},{ "A09 ",80},{ "A10 ",71}};
STU *pOrder;
int i, m;
printf("*****THE RESULT*****\n");
outresult(a,stdout);
printf("\nGive the number of the students who have better score: ");
scanf("%d",&m);
while(m >10)
{ printf("\nGive the number of the students who have better score: ");
scanf("%d",&m);
}
pOrder=fun(a,m);
printf("***** THE RESULT*****\n");
printf("The top :\n");
for(i=0;i< m;i++)
printf("%s %d\n",pOrder[i].num, pOrder[i].s);
free(pOrder);
}
(2011年2月)
解析: 填空1:根据题目的意思,这里应该是子函数的声明,很明显这里需要
填写返回值类型,题目中已经给出了是指针型的,根据后面返回的参数t可以判
断这里应该是结构STU 类型。
填空2:根据题目的意思,这里是动态申请空间,calloc 是用于分配内存空间的
函数,其调用形式为 (类型说明符*)calloc(n,size),功能:在内存动态存储区
中分配n 块长度为"size"字节的连续区域,函数的返回值为该区域的首地址,
(类型说明符*)用于强制类型转换,calloc 函数与malloc 函数的区别仅在于一
次可以分配n 块区域。例如: ps=(struet stu*) calloc(2,sizeof (struct
stu));,其中的sizeof(struct stu)是求stu 的结构长度。因此该语句的意思
是:按stu 的长度分配两块连续区域,强制转换为stu 类型,并把其首地址赋
予指针变量ps。
填空3:由算法可以看出,这里应该是从大到小进行排序,所以一旦发现有比第
j个元素还大的某个i,就应该把i 作为当前最大的元素,直到循环结束,这种算
法考生应该掌握。
答案:【1】STU 【2】sizeof(STU) 【3】j=i
【真题2】 给定程序modi.c 中函数fun的功能是:计算n 的5 次方的值(规定n
的值大于2、小于8),通过形参指针传回主函数。并计算该值的个位、十位、百位
上数字之和作为函数值返回。例如,7 的5 次方是16807,其低3 位数的和值是
15。
请改正函数fun 中指定部位的错误,使它能得出正确的结果。
注意:不要改动main 函数,
#include < stdio.h >#include < math.h >int fun( int n ,int *value )
{ int d,s,i;
/**************found**************/
d=0; s=1;
for(i=1; i< =5; i++) d=d*n;
*value=d;
for(i=1; i< =3; i++)
{ s=s+d%10;
/**************found**************/
s=s/10;
}
return s;
}
main()
{ int n, sum, v;
do
{ printf("\nEnter n( 2< n< 8): ");scanf("%d",&n); }
while(n< =2||n >=8);
sum=fun( n,&v );
printf("\n\nThe result:\n value=%d sum=%d\n\n",v,sum);
}
(2011年2月)
解析: 本题的考核点是C语言中for循环的使用。
解题思路:程序中第一个for 循环的作用是计算n的5 次方,计算结果存放于
变量d中,第二个for 循环语句实现了计算变量d中个位、十位、百位上数字
之和,结果存放于变量s 中,并返回s。
本题中的第一个错误:程序中d和s初始化错误,导致d和s 的值为0,所以
应该将程序中的语句"d=0; s=1;"改为"d=1;s=0;"或相同作用的语句。
本题中的第二个错误:程序要实现的是计算变量d个位、十位和百位上的数
值,所以应该将程序中的语句" s=s/10;"改为"d=d/10;"或相同作用的语句。
【真题3】 编写函数fun,函数的功能是:从字符串中删除指定的字符。同一字母的
大、小写按不同字符处理。若程序执行时,输入字符串为:turbo c and borland
c++,从键盘上输入字符:n,则输出后变为:turbo c ad borlad c++,如果输入
的字符字符串中不存在,则字符串照原样输出。
注意:部分源程序存在文件prog.c 中。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < stdio.h >#include < conio.h >int fun(char s[],int c)
{……}
main()
{ static char str[]="turbo c and borland c++";
char ch;
clrscr();
printf("原始字符串:%s\n",str);
printf("输入一个字符:");
scanf("%c",&ch);
fun(str,ch);
printf("str[]=%s\n",str);
}
(2011年2月)
解析: 本题的考核点是从字符串中删除指定字符的算法。
解题思路:从字符串中的第一个字符开始,依次与要删除的字符进行比较,若
相同,则将它之后的字符逐个向前移动一个位置,即将该字符删除,直到字符
串尾,将所有与指定字符相同的字符删除。
本评析仅供参考。
int fun(char s[],int c)
{ int i=0,j;
while (s[i]!='\0') /*判断s[i]是否为句末结束符*/
{ if (s[i]==c) /*判断s[i]是否为指定要删除的字符c*/
{j=i+1;
while (s[j-1]!='\0')/*将c 字符后的所有字符顺序向前移一位*/
{s[j-1]=s[j];j=j+1;}
}
i=i+1;
}
}