计算机二级C语言上机真题(30)【附详解】
【真题1】 给定程序的功能是把s 串中所有的字母改写成该字母的下一个字母,字
母z 改写成字母a。大写字母仍为大写字母,小写字母仍为小写字母,其它的字符不
变。
例如:s 串中原有的字符串为:Mn.123Zxy,则调用该函数后,s 串中的内容为:
No.123Ayz。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确结果。
#include < string.h >#include < stdio.h >#include < ctype.h >#define N
81
fun ( char *s )
{/**************found**************/
char *p = ___1___ ;
while(*p) {
/**************found**************/
if(*p == 'Z') *p = ___2___ ;
/**************found**************/
else if(*p == 'z') *p = ___3___ ;
else if(isalpha(*p)) *p = (*p) + 1 ;
p++ ;
}
}
main( )
{ char a[N];
printf ( "Enter a string : " ); gets ( a );
printf ( "The original string is : " ); puts( a );
fun ( a );
printf ( "The string after modified : ");
puts ( a );
}
(2011年2月)
解析: 本题的考核点是c 语言中的循环语句和条件判断语句的使用。
解题思路:从本题的要求来看,我们应该采用循环条件判断的算法。本参考函
数使用while循环从头到尾扫描字符串,并在扫描时进行条件判断,对'z','Z'
和其它字符进行不同的处理。
本评析仅供参考。
答案:【1】s 【2】'A' 【3】'a'
【真题2】 下列给定程序中,函数fun()的功能是:读入一个字符串(长度< 20),
将该字符串中的所有字符按ASCII码降序排序后输出。
例如:输入dafhc,则应输出hfdca。
请改正程序中的错误,使它能得到正确结果。
注意:不要改动main 函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include < conio.h >#include < stdio.h
>/**********************found***********************/
int fun(char t[ ])
{char c;
int i,j;
for(i=0;i< strlen(t)-1;i++)
for(j=i+1;j< strlen(t);j++)
if(t[i]< t[j])
{
c= t[j];
/**********************found***********************/
t[j]=t[i++];
t[i]=c;
}
}
main()
{char s[81];
clrscr();
printf("\nPlease enter a character string :");
gets(s);
printf("\n\nBefore sorting :\n %s",s);
fun(s);
printf("\nAfter sorting decendingly:\n %s",s);
}
(2011年2月)
解析: (1)错误:int fun(char t[ ]) 正确:void fun(char t[ ])
(2)错误: t[j]=t[i++]; 正确:t[j]=t[i];
错误1:该函数只是对一个字符串中的元素进行比较大小的操作,并没有具体的
返回值,因此,函数的返回值类型应为void。
错误2:本题的思路是利用选择法对数组元素进行比较。所谓选择法,是依次用
当前取得的元素和它后面的元素进行比较,在第一个元素和它后面的元素顺次
比较时,可以借助中间变量来对两数进行交换,要保证这第一个元素始终存放
数组中的最大数,以后依次挑出次大数,这样最终的数组就是有序的。解答本
题,只要理解了选择法的思想,找到并改正错误就很容易了。
【真题3】 请编写一个函数 int fun(int *s, int t, int *k),用来求出数组的最大元
素在数组中的下标, 用k 返回。
例如, 输入如下整数:
876 675 896 101 301 401 980 431 451 777
则输出结果为: 6, 980
注意:部分源程序存在文件prog.c 中。
请勿改动主函数main 和其它函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < conio.h >#include < stdio.h >int fun(int *s, int t, int *k)
{……}
main( )
{ int a[10]={876,675,896,101,301,401,980,431,451,777}, k ;
clrscr() ;
fun(a, 10, &k) ;
printf("%d, %d\n", k, a[k]) ;
}
(2011年2月)
解析: 本题的考核点是求数组中的最大元素在数组中的下标。
提示思路:
1、定义变量max_integer,用以存放数组s[]中的最大元素;
2、建立循环,查找出数组s[]中的最大元素;
3、将查找到的最大元素的下标赋给k,并传回主函数。
int fun(int *s, int t, int *k)
{ int max_integer=0; /*定义变量max_integer,用以存放数组s[]中的最
大元素*/
int i=0;
max_integer = s[0]; /*假定第一个数组元素为最大*/
for(i=0; i< t; i=i+1){ /*建立循环,查找出数组s[]中的最大元素*/
/*将查找到的最大元素的下标赋给k,并传回主函数*/
if(max_integer< s[i]){
max_integer=s[i];
*k=i;
}
}
}
母z 改写成字母a。大写字母仍为大写字母,小写字母仍为小写字母,其它的字符不
变。
例如:s 串中原有的字符串为:Mn.123Zxy,则调用该函数后,s 串中的内容为:
No.123Ayz。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确结果。
#include < string.h >#include < stdio.h >#include < ctype.h >#define N
81
fun ( char *s )
{/**************found**************/
char *p = ___1___ ;
while(*p) {
/**************found**************/
if(*p == 'Z') *p = ___2___ ;
/**************found**************/
else if(*p == 'z') *p = ___3___ ;
else if(isalpha(*p)) *p = (*p) + 1 ;
p++ ;
}
}
main( )
{ char a[N];
printf ( "Enter a string : " ); gets ( a );
printf ( "The original string is : " ); puts( a );
fun ( a );
printf ( "The string after modified : ");
puts ( a );
}
(2011年2月)
解析: 本题的考核点是c 语言中的循环语句和条件判断语句的使用。
解题思路:从本题的要求来看,我们应该采用循环条件判断的算法。本参考函
数使用while循环从头到尾扫描字符串,并在扫描时进行条件判断,对'z','Z'
和其它字符进行不同的处理。
本评析仅供参考。
答案:【1】s 【2】'A' 【3】'a'
【真题2】 下列给定程序中,函数fun()的功能是:读入一个字符串(长度< 20),
将该字符串中的所有字符按ASCII码降序排序后输出。
例如:输入dafhc,则应输出hfdca。
请改正程序中的错误,使它能得到正确结果。
注意:不要改动main 函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include < conio.h >#include < stdio.h
>/**********************found***********************/
int fun(char t[ ])
{char c;
int i,j;
for(i=0;i< strlen(t)-1;i++)
for(j=i+1;j< strlen(t);j++)
if(t[i]< t[j])
{
c= t[j];
/**********************found***********************/
t[j]=t[i++];
t[i]=c;
}
}
main()
{char s[81];
clrscr();
printf("\nPlease enter a character string :");
gets(s);
printf("\n\nBefore sorting :\n %s",s);
fun(s);
printf("\nAfter sorting decendingly:\n %s",s);
}
(2011年2月)
解析: (1)错误:int fun(char t[ ]) 正确:void fun(char t[ ])
(2)错误: t[j]=t[i++]; 正确:t[j]=t[i];
错误1:该函数只是对一个字符串中的元素进行比较大小的操作,并没有具体的
返回值,因此,函数的返回值类型应为void。
错误2:本题的思路是利用选择法对数组元素进行比较。所谓选择法,是依次用
当前取得的元素和它后面的元素进行比较,在第一个元素和它后面的元素顺次
比较时,可以借助中间变量来对两数进行交换,要保证这第一个元素始终存放
数组中的最大数,以后依次挑出次大数,这样最终的数组就是有序的。解答本
题,只要理解了选择法的思想,找到并改正错误就很容易了。
【真题3】 请编写一个函数 int fun(int *s, int t, int *k),用来求出数组的最大元
素在数组中的下标, 用k 返回。
例如, 输入如下整数:
876 675 896 101 301 401 980 431 451 777
则输出结果为: 6, 980
注意:部分源程序存在文件prog.c 中。
请勿改动主函数main 和其它函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < conio.h >#include < stdio.h >int fun(int *s, int t, int *k)
{……}
main( )
{ int a[10]={876,675,896,101,301,401,980,431,451,777}, k ;
clrscr() ;
fun(a, 10, &k) ;
printf("%d, %d\n", k, a[k]) ;
}
(2011年2月)
解析: 本题的考核点是求数组中的最大元素在数组中的下标。
提示思路:
1、定义变量max_integer,用以存放数组s[]中的最大元素;
2、建立循环,查找出数组s[]中的最大元素;
3、将查找到的最大元素的下标赋给k,并传回主函数。
int fun(int *s, int t, int *k)
{ int max_integer=0; /*定义变量max_integer,用以存放数组s[]中的最
大元素*/
int i=0;
max_integer = s[0]; /*假定第一个数组元素为最大*/
for(i=0; i< t; i=i+1){ /*建立循环,查找出数组s[]中的最大元素*/
/*将查找到的最大元素的下标赋给k,并传回主函数*/
if(max_integer< s[i]){
max_integer=s[i];
*k=i;
}
}
}