计算机二级C语言上机真题(94)【附详解】
【真题1】 下列给定程序中,函数fun()的功能是:从3 个红球,5 个白球,6 个黑
球中任意取出8 个作为一组,进行输出。在每组中,可以没有黑球,但必须要有红球
和白球。组合数作为函数值返回。正确的组合数应该是15。程序中i的值代表红球
数,j 的值代表白球数,k 的值代表黑球数。 试题程序:
#include < stdio.h >
int fun()
{ int i,j,k,__1__;
printf("\nThe result :\n\n ");
for(__2__;i< =3;i++)
{ for (j=1;j< =5;j++)
{k=8-i-j;
if(__3__)
{ sum=sum+1;
printf("red:%4d white:%4d black:%4d\n
",i,j,k);
}
}
}
return sum;
}
main()
{ int sum;
sum=fun();
printf("sum=%4d\n\n ",sum);
}
(2011年2月)
解析: 填空1:仔细观察函数体中的各项数据,就会发现有一个变量sum 是没
有定义的,由题意知,函数中的变量全是整型变量,再看sum的用法,知道它
是用来求和的,因此其初值应是0。
填空2:红球数i 的总数为3,但最小值为1,循环条件中应该是i=1而不是i=0,切记循环的第一项赋值语句要根据情况使用,不能一成不变。
填空3:这里考查条件语句的选择,程序旨在说明题干中的"在每组中,可以没
有黑球,但必须要有红球和白球"这个信息,满足条件的语句应该是if((k
>=1&&k< =6)&&(i!=0)&&(j!=0)||(k==0)) 。
答案:【1】sum=0 【2】i=1 【3】 (k >=1&&k<
=6)&&(i!=0)&&(j!=0)||(k==0)
【真题2】 给定程序modi.c 中函数 fun 的功能是:计算n!。 例如,给n 输入5,
则输出120.000000。 请改正程序中的错误,使程序能输出正确的结果。 注意:不
要改动main 函数,
#include < stdio.h >
#include < conio.h >
double fun ( int n )
{ double result = 1.0 ;
/************found************/
if n = = 0
return 1.0 ;
while( n >1 && n < 170 )
/************found************/
result *= n--
return result ;
}
main ( )
{ int n ;
printf("Input N:") ;
scanf("%d", &n) ;
printf("\n\n%d! =%lf\n\n", n, fun(n)) ;
}
(2011年2月)
解析: 本题的考核点是C语言的运算符和语法。
解题思路:通过循环语句累积求整数n的阶积。本题的if语句中缺少括号且不
存在"= ="比较运算符,相等比较运算符应为"=="。C 语言中每条语句都以";"
结束,本题的第二个错误处的语句末缺少";"号,所以出现了语法错误。
【真题3】 请编一个函数fun(char *s),函数的功能是把字符串中的内容逆置。例
如:字符串中原有的内容为:abcdefg,则调用该函数后,串中的内容为:
gfedcba。 注意: 部分源程序存在文件prog.c中。 请勿改动主函数main 和其它
函数中的任何内容,仅在函数fun 的花括号中填入你编写的若干语句。
#include < string.h >
#include < conio.h >
#include < stdio.h >
#define N 81
fun(char *s)
{……}
main()
{ char a[N];
clrscr();
printf("Enter a string: ");gets(a);
printf("The original string is: ");puts(a);
fun(a);
printf("\n");
printf("The string after modified: ");
puts(a);
}
(2011年2月)
解析: 本题的考核点是C语言中的for 循环语句的使用。 提示思路:对于本
题,我们给出的参考函数采取的算法是:将第一个元素与最后一个元素互换,
第二个元素与倒数第二个互换…的方式进行倒排序。因为我们一次互换两个元
素,所以for循环语句执行length/2次(length 是字符串的长度)就可以把
全部元素互换一遍。
void fun ( char *s )
{int i ,length;
char tmp;
length = strlen( s ); /*统计字符串s 中字符的个数*/
for (i = 0;i < length / 2; i++)
{ /*以下三行即将s 中的第i 个字符与第length-i 个字符进行交互*/
tmp = s[i];
s[i] = s[length - i - 1];
s[length - i - 1] = tmp; } }
球中任意取出8 个作为一组,进行输出。在每组中,可以没有黑球,但必须要有红球
和白球。组合数作为函数值返回。正确的组合数应该是15。程序中i的值代表红球
数,j 的值代表白球数,k 的值代表黑球数。 试题程序:
#include < stdio.h >
int fun()
{ int i,j,k,__1__;
printf("\nThe result :\n\n ");
for(__2__;i< =3;i++)
{ for (j=1;j< =5;j++)
{k=8-i-j;
if(__3__)
{ sum=sum+1;
printf("red:%4d white:%4d black:%4d\n
",i,j,k);
}
}
}
return sum;
}
main()
{ int sum;
sum=fun();
printf("sum=%4d\n\n ",sum);
}
(2011年2月)
解析: 填空1:仔细观察函数体中的各项数据,就会发现有一个变量sum 是没
有定义的,由题意知,函数中的变量全是整型变量,再看sum的用法,知道它
是用来求和的,因此其初值应是0。
填空2:红球数i 的总数为3,但最小值为1,循环条件中应该是i=1而不是i=0,切记循环的第一项赋值语句要根据情况使用,不能一成不变。
填空3:这里考查条件语句的选择,程序旨在说明题干中的"在每组中,可以没
有黑球,但必须要有红球和白球"这个信息,满足条件的语句应该是if((k
>=1&&k< =6)&&(i!=0)&&(j!=0)||(k==0)) 。
答案:【1】sum=0 【2】i=1 【3】 (k >=1&&k<
=6)&&(i!=0)&&(j!=0)||(k==0)
【真题2】 给定程序modi.c 中函数 fun 的功能是:计算n!。 例如,给n 输入5,
则输出120.000000。 请改正程序中的错误,使程序能输出正确的结果。 注意:不
要改动main 函数,
#include < stdio.h >
#include < conio.h >
double fun ( int n )
{ double result = 1.0 ;
/************found************/
if n = = 0
return 1.0 ;
while( n >1 && n < 170 )
/************found************/
result *= n--
return result ;
}
main ( )
{ int n ;
printf("Input N:") ;
scanf("%d", &n) ;
printf("\n\n%d! =%lf\n\n", n, fun(n)) ;
}
(2011年2月)
解析: 本题的考核点是C语言的运算符和语法。
解题思路:通过循环语句累积求整数n的阶积。本题的if语句中缺少括号且不
存在"= ="比较运算符,相等比较运算符应为"=="。C 语言中每条语句都以";"
结束,本题的第二个错误处的语句末缺少";"号,所以出现了语法错误。
【真题3】 请编一个函数fun(char *s),函数的功能是把字符串中的内容逆置。例
如:字符串中原有的内容为:abcdefg,则调用该函数后,串中的内容为:
gfedcba。 注意: 部分源程序存在文件prog.c中。 请勿改动主函数main 和其它
函数中的任何内容,仅在函数fun 的花括号中填入你编写的若干语句。
#include < string.h >
#include < conio.h >
#include < stdio.h >
#define N 81
fun(char *s)
{……}
main()
{ char a[N];
clrscr();
printf("Enter a string: ");gets(a);
printf("The original string is: ");puts(a);
fun(a);
printf("\n");
printf("The string after modified: ");
puts(a);
}
(2011年2月)
解析: 本题的考核点是C语言中的for 循环语句的使用。 提示思路:对于本
题,我们给出的参考函数采取的算法是:将第一个元素与最后一个元素互换,
第二个元素与倒数第二个互换…的方式进行倒排序。因为我们一次互换两个元
素,所以for循环语句执行length/2次(length 是字符串的长度)就可以把
全部元素互换一遍。
void fun ( char *s )
{int i ,length;
char tmp;
length = strlen( s ); /*统计字符串s 中字符的个数*/
for (i = 0;i < length / 2; i++)
{ /*以下三行即将s 中的第i 个字符与第length-i 个字符进行交互*/
tmp = s[i];
s[i] = s[length - i - 1];
s[length - i - 1] = tmp; } }