计算机二级C语言上机真题(38)【附详解】
【真题1】 规定输入的字符串中只包含字母和*号。函数fun 的功能是:将字符串中
前面所有连续的*号全部移动到字符串的尾部。
例如,字符串中的内容为:*******A*BC*DEF*G****,移动后,字符串中的内
容应当是:A*BC*DEF*G***********。
#include < stdio.h >#include < conio.h >void fun(char *a)
{ char b[81];
int i=0,j=0,s=0,k;
while (a[i]__1____'*') /*统计原串串首连续*的个数*/
{i++;s++;}
while (a[i]) /*将从第一个非*字符开始至串尾的所有字符赋给字符串b*/
{b[j]=a[i];j++;i++;}
for (k=0;k< s;k++) /*串首连续*的个数追加其在字符串b 后*/
{b[j]='*';j++;}
b[j]=__2____;
i=0;j=0;
while (b[j]) /*将字符串b中的所有字符复制到a 字符串中覆盖原串*/
{a[i]=b[j];i++;j++;}
}
main()
{ char s[81],*p;
printf("Enter a string:\n");gets(s);
fun(s);
printf("The string after moveing:\n");puts(s);
}
(2011年2月)
解析: 本题的考核点是移动字符串中字符的算法。
解题思路:先统计原串串首连续*的个数,再将从第一个非*字符开始至串尾的
所有字符赋给一字符串,再通过一循环生成串首连续*的个数个*追加其后,最
后将新串覆盖原串。
答案:【1】== 【2】' \ 0'
【真题2】 给定程序modi.c 中fun 函数的功能是:计算1+2+3+……+n 的和
值。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main 函数,
#include < stdio.h >/************found************/
fun (int n)
{ double t;
/************found************/
if (n==0)
return(1);
else
t=fun(n-1)+n;
return t;
}
main()
{ int n;
printf("Enter n: "); scanf("%d",&n);
printf("\ns=%f\n",fun(n));
}
(2011年2月)
解析: 本题着重考察考生对C 语言中递归算法的掌握情况。
本题中的第一个错误:由主函数中可得,fun 函数应返回一个float或double
型的值,所以程序中语句"fun (int n)"应改为"float fun (int n)"或相同作用的
语句。
本题中的第二个错误:由题意可知,求1 到n 的和,当n 为1 时,和为1,不
断递归,以此求出当n 为n 时的和值,所以程序中语句"if (n==0)"应改为"if
(n==1)"。
【真题3】 请编写一个函数 int un(int *s,int *t,int *k),用来求出数组中值最大
的元素在数组中的下标并存放在k 所指的存储单元中,并且将最大值增添在数组的最
后。形参t 所指存储单元中存放数组中数据的个数。
例如,数组中的数据如下:
876 675 896 101 301 401 980 431 451 777
则输出最大值的下标为:6,数组中的内容为:
876 675 896 101 301 401 980 431 451 777 980
注意:部分源程序存在文件prog.c 中。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < stdio.h >#define N 80
void fun(int *s,int *t,int *k)
{……}
main()
{ int a[N]={876,675,896,101,301,401,980,431,451,777},i,n,mi;
n=10;
printf("\nThe original data:\n");
for(i=0;i< n;i++)printf("%4d",a[i]);printf("\n");
fun(a,&n,&mi);
printf("The index of max is: %d\n",mi);
printf("The result :\n");
for(i=0;i< n;i++)printf("%4d",a[i]);printf("\n");
}
(2011年2月)
解析: 本题的考核点是求数组中最大元素的下标,并将最大值增添在数组的最
后的算法。
提示思路:先通过一指针变量来记录数组中最大值的下标,然后再将最大值放
在数组的最后,使数组长度增1。
void fun(int *s,int *t,int *k)
{ int i=0;
*k=0;
/*从前往后顺序比较s 数组中的元素,并将每次比较过程中较大的那个元素的
下标存放在指针k 中*/
for (i=1;i< *t;i++)
if (s[*k]< s[i]) *k=i;
s[*t]=s[*k];/*将找到的最大值添加在数组的最后*/
*t=*t+1;/*数组长度增1*/
}
前面所有连续的*号全部移动到字符串的尾部。
例如,字符串中的内容为:*******A*BC*DEF*G****,移动后,字符串中的内
容应当是:A*BC*DEF*G***********。
#include < stdio.h >#include < conio.h >void fun(char *a)
{ char b[81];
int i=0,j=0,s=0,k;
while (a[i]__1____'*') /*统计原串串首连续*的个数*/
{i++;s++;}
while (a[i]) /*将从第一个非*字符开始至串尾的所有字符赋给字符串b*/
{b[j]=a[i];j++;i++;}
for (k=0;k< s;k++) /*串首连续*的个数追加其在字符串b 后*/
{b[j]='*';j++;}
b[j]=__2____;
i=0;j=0;
while (b[j]) /*将字符串b中的所有字符复制到a 字符串中覆盖原串*/
{a[i]=b[j];i++;j++;}
}
main()
{ char s[81],*p;
printf("Enter a string:\n");gets(s);
fun(s);
printf("The string after moveing:\n");puts(s);
}
(2011年2月)
解析: 本题的考核点是移动字符串中字符的算法。
解题思路:先统计原串串首连续*的个数,再将从第一个非*字符开始至串尾的
所有字符赋给一字符串,再通过一循环生成串首连续*的个数个*追加其后,最
后将新串覆盖原串。
答案:【1】== 【2】' \ 0'
【真题2】 给定程序modi.c 中fun 函数的功能是:计算1+2+3+……+n 的和
值。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main 函数,
#include < stdio.h >/************found************/
fun (int n)
{ double t;
/************found************/
if (n==0)
return(1);
else
t=fun(n-1)+n;
return t;
}
main()
{ int n;
printf("Enter n: "); scanf("%d",&n);
printf("\ns=%f\n",fun(n));
}
(2011年2月)
解析: 本题着重考察考生对C 语言中递归算法的掌握情况。
本题中的第一个错误:由主函数中可得,fun 函数应返回一个float或double
型的值,所以程序中语句"fun (int n)"应改为"float fun (int n)"或相同作用的
语句。
本题中的第二个错误:由题意可知,求1 到n 的和,当n 为1 时,和为1,不
断递归,以此求出当n 为n 时的和值,所以程序中语句"if (n==0)"应改为"if
(n==1)"。
【真题3】 请编写一个函数 int un(int *s,int *t,int *k),用来求出数组中值最大
的元素在数组中的下标并存放在k 所指的存储单元中,并且将最大值增添在数组的最
后。形参t 所指存储单元中存放数组中数据的个数。
例如,数组中的数据如下:
876 675 896 101 301 401 980 431 451 777
则输出最大值的下标为:6,数组中的内容为:
876 675 896 101 301 401 980 431 451 777 980
注意:部分源程序存在文件prog.c 中。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < stdio.h >#define N 80
void fun(int *s,int *t,int *k)
{……}
main()
{ int a[N]={876,675,896,101,301,401,980,431,451,777},i,n,mi;
n=10;
printf("\nThe original data:\n");
for(i=0;i< n;i++)printf("%4d",a[i]);printf("\n");
fun(a,&n,&mi);
printf("The index of max is: %d\n",mi);
printf("The result :\n");
for(i=0;i< n;i++)printf("%4d",a[i]);printf("\n");
}
(2011年2月)
解析: 本题的考核点是求数组中最大元素的下标,并将最大值增添在数组的最
后的算法。
提示思路:先通过一指针变量来记录数组中最大值的下标,然后再将最大值放
在数组的最后,使数组长度增1。
void fun(int *s,int *t,int *k)
{ int i=0;
*k=0;
/*从前往后顺序比较s 数组中的元素,并将每次比较过程中较大的那个元素的
下标存放在指针k 中*/
for (i=1;i< *t;i++)
if (s[*k]< s[i]) *k=i;
s[*t]=s[*k];/*将找到的最大值添加在数组的最后*/
*t=*t+1;/*数组长度增1*/
}