计算机二级C语言上机真题(20)【附详解】
【真题1】 请补充函数fun(),该函数的功能是:按‘0’到‘9’统计一个字符串中的奇
数数字字符各自出现的次数,结果保存在数组num 中。注意:不能使用字符串库函
数。 例如:输入“x=112385713.456+0.909*bc”,结果为:1=3,3=2,5=
2,7=1,9=2。 注意:部分源程序给出如下。 请勿改动主函数main 和其他函数
中的任何内容,仅在函数fun()的横线上填入所编写的若干表达式或语句。 试题程
序:
#include< stdio.h >
#define N 1000
void fun(char *tt,int num[])
{ int i,j;
int bb[10];
char *p=tt;
for(i=0;i< 10;i++)
{
num[i]=0;
bb[i]=0;
}
while(【1】)
{
if(*p >='0'&&*p< ='9')
【2】;
p++;
}
for(i=1,j=0;i< 10;i=i+2,j++)
【3】;
}
main()
{ char str[N];
int num[10],k;
printf("\nPlease enter a char string:");
gets(str);
printf("\n**The original string**\n");
puts(str);
fun(str,num);
printf("\n**The number of letter**\n");
for(k=0;k< 5;k++)
{
printf("\n");
printf("%d=%d",2*k+1,num[k]);
}
printf("\n");
return;
}
(2011年2月)
解析: 填空1:通过移动指针p,指向字符串tt中的各个字符,当指针p所指
的字符为'\0'时,即指向字符串tt的最后一个字符,while循环结束。填空2:
将字符串中的数字字符'0'到'9'的个数都保存在数组bb[10]中。*p-'0'实现将字
符'0'的个数保存在bb[0]中,将字符'1'的个数保存在bb[1]中,依此类推,直
到将字符'9'的个数保存在bb[9]中。填空3:由于奇数数字字符的个数存于
bb[1]、bb[3]、bb[5]、bb[7]、bb[9]中,所以for 循环的目的是将这些元素
分别赋给num[0]、num[1]、num[2]、num[3]、num[4]。
答案:【1】*p 【2】bb[*p-'0']++ 【3】num[j]=bb[i]
【真题2】 给定程序modi.c 中函数fun的功能是:依次取出字符串中所有数字字
符,形成新的字符串,并取代原字符串。请改正函数fun 中指定部位的错误,使它能
得出正确的结果。 注意:不要改动main 函数,
#include < stdio.h >
#include < conio.h >
void fun(char *s)
{ int i,j;
for(i=0,j=0; s[i]!='\0'; i++)
if(s[i] >='0' && s[i]< ='9')
/**********found**********/
s[j]=s[i];
/**********found**********/
s[j]="\0";
}
main()
{ char item[80];
clrscr();
printf("\nEnter a string : ");gets(item);
printf("\n\nThe string is : \"%s\"\n",item);
fun(item);
printf("\n\nThe string of changing is :
\"%s\"\n",item );
}
(2011年2月)
解析: 本题的考核点是取出字符串中的数字字符形成新的字符串。
解题思路:通过一个for 循环,从字符串中的第一个字符开始查找,将数字字符
重新赋给该字符数组。
程序中的第一个错误:s[j]=s[i];只是对s[0]循环赋值,其值为最后一个数字
字符,其余的数字字符并没有保存下来,此处给s[0]赋值后,下一个数字字符
应该是赋给s[1],依次类推,所以,给s[j]赋值后j应当加1,即:j++,或
者++j也可以写在一起为:s[j++]=s[i];。
程序中的第二个错误:s[j]="\0";是想给数组加上空字符作为字符串的结束标
志,但是在C 语言中,字符应当用单引号引起来,双引号表示字符串。
本评析仅供参考。
【真题3】 请编写一个函数fun(),它的功能是:比较两个字符串的长度,(不得调
用C 语言提供的求字符串长度的函数),函数返回较短的字符串。若两个字符串长度
相等,则返回第1 个字符串。
例如,输入nanjing < CR > nanchang < CR >(< CR >为回车键),函数将返
回nanjing。
注意:部分源程序给出如下。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入所编
写的若干语句。
试题程序:
#include< stdio.h >char *fun(char *s, char *t)
{……}
main()
{ char a[20],b[10],*p,*q;
int i;
printf("Input 1th string: ");
gets(a);
printf("Input 2th string: ");
gets(b);
printf("%s",fun(a,b));
}
(2011年2月)
解析: char *fun(char *s, char *t)
{ int i,j;
for(i=0;s[i]!= '\0';i++); /*求字符串的长度*/
for(j=0;t[j]!= '\0';j++);
if(i< =j) /*比较两个字符串的长度*/
return s; /*函数返回较短的字符串,若两个字符串长度相等,则返回第1 个字
符串*/
else
return t;
}
本题中,第1个for 循环的作用是求出s 的字符个数i,第2 个for循环的作用
是求出t的字符个数j,因为任何循环都要控制一条语句,所以在每一个for 循
环条件后面必须要有一个分号。
本题也可用如下技巧:
#include< string.h > /*一定要注意在最前面加#include< string.h >*/
char *fun(char *s,char *t)
{
if(strlen(s) >=strlen(t)
return s;
else return t;
}
数数字字符各自出现的次数,结果保存在数组num 中。注意:不能使用字符串库函
数。 例如:输入“x=112385713.456+0.909*bc”,结果为:1=3,3=2,5=
2,7=1,9=2。 注意:部分源程序给出如下。 请勿改动主函数main 和其他函数
中的任何内容,仅在函数fun()的横线上填入所编写的若干表达式或语句。 试题程
序:
#include< stdio.h >
#define N 1000
void fun(char *tt,int num[])
{ int i,j;
int bb[10];
char *p=tt;
for(i=0;i< 10;i++)
{
num[i]=0;
bb[i]=0;
}
while(【1】)
{
if(*p >='0'&&*p< ='9')
【2】;
p++;
}
for(i=1,j=0;i< 10;i=i+2,j++)
【3】;
}
main()
{ char str[N];
int num[10],k;
printf("\nPlease enter a char string:");
gets(str);
printf("\n**The original string**\n");
puts(str);
fun(str,num);
printf("\n**The number of letter**\n");
for(k=0;k< 5;k++)
{
printf("\n");
printf("%d=%d",2*k+1,num[k]);
}
printf("\n");
return;
}
(2011年2月)
解析: 填空1:通过移动指针p,指向字符串tt中的各个字符,当指针p所指
的字符为'\0'时,即指向字符串tt的最后一个字符,while循环结束。填空2:
将字符串中的数字字符'0'到'9'的个数都保存在数组bb[10]中。*p-'0'实现将字
符'0'的个数保存在bb[0]中,将字符'1'的个数保存在bb[1]中,依此类推,直
到将字符'9'的个数保存在bb[9]中。填空3:由于奇数数字字符的个数存于
bb[1]、bb[3]、bb[5]、bb[7]、bb[9]中,所以for 循环的目的是将这些元素
分别赋给num[0]、num[1]、num[2]、num[3]、num[4]。
答案:【1】*p 【2】bb[*p-'0']++ 【3】num[j]=bb[i]
【真题2】 给定程序modi.c 中函数fun的功能是:依次取出字符串中所有数字字
符,形成新的字符串,并取代原字符串。请改正函数fun 中指定部位的错误,使它能
得出正确的结果。 注意:不要改动main 函数,
#include < stdio.h >
#include < conio.h >
void fun(char *s)
{ int i,j;
for(i=0,j=0; s[i]!='\0'; i++)
if(s[i] >='0' && s[i]< ='9')
/**********found**********/
s[j]=s[i];
/**********found**********/
s[j]="\0";
}
main()
{ char item[80];
clrscr();
printf("\nEnter a string : ");gets(item);
printf("\n\nThe string is : \"%s\"\n",item);
fun(item);
printf("\n\nThe string of changing is :
\"%s\"\n",item );
}
(2011年2月)
解析: 本题的考核点是取出字符串中的数字字符形成新的字符串。
解题思路:通过一个for 循环,从字符串中的第一个字符开始查找,将数字字符
重新赋给该字符数组。
程序中的第一个错误:s[j]=s[i];只是对s[0]循环赋值,其值为最后一个数字
字符,其余的数字字符并没有保存下来,此处给s[0]赋值后,下一个数字字符
应该是赋给s[1],依次类推,所以,给s[j]赋值后j应当加1,即:j++,或
者++j也可以写在一起为:s[j++]=s[i];。
程序中的第二个错误:s[j]="\0";是想给数组加上空字符作为字符串的结束标
志,但是在C 语言中,字符应当用单引号引起来,双引号表示字符串。
本评析仅供参考。
【真题3】 请编写一个函数fun(),它的功能是:比较两个字符串的长度,(不得调
用C 语言提供的求字符串长度的函数),函数返回较短的字符串。若两个字符串长度
相等,则返回第1 个字符串。
例如,输入nanjing < CR > nanchang < CR >(< CR >为回车键),函数将返
回nanjing。
注意:部分源程序给出如下。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入所编
写的若干语句。
试题程序:
#include< stdio.h >char *fun(char *s, char *t)
{……}
main()
{ char a[20],b[10],*p,*q;
int i;
printf("Input 1th string: ");
gets(a);
printf("Input 2th string: ");
gets(b);
printf("%s",fun(a,b));
}
(2011年2月)
解析: char *fun(char *s, char *t)
{ int i,j;
for(i=0;s[i]!= '\0';i++); /*求字符串的长度*/
for(j=0;t[j]!= '\0';j++);
if(i< =j) /*比较两个字符串的长度*/
return s; /*函数返回较短的字符串,若两个字符串长度相等,则返回第1 个字
符串*/
else
return t;
}
本题中,第1个for 循环的作用是求出s 的字符个数i,第2 个for循环的作用
是求出t的字符个数j,因为任何循环都要控制一条语句,所以在每一个for 循
环条件后面必须要有一个分号。
本题也可用如下技巧:
#include< string.h > /*一定要注意在最前面加#include< string.h >*/
char *fun(char *s,char *t)
{
if(strlen(s) >=strlen(t)
return s;
else return t;
}