计算机二级C语言上机真题(25)【附详解】
【真题1】 给定程序中,函数fun 的功能是:求ss 所指字符串数组中长度最短的字
符串所在的行下标,作为函数值返回,并把其串长放在形参n 所指变量中。ss 所指
字符串数组中共有M 个字符串,且串长< N。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
#include < stdio.h >#include < string.h >#define M 5
#define N 20
int fun(char (*ss)[N], int *n)
{ int i, k=0, len= N;
/**********found**********/
for(i=0; i< ___1___; i++)
{ len=strlen(ss[i]);
if(i==0) *n=len;
/**********found**********/
if(len ___2___ *n)
{ *n=len;
k=i;
}
}
/**********found**********/
return(___3___);
}
main()
{ char
ss[M][N]={"shanghai","guangzhou","beijing","tianjing","chongqing"};
int n,k,i;
printf("\nThe original strings are :\n");
for(i=0;i< M;i++)puts(ss[i]);
k=fun(ss,&n);
printf("\nThe length of shortest string is : %d\n",n);
printf("\nThe shortest string is : %s\n",ss[k]);
}
(2011年2月)
解析: 本题考查的是字符串长度的比较。
由于在fun 函数中要对字符串数组中的每个字符串(共有M个)都要求其长
度,故在外层循环中,其循环条件应为i< M,故第一空应填M;在比较时,先
使长度的初始值*n 为第一个字符串的长度,然后逐个比较其它字符串的长度
len,如果长度len 小于*n,则将len 赋值给*n,并记录下此时字符串在字符
串数组中的下标i。故第二空应为< 或< =;最后要返回数组的下标,即代码中
的k,故第三空应为k。
答案:【1】M 【2】< 【3】k
【真题2】 下列给定程序中,函数fun()的功能是:将m(1≤m≤10)个字符串反
着连接起来,组成一个新串,放入pt 所指字符串中,例如:把3 个串DEG,ac,df
反着串联起来,结果是dfacDEG。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main()函数,不得增行或者删行,也不得改变程序的结构!
试题程序:
#include < conio.h >#include < string.h >#include < stdio.h >void
fun(char str[][10],int m, char *pt)
{int k,q,i,j=0;
/**********************found***********************/
for(k=m;k >0;k--)
{
q=strlen(str[k]);
j+=q;
for(i=0;i< q;i++)
pt[i]=str[k][i];
pt+=q;
pt[0]=0;
}
/**********************found***********************/
pt=j;
}
main()
{ int m, h;
char s[10][10],p[120];
clrscr();
printf("\nPlease enter m: ");
scanf("%d",&m);
printf("\nPlease enter %d string:\n ",m);
gets(s[0]);
for(h=0;h< m;h++)
gets(s[h]);
fun(s,m,p);
printf("\nThe result is :%s\n ",p);
}
(2011年2月)
解析: (1)错误:for(k=m;k >0;k--) 正确:for(k=m-1;k >=0;k--)
(2)错误:pt=j; 正确:pt-=j;
错误1:本题旨在考查二维数组下标的灵活使用,如果二维数组有m 行,则行
下标取值从0到m-1。
错误2:此时指针pt指向字符串的尾部,而函数返回的应是字符串的首地址,
所以pt向前移动j个字符,则到达字符串的首部。
【真题3】 请编写函数fun,其功能是:计算并输出当x< 0.97 时下列多项式的值,
直到|S(n)-S(n-1)|< 0.000001 为止。
0.5(0.5-1) 0.5(0.5-1)(0.5-2) 0.5(0.5-1)(0.5-2)…(0.5-n+1)
S=1+0.5x+─────x^2+─────────x^3… +──────────
────x^n
2! 3! n!
例如,在主函数中从键盘给x 输入0.21 后,输出为:s=1.100000。
注意:部分源程序在文件prog.c 中。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < stdio.h >#include < math.h >double fun(double x)
{……}
main()
{ double x,s;
printf("Input x: ");
scanf("%lf",&x);
s=fun(x);
printf("s=%f\n",s);
}
(2011年2月)
解析: 本题的考核点是c 语言中多项式的运算。
解题思路:本题是求多项式的和,解此类题的关键是找出其中的规律,观察表
达式可得出x(n)=x(n-1)*x*(0.5-n+1)/n。
#include < stdio.h >
#include < math.h >
可以通过while循环求出各项表达式的值,然后进行累加。
double fun(double x)
{ int n=1; /* 循环计数*/
double sn=1; /* 累计数*/
double xn=1,xn1=0; /*x的n值,以及x的n-1值;*/
while(fabs(xn-xn1) >=0.000001)/*绝对值是否合格*/
{
xn=xn*x*(0.5-n+1)/n; /*表达式分解以后xn=(xn-1)*x*(0.5-n+1)/n*/
n+=1;
sn+=xn; /*sn 累加上xn*/
}
return(sn);
}
符串所在的行下标,作为函数值返回,并把其串长放在形参n 所指变量中。ss 所指
字符串数组中共有M 个字符串,且串长< N。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
#include < stdio.h >#include < string.h >#define M 5
#define N 20
int fun(char (*ss)[N], int *n)
{ int i, k=0, len= N;
/**********found**********/
for(i=0; i< ___1___; i++)
{ len=strlen(ss[i]);
if(i==0) *n=len;
/**********found**********/
if(len ___2___ *n)
{ *n=len;
k=i;
}
}
/**********found**********/
return(___3___);
}
main()
{ char
ss[M][N]={"shanghai","guangzhou","beijing","tianjing","chongqing"};
int n,k,i;
printf("\nThe original strings are :\n");
for(i=0;i< M;i++)puts(ss[i]);
k=fun(ss,&n);
printf("\nThe length of shortest string is : %d\n",n);
printf("\nThe shortest string is : %s\n",ss[k]);
}
(2011年2月)
解析: 本题考查的是字符串长度的比较。
由于在fun 函数中要对字符串数组中的每个字符串(共有M个)都要求其长
度,故在外层循环中,其循环条件应为i< M,故第一空应填M;在比较时,先
使长度的初始值*n 为第一个字符串的长度,然后逐个比较其它字符串的长度
len,如果长度len 小于*n,则将len 赋值给*n,并记录下此时字符串在字符
串数组中的下标i。故第二空应为< 或< =;最后要返回数组的下标,即代码中
的k,故第三空应为k。
答案:【1】M 【2】< 【3】k
【真题2】 下列给定程序中,函数fun()的功能是:将m(1≤m≤10)个字符串反
着连接起来,组成一个新串,放入pt 所指字符串中,例如:把3 个串DEG,ac,df
反着串联起来,结果是dfacDEG。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main()函数,不得增行或者删行,也不得改变程序的结构!
试题程序:
#include < conio.h >#include < string.h >#include < stdio.h >void
fun(char str[][10],int m, char *pt)
{int k,q,i,j=0;
/**********************found***********************/
for(k=m;k >0;k--)
{
q=strlen(str[k]);
j+=q;
for(i=0;i< q;i++)
pt[i]=str[k][i];
pt+=q;
pt[0]=0;
}
/**********************found***********************/
pt=j;
}
main()
{ int m, h;
char s[10][10],p[120];
clrscr();
printf("\nPlease enter m: ");
scanf("%d",&m);
printf("\nPlease enter %d string:\n ",m);
gets(s[0]);
for(h=0;h< m;h++)
gets(s[h]);
fun(s,m,p);
printf("\nThe result is :%s\n ",p);
}
(2011年2月)
解析: (1)错误:for(k=m;k >0;k--) 正确:for(k=m-1;k >=0;k--)
(2)错误:pt=j; 正确:pt-=j;
错误1:本题旨在考查二维数组下标的灵活使用,如果二维数组有m 行,则行
下标取值从0到m-1。
错误2:此时指针pt指向字符串的尾部,而函数返回的应是字符串的首地址,
所以pt向前移动j个字符,则到达字符串的首部。
【真题3】 请编写函数fun,其功能是:计算并输出当x< 0.97 时下列多项式的值,
直到|S(n)-S(n-1)|< 0.000001 为止。
0.5(0.5-1) 0.5(0.5-1)(0.5-2) 0.5(0.5-1)(0.5-2)…(0.5-n+1)
S=1+0.5x+─────x^2+─────────x^3… +──────────
────x^n
2! 3! n!
例如,在主函数中从键盘给x 输入0.21 后,输出为:s=1.100000。
注意:部分源程序在文件prog.c 中。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < stdio.h >#include < math.h >double fun(double x)
{……}
main()
{ double x,s;
printf("Input x: ");
scanf("%lf",&x);
s=fun(x);
printf("s=%f\n",s);
}
(2011年2月)
解析: 本题的考核点是c 语言中多项式的运算。
解题思路:本题是求多项式的和,解此类题的关键是找出其中的规律,观察表
达式可得出x(n)=x(n-1)*x*(0.5-n+1)/n。
#include < stdio.h >
#include < math.h >
可以通过while循环求出各项表达式的值,然后进行累加。
double fun(double x)
{ int n=1; /* 循环计数*/
double sn=1; /* 累计数*/
double xn=1,xn1=0; /*x的n值,以及x的n-1值;*/
while(fabs(xn-xn1) >=0.000001)/*绝对值是否合格*/
{
xn=xn*x*(0.5-n+1)/n; /*表达式分解以后xn=(xn-1)*x*(0.5-n+1)/n*/
n+=1;
sn+=xn; /*sn 累加上xn*/
}
return(sn);
}