计算机二级C语言上机真题(42)【附详解】
【真题1】 下列给定程序中,函数fun()的功能是:求出以下分数序列的前n 项之
和。
2/1,3/2,5/3,8/5,13/8,21/13,……
和值通过函数值返回main()函数。例如,若输入n=5,则应输出8.391667。
试题程序:
#include < conio.h >#include < stdio.h >double fun (int n)
{ int a=2,b=1,c, k;
double __1__;
for(k=1;k< =n;k++)
{s=s+1.0*a/b;
c=a; a+=__2__;b=c;
}
return(s);
}
main()
{ int n=5;
printf("\nThe value of function is: %1f\n",__3__);
}
(2011年2月)
解析: 填空1:根据题目的意思,这里应该是对变量s 的声明,注意到后面有
对s 的累加操作,所以声明之后一定要进行初始化,把s 赋值为0。
填空2:根据题目的意思,此处是循环求和,由数列可以容易的看出后一项的分
子是前一项分母与分子之和,即a=a+b或者像题目中那样a+=b。
填空3:由算法可以看出,此处是进行子函数调用。
答案:【1】s=0.0 【2】b 【3】fun(n)
【真题2】 给定程序modi.c 中,函数fun 的功能是:用选择法对数组中的n 个元
素按从小到大的顺序进行排序。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main 函数,
#include < stdio.h >#define N 20
void fun(int a[],int n)
{int i,j,t,p;
for (j=0;j< n-1;j++) {
/************found************/
p=j
for (i=j;i< n;i++)
if(a[i]< a[p])
/************found************/
p=j;
t=a[p];a[p]=a[j];a[j]=t;
}
}
main()
{int a[N]={9,6,8,3,-1},i,m=5;
printf("排序前的数据:");
for(i=0;i< m;i++) printf("%d",a[i]);printf("\n");
fun(a,m);
printf("排序后的数据:");
for (i=0;i< m;i++) printf("%d",a[i]);printf("\n");
}
(2011年2月)
解析: 选择法排序的思路是:通过一个整型变量指向数组中最小数所在的下
标,第一次循环找出最小的数,与第一个数的位置交换,第二次循环找出次小
的数,与第二个数的位置交换,以此类推,直至数组中的数由小到大排列。
本题中的第一个错误:C 语言中的命令语句应以分号作为分隔符,所以语句
"p=j"应改为"p=j;";
本题中的第二个错误:结合程序上下文,可知当a[i]中的数小于a[p]中的数
时,应使得下标i 赋给变量p,所以语句"p=j;"应改为"p=i;"。
【真题3】 请编写一个函数 void fun(char *tt, int pp[]),统计在tt 字符串中 'a'
到 'z' 26 个字母各自出现的次数,并由 pp 数组传回 main 函数。
运行时输入字符串:abcdefgabcdeabc 后,并且输出的结果应该是:
3 3 3 2 2 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
注意:部分源程序存在文件prog.c 中。
请勿改动主函数main 和其它函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < conio.h >#include < stdio.h >void fun(char *tt, int pp[])
{……}
main( )
{ char aa[1000] ;
int bb[26], k, n ;
clrscr() ;
printf( "\nPlease enter a char string:" ) ; scanf("%s", aa) ;
fun(aa, bb ) ;
for ( k = 0 ; k < 26 ; k++ ) printf ("%d ", bb[k]) ;
printf( "\n" ) ;
}
(2011年2月)
解析: 本题的考核点是统计字符串中各个字母出现的次数。
提示思路:
1、由于存放26 个小写字母的数组pp[]在主函数中未赋初值,所以在函数
fun()中第一步就是将其初始化,以保证程序运行安全;
2、建立循环,将每个字母的个数存放到pp[]数组相对应的元素中。
#include < conio.h >
#include < stdio.h >
/*本题采用的是字母的ASCII码值与数组pp下标的对应转换关系分别求出对
应字母的个数。第一个for()是给pp赋初值0,第二个for()用于控制在字符串
内从头到尾移动。由于字母'a'的ASCII码值为97而它的个数要放在pp[0]
中,而'a'-97的值正好为0,其它的依此类推。*/
void fun(char *tt,int pp[])
{ int i;
for(i=0;i< 26;i++)
pp[i]=0; /*for()循环用于给数组pp[]赋初值0*/
for(;*tt;tt++) /*for()循环用于控制在字符串内从头到尾移动*/
if(*tt< ='z'&&*tt >='a')
pp[*tt-97]++; /*统计字符串中各个字母出现的次数*/
}
和。
2/1,3/2,5/3,8/5,13/8,21/13,……
和值通过函数值返回main()函数。例如,若输入n=5,则应输出8.391667。
试题程序:
#include < conio.h >#include < stdio.h >double fun (int n)
{ int a=2,b=1,c, k;
double __1__;
for(k=1;k< =n;k++)
{s=s+1.0*a/b;
c=a; a+=__2__;b=c;
}
return(s);
}
main()
{ int n=5;
printf("\nThe value of function is: %1f\n",__3__);
}
(2011年2月)
解析: 填空1:根据题目的意思,这里应该是对变量s 的声明,注意到后面有
对s 的累加操作,所以声明之后一定要进行初始化,把s 赋值为0。
填空2:根据题目的意思,此处是循环求和,由数列可以容易的看出后一项的分
子是前一项分母与分子之和,即a=a+b或者像题目中那样a+=b。
填空3:由算法可以看出,此处是进行子函数调用。
答案:【1】s=0.0 【2】b 【3】fun(n)
【真题2】 给定程序modi.c 中,函数fun 的功能是:用选择法对数组中的n 个元
素按从小到大的顺序进行排序。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main 函数,
#include < stdio.h >#define N 20
void fun(int a[],int n)
{int i,j,t,p;
for (j=0;j< n-1;j++) {
/************found************/
p=j
for (i=j;i< n;i++)
if(a[i]< a[p])
/************found************/
p=j;
t=a[p];a[p]=a[j];a[j]=t;
}
}
main()
{int a[N]={9,6,8,3,-1},i,m=5;
printf("排序前的数据:");
for(i=0;i< m;i++) printf("%d",a[i]);printf("\n");
fun(a,m);
printf("排序后的数据:");
for (i=0;i< m;i++) printf("%d",a[i]);printf("\n");
}
(2011年2月)
解析: 选择法排序的思路是:通过一个整型变量指向数组中最小数所在的下
标,第一次循环找出最小的数,与第一个数的位置交换,第二次循环找出次小
的数,与第二个数的位置交换,以此类推,直至数组中的数由小到大排列。
本题中的第一个错误:C 语言中的命令语句应以分号作为分隔符,所以语句
"p=j"应改为"p=j;";
本题中的第二个错误:结合程序上下文,可知当a[i]中的数小于a[p]中的数
时,应使得下标i 赋给变量p,所以语句"p=j;"应改为"p=i;"。
【真题3】 请编写一个函数 void fun(char *tt, int pp[]),统计在tt 字符串中 'a'
到 'z' 26 个字母各自出现的次数,并由 pp 数组传回 main 函数。
运行时输入字符串:abcdefgabcdeabc 后,并且输出的结果应该是:
3 3 3 2 2 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
注意:部分源程序存在文件prog.c 中。
请勿改动主函数main 和其它函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < conio.h >#include < stdio.h >void fun(char *tt, int pp[])
{……}
main( )
{ char aa[1000] ;
int bb[26], k, n ;
clrscr() ;
printf( "\nPlease enter a char string:" ) ; scanf("%s", aa) ;
fun(aa, bb ) ;
for ( k = 0 ; k < 26 ; k++ ) printf ("%d ", bb[k]) ;
printf( "\n" ) ;
}
(2011年2月)
解析: 本题的考核点是统计字符串中各个字母出现的次数。
提示思路:
1、由于存放26 个小写字母的数组pp[]在主函数中未赋初值,所以在函数
fun()中第一步就是将其初始化,以保证程序运行安全;
2、建立循环,将每个字母的个数存放到pp[]数组相对应的元素中。
#include < conio.h >
#include < stdio.h >
/*本题采用的是字母的ASCII码值与数组pp下标的对应转换关系分别求出对
应字母的个数。第一个for()是给pp赋初值0,第二个for()用于控制在字符串
内从头到尾移动。由于字母'a'的ASCII码值为97而它的个数要放在pp[0]
中,而'a'-97的值正好为0,其它的依此类推。*/
void fun(char *tt,int pp[])
{ int i;
for(i=0;i< 26;i++)
pp[i]=0; /*for()循环用于给数组pp[]赋初值0*/
for(;*tt;tt++) /*for()循环用于控制在字符串内从头到尾移动*/
if(*tt< ='z'&&*tt >='a')
pp[*tt-97]++; /*统计字符串中各个字母出现的次数*/
}