计算机二级C语言上机真题(68)【附详解】
【真题1】 下列给定函数中,函数fun()的功能是:统计字符串中各元音字母(即
A,E,I,O,U)的个数。注意:字母不分大小写。例如,输入THIs is a boot,则
应输出是1 0 2 2 0。
试题程序:
#include < conio.h >#include < stdio.h >void fun(char *s,int num[5])
{ int k, i=5;
for(k=0;k< i;k++)
num[k]=__1__;
for(;*s;s++)
{ i=-1;
switch(*s)
{ case 'a': case'A':{i=0;break;}
case 'e ': case 'E':{i=1;break;}
case 'i': case 'I':{i=2;break;}
case 'o': case 'O':{i=3;break;}
case 'u': case 'U':{i=4;__2__;}
}
if(i >=0)
__3__;
}
}
main()
{ char s1[81]; int num1[5], i;
printf("\nPlease enter a string: ");gets(s1);
fun(s1, num1);
for(i=0;i< 5;i++) printf("%d ",num1[i]); printf("\n");
}
(2011年2月)
解析: 填空1:根据题目的意思,这里应该是对数组的初始化,因为在后面的
计算中将要使用累加,所以每一个数组元素都应该初始化为0。
填空2:根据题目的意思,此处是switch语句中case的一部分,即需使用
break 结束。
switch 语句说明:switch后的表达式,可以是整型或字符型,也可以是枚举类
型的。在新的ANSI C 标准中允许表达式的类型为任何类型。每个case后的常
量表达式只能是常量组成的表达式,当switch 后的表达式的值与某一个常量表
达式的值一致时,程序就转到此case后的语句开始执行。如果没有一个常量表
达式的值与switch 后的值一致,就执行default后的语句。各个case后的常
量表达式的值必须互不相同,不然的话程序就不知该跳到何处开始执行。各个
case的次序不影响执行结果,一般情况下,尽量使用出现机率大的case放在
前面。在执行完一个case后面的语句后,程序流程转到下一个case后的语句
开始执行。千万不要理解成执行完一个case后程序就转到switch后的语句去
执行了。
填空3:由算法可以看出,此处是对于满足条件的数组元素进行赋值,即把对应
下标为i的数组元素累加1。
答案:【1】0 【2】break 【3】num[i]++
【真题2】 给定程序modi.c 中函数 fun 的功能是:删除字符串s 中的所有空白字
符(包括Tab 字符、回车符及换行符)。
输入字符串时用'#'结束输入。
请改正程序中的错误,使它能输出正确的结果。
注意:不要改动main 函数,
#include < string.h >#include < stdio.h >#include < ctype.h >fun ( char
*p)
{ int i,t; char c[80];
/************found************/
For (i = 0,t = 0; p[i] ; i++)
if(!isspace(*(p+i))) c[t++]=p[i];
/************found************/
c[t]="\0";
strcpy(p,c);
}
main( )
{ char c,s[80];
int i=0;
printf("Input a string:");
c=getchar();
while(c!='#')
{ s[i]=c;i++;c=getchar(); }
s[i]='\0';
fun(s);
puts(s);
}
(2011年2月)
解析: 本题着重考察考生对C 语言中的语法以及一些简单算法的掌握情况。
C 语言中,大小写的字母含意不同。源程序中"For (i=0,t=0;p[i];i++)"是错
误的,"For"应为小写,程序应改为"for (i=0,t=0;p[i];i++)"或相同作用的语
句。
C 语言中,一对双引号括起来的字符序列表示字符串常量,一对单引号括起来的
表示字符常量。转义字符'\0'作为字符串常量的结束标志。源程序"c[t]="\0";"
是错误的,应改为"c[t]='\0';"。
【真题3】 请编写一个函数,用来删除字符串中的所有空格。
例如,输入"asd af aa z67", 则输出为 "asdafaaz67"。
注意:部分源程序存在文件prog.c 中。
请勿改动主函数main 和其它函数中的任何内容, 仅在函数fun 的花括号中填入你
编写的若干语句。
程序如下:
#include< stdio.h >int fun(char *str)
{……}
main()
{char s[80];
printf(“input a string:\n”);
gets(s);
fun(s);
printf(“The result is:”);
puts(s);
}
(2011年2月)
解析: 本题的考核点是字符数组、循环语句。
提示思路:通过for 循环语句以及if语句,判断当前位置上的字符是否为空格
(空格的ASCII码值为32),若是空格,再判断下一个字符是否为空格,若下
一个字符不是空格,则将当前位置上的字符赋给上一个字符位置上;若下一个
字符还是空格,则继续判断该字符的下一个字符,直至其下一个字符为非空格
时重复上述赋值操作,最终以字符串结束标志"\0"结束循环。
int fun(char *str)
{int i,j;
for(i=0;*(str+i);i++)
if(*(str+i)==32) /*判断当前位置上的字符是否为空格(空格的ASCII码值
为32)*/
{ for(j=i+1;*(str+j);j++)
*(str+j-1)=*(str+j); /*删除空格*/
*(str+j-1)= '\0'; /*以字符串结束标志"\0"结束循环*/
i=0;
}
}
A,E,I,O,U)的个数。注意:字母不分大小写。例如,输入THIs is a boot,则
应输出是1 0 2 2 0。
试题程序:
#include < conio.h >#include < stdio.h >void fun(char *s,int num[5])
{ int k, i=5;
for(k=0;k< i;k++)
num[k]=__1__;
for(;*s;s++)
{ i=-1;
switch(*s)
{ case 'a': case'A':{i=0;break;}
case 'e ': case 'E':{i=1;break;}
case 'i': case 'I':{i=2;break;}
case 'o': case 'O':{i=3;break;}
case 'u': case 'U':{i=4;__2__;}
}
if(i >=0)
__3__;
}
}
main()
{ char s1[81]; int num1[5], i;
printf("\nPlease enter a string: ");gets(s1);
fun(s1, num1);
for(i=0;i< 5;i++) printf("%d ",num1[i]); printf("\n");
}
(2011年2月)
解析: 填空1:根据题目的意思,这里应该是对数组的初始化,因为在后面的
计算中将要使用累加,所以每一个数组元素都应该初始化为0。
填空2:根据题目的意思,此处是switch语句中case的一部分,即需使用
break 结束。
switch 语句说明:switch后的表达式,可以是整型或字符型,也可以是枚举类
型的。在新的ANSI C 标准中允许表达式的类型为任何类型。每个case后的常
量表达式只能是常量组成的表达式,当switch 后的表达式的值与某一个常量表
达式的值一致时,程序就转到此case后的语句开始执行。如果没有一个常量表
达式的值与switch 后的值一致,就执行default后的语句。各个case后的常
量表达式的值必须互不相同,不然的话程序就不知该跳到何处开始执行。各个
case的次序不影响执行结果,一般情况下,尽量使用出现机率大的case放在
前面。在执行完一个case后面的语句后,程序流程转到下一个case后的语句
开始执行。千万不要理解成执行完一个case后程序就转到switch后的语句去
执行了。
填空3:由算法可以看出,此处是对于满足条件的数组元素进行赋值,即把对应
下标为i的数组元素累加1。
答案:【1】0 【2】break 【3】num[i]++
【真题2】 给定程序modi.c 中函数 fun 的功能是:删除字符串s 中的所有空白字
符(包括Tab 字符、回车符及换行符)。
输入字符串时用'#'结束输入。
请改正程序中的错误,使它能输出正确的结果。
注意:不要改动main 函数,
#include < string.h >#include < stdio.h >#include < ctype.h >fun ( char
*p)
{ int i,t; char c[80];
/************found************/
For (i = 0,t = 0; p[i] ; i++)
if(!isspace(*(p+i))) c[t++]=p[i];
/************found************/
c[t]="\0";
strcpy(p,c);
}
main( )
{ char c,s[80];
int i=0;
printf("Input a string:");
c=getchar();
while(c!='#')
{ s[i]=c;i++;c=getchar(); }
s[i]='\0';
fun(s);
puts(s);
}
(2011年2月)
解析: 本题着重考察考生对C 语言中的语法以及一些简单算法的掌握情况。
C 语言中,大小写的字母含意不同。源程序中"For (i=0,t=0;p[i];i++)"是错
误的,"For"应为小写,程序应改为"for (i=0,t=0;p[i];i++)"或相同作用的语
句。
C 语言中,一对双引号括起来的字符序列表示字符串常量,一对单引号括起来的
表示字符常量。转义字符'\0'作为字符串常量的结束标志。源程序"c[t]="\0";"
是错误的,应改为"c[t]='\0';"。
【真题3】 请编写一个函数,用来删除字符串中的所有空格。
例如,输入"asd af aa z67", 则输出为 "asdafaaz67"。
注意:部分源程序存在文件prog.c 中。
请勿改动主函数main 和其它函数中的任何内容, 仅在函数fun 的花括号中填入你
编写的若干语句。
程序如下:
#include< stdio.h >int fun(char *str)
{……}
main()
{char s[80];
printf(“input a string:\n”);
gets(s);
fun(s);
printf(“The result is:”);
puts(s);
}
(2011年2月)
解析: 本题的考核点是字符数组、循环语句。
提示思路:通过for 循环语句以及if语句,判断当前位置上的字符是否为空格
(空格的ASCII码值为32),若是空格,再判断下一个字符是否为空格,若下
一个字符不是空格,则将当前位置上的字符赋给上一个字符位置上;若下一个
字符还是空格,则继续判断该字符的下一个字符,直至其下一个字符为非空格
时重复上述赋值操作,最终以字符串结束标志"\0"结束循环。
int fun(char *str)
{int i,j;
for(i=0;*(str+i);i++)
if(*(str+i)==32) /*判断当前位置上的字符是否为空格(空格的ASCII码值
为32)*/
{ for(j=i+1;*(str+j);j++)
*(str+j-1)=*(str+j); /*删除空格*/
*(str+j-1)= '\0'; /*以字符串结束标志"\0"结束循环*/
i=0;
}
}