计算机二级C语言上机真题(15)【附详解】
【真题1】 请补充main 函数,该函数的功能是:从一个字符串中截取前面若干个
给定长度的子字符串。其中,str1 指向原字符串,截取后的字符存放在str2 所指的
字符数组中,n中存放需截取的字符个数。 例如:当str1=“cdefghij”,然后输入
4,则str2=“cdef”。 注意:部分源程序给出如下。 请勿改动主函数main 和其他
函数中的任何内容,仅在函数fun()的横线上填入所编写的若干表达式或语句。 试题
程序:
#include < stdio.h >
#include< conio.h >
#define LEN 80
main()
{ char str1[LEN],str2[LEN];
int n,i;
clrscr();
printf("Enter the string:\n");
gets(str1);
printf("Enter the position of the string
deleted:");
scanf(【1】);
for(i=0;i< n;i++)
【2】
str2[i]='\0';
printf("The new string is:%s\n",【3】);}
(2011年2月)
解析: 填空1:本题考查对标准输入函数scanf()的调用格式,由后面的程序
可以知道,变量n 保存了要截取的字符数,注意在n前面不要忘了取址符‘ &'。
填空2:截取前n 个字符,就是将字符串str1 的前n 个字符依次赋给字符串
str2 的前n 个字符。填空3:本题考查对标准输出函数printf()的调用格式,
根据题意,应输出截取后的字符串,即字符串str2。
答案:【1】″%d″,&n 【2】str2[i]=str1[i]; 【3】str2
【真题2】 给定程序modi.c 中,函数fun 的功能是:从N 个字符串中找出最长的
那个串,并将其地址作为函数值返回。各字符串在主函数中输入,并放入一个字符串
数组中。 请改正程序中的错误,使它能得出正确结果。 注意:不要改动main 函
数,
#include < stdio.h >
#include < string.h >
#define N 5
#define M 81
/************found************/
fun(char (*sq)[M])
{int i; char *sp;
sp=sq[0];
for(i=0;i< N;i++)
if(strlen(sp)< strlen(sq[i]))
sp=sq[i];
/************found************/
return sq;
}
main()
{char str[N][M],*longest; int i;
printf("Enter %d lines :\n",N);
for (i=0;i< N;i++) gets(str[i]);
printf("\nThe N string :\n",N);
for (i=0;i< N;i++) puts(str[i]);
longest=fun(str);
printf("\nThe longest string:\n");puts(longest);
}
(2011年2月)
解析: 本题着重考察考生对C 语言中指针数组的定义以及函数返回值的掌握情
况。
本题中的第一个错误:指针数组定义错误,应将程序中的语句"fun(char
(*sq)[M])"改为
"char *fun(char sq[N][M])"或”char *fun(char ( *sq)[M])”。
本题中的第二个错误:函数返回的应是字符串中最长那个串的地址,这个地址
是通过指针sp记录的,所以程序中的语句"return sq;"应改为"return sp;"或
相同作用的语句。
【真题3】 规定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:
使字符串中的尾部连续的*号不得多于n 个;若多于n 个,则删除多余的*号;若少
于或等于n 个,则什么也不做,字符串中间和尾部的*号不删除。 例如,字符串中的
内容为:****A*BC*DEF*G*******,若n 的值为4,删除后,字符串中的内容
应当是:****A*BC*DEF*G****;若n 的值为7,则字符串中的内容仍为:
****A*BC*DEF*G*******。n 的值在主函数中输入。在编写函数时,不得使用
C 语言提供的字符串函数。 注意:部分源程序存在文件prog.c 中。 请勿改动主函
数main 和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语
句。
#include < stdio.h >
#include < conio.h >
void fun(char *a,int n)
{……}
main()
{ char s[81];int n;
printf("Enter a string:\n");gets(s);
printf("Enter n: ");scanf("%d",&n);
fun(s,n);
printf("The string after deleted:\n");puts(s);
}
(2011年2月)
解析: 本题的考核点是删除字符串中字符的算法。
解题思路:先统计串尾连续字符的个数,若小于或等于指定的个数,什么也不
做,若多于指定的数,则删除多余的*,删除的方法是:通过一个循环先生成指
定个数个*放到一字符串中,再从串尾第一个非*字符开始至串首的字符追加其
后,最后将新串逆序放入到原串中覆盖原串。
本评析仅供参考。
void fun(char *a,int n)
{ char b[81];
int i=0,j=0,s=0,k,t=0;
while (a[i]) {t++;i++;}
i--;
while (a[i]=='*') {s++;i--;} /*统计串尾连续字符的个数*/
if (s >n) /*判断字符串尾连续的*号个数是否大于n*/
{ for (k=0;k< n;k++)
{b[j]='*';j++;}
while (i!=-1)
{b[j]=a[i];j++;i--;}
b[j]='\0'; i=0;j=j-1;
while (j!=-1)
{ a[i]=b[j];i++;j--;} /*将字符串b中的所有字符复制到a字符串中覆盖原
串*/
a[i]='\0';
}
}
给定长度的子字符串。其中,str1 指向原字符串,截取后的字符存放在str2 所指的
字符数组中,n中存放需截取的字符个数。 例如:当str1=“cdefghij”,然后输入
4,则str2=“cdef”。 注意:部分源程序给出如下。 请勿改动主函数main 和其他
函数中的任何内容,仅在函数fun()的横线上填入所编写的若干表达式或语句。 试题
程序:
#include < stdio.h >
#include< conio.h >
#define LEN 80
main()
{ char str1[LEN],str2[LEN];
int n,i;
clrscr();
printf("Enter the string:\n");
gets(str1);
printf("Enter the position of the string
deleted:");
scanf(【1】);
for(i=0;i< n;i++)
【2】
str2[i]='\0';
printf("The new string is:%s\n",【3】);}
(2011年2月)
解析: 填空1:本题考查对标准输入函数scanf()的调用格式,由后面的程序
可以知道,变量n 保存了要截取的字符数,注意在n前面不要忘了取址符‘ &'。
填空2:截取前n 个字符,就是将字符串str1 的前n 个字符依次赋给字符串
str2 的前n 个字符。填空3:本题考查对标准输出函数printf()的调用格式,
根据题意,应输出截取后的字符串,即字符串str2。
答案:【1】″%d″,&n 【2】str2[i]=str1[i]; 【3】str2
【真题2】 给定程序modi.c 中,函数fun 的功能是:从N 个字符串中找出最长的
那个串,并将其地址作为函数值返回。各字符串在主函数中输入,并放入一个字符串
数组中。 请改正程序中的错误,使它能得出正确结果。 注意:不要改动main 函
数,
#include < stdio.h >
#include < string.h >
#define N 5
#define M 81
/************found************/
fun(char (*sq)[M])
{int i; char *sp;
sp=sq[0];
for(i=0;i< N;i++)
if(strlen(sp)< strlen(sq[i]))
sp=sq[i];
/************found************/
return sq;
}
main()
{char str[N][M],*longest; int i;
printf("Enter %d lines :\n",N);
for (i=0;i< N;i++) gets(str[i]);
printf("\nThe N string :\n",N);
for (i=0;i< N;i++) puts(str[i]);
longest=fun(str);
printf("\nThe longest string:\n");puts(longest);
}
(2011年2月)
解析: 本题着重考察考生对C 语言中指针数组的定义以及函数返回值的掌握情
况。
本题中的第一个错误:指针数组定义错误,应将程序中的语句"fun(char
(*sq)[M])"改为
"char *fun(char sq[N][M])"或”char *fun(char ( *sq)[M])”。
本题中的第二个错误:函数返回的应是字符串中最长那个串的地址,这个地址
是通过指针sp记录的,所以程序中的语句"return sq;"应改为"return sp;"或
相同作用的语句。
【真题3】 规定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:
使字符串中的尾部连续的*号不得多于n 个;若多于n 个,则删除多余的*号;若少
于或等于n 个,则什么也不做,字符串中间和尾部的*号不删除。 例如,字符串中的
内容为:****A*BC*DEF*G*******,若n 的值为4,删除后,字符串中的内容
应当是:****A*BC*DEF*G****;若n 的值为7,则字符串中的内容仍为:
****A*BC*DEF*G*******。n 的值在主函数中输入。在编写函数时,不得使用
C 语言提供的字符串函数。 注意:部分源程序存在文件prog.c 中。 请勿改动主函
数main 和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语
句。
#include < stdio.h >
#include < conio.h >
void fun(char *a,int n)
{……}
main()
{ char s[81];int n;
printf("Enter a string:\n");gets(s);
printf("Enter n: ");scanf("%d",&n);
fun(s,n);
printf("The string after deleted:\n");puts(s);
}
(2011年2月)
解析: 本题的考核点是删除字符串中字符的算法。
解题思路:先统计串尾连续字符的个数,若小于或等于指定的个数,什么也不
做,若多于指定的数,则删除多余的*,删除的方法是:通过一个循环先生成指
定个数个*放到一字符串中,再从串尾第一个非*字符开始至串首的字符追加其
后,最后将新串逆序放入到原串中覆盖原串。
本评析仅供参考。
void fun(char *a,int n)
{ char b[81];
int i=0,j=0,s=0,k,t=0;
while (a[i]) {t++;i++;}
i--;
while (a[i]=='*') {s++;i--;} /*统计串尾连续字符的个数*/
if (s >n) /*判断字符串尾连续的*号个数是否大于n*/
{ for (k=0;k< n;k++)
{b[j]='*';j++;}
while (i!=-1)
{b[j]=a[i];j++;i--;}
b[j]='\0'; i=0;j=j-1;
while (j!=-1)
{ a[i]=b[j];i++;j--;} /*将字符串b中的所有字符复制到a字符串中覆盖原
串*/
a[i]='\0';
}
}