计算机二级C语言上机真题(91)【附详解】
【真题1】 下列给定程序中,函数fun()的功能是:根据输入的3 个边长(整型值),
判断能否构成三角形:若能构成等边三角形,则返回3,若是等腰三角形,则返回
2,若能构成三角形则返回1,若不能,则返回0。 试题程序:
#include < math.h >
#include < stdio.h >
___1___fun(int a,int b,int c)
{ if(___2___)
{if(a==b&&b==c)
return 3;
else if(a==b||b==c||a==c)
return 2;
else return 1;
}
___3___ return 0;
}
main()
{ int a,b,c,shape;
printf("\nInput a,b,c: "); scanf("%d%d%d",&a,&b,&c);
printf("\na=%d, b=%d, c=%d\n",a,b,c);
shape=fun(a,b,c);
printf("\n\nThe shape :%d\n",shape);
}
(2011年2月)
解析: 填空1:这里要问的是函数的类型,由主程序main()可知这个函数是
int型的,也可由其多个返回值语句来判断其类型。
填空2:很显然,这个条件判断语句是判断输入的三个边长是否可以构成三角形
的,由数学知识我们可以知道这个关系应该是a+b >c&&b+c >a&&a+c
>b。
填空3:这是一道语法题,因为表面上看函数有多个返回值语句,好象不缺什
么,但你运行一下就会发现这个返回语句不会被调用,因其缺少了关键字
else,该题只要理解了if语句中的条件,并能读懂题目定义就可轻松解决。
答案:【1】int 【2】a+b >c&&b+c >a&&a+c >b 【3】else
【真题2】 文件modi.c 中程序的功能是:读入整数m(0≤m≤99),按下面的公式
计算并输出数列的第m 项。 ┌ 2, m = 1; │ 3, m = 2; FFF( m ) = ┤ 5, m =
3; └ FFF(m - 3) + FFF(m - 1), m > 3; 例如,若输入整数 9,则应输出:47。
请改正程序中的错误,使它能计算出正确的结果。 注意:
#include < conio.h >
#include < stdio.h >
int FFF( int n )
{ int i, f1 = 2, f2 = 3, f3 = 5, ff;
if( n == 1 ) ff = f1;
else if( n == 2 ) ff = f2;
else if( n == 3 ) ff = f3;
else
/************found**********/
for( i = 4; i < n; i++ )
{ ff = f1 + f3;
f1 = f2;
f2 = f3;
f3 = ff;
}
return( ff );
}
main()
{ int m;
clrscr();
printf( "\nPlease enter a number:\n" );
scanf( "%d", &m );
/************found**********/
printf( "\nThe term %d is &d\n" m, FFF( m ) );
}
(2011年2月)
解析: 本题的考核点是c 语言中的分支程序设计及for 循环语句的使用。
原程序中,for 循环语句里的"f1 = f2;f2 = f3;f3 = ff;"实际上就相当于 "f1
= FFF(i - 2);f2 = FFF(i - 1);f3 = ff;",所以无论n 有多大,f1 始终是
FFF(i - 2),f3 始终是ff,把"ff = f1 + f3"放在循环的开始,则for 循环和
FFF(i) = FFF(i -3)+ FFF(i - 1)的作用是完全相同的。
原程序中,for 循环的上界为n - 1,因此FFF函数返回的不是FFF(m)而是
FFF(m-1),如果想求FFF(9)却会返回FFF(8),所以应该把"for(i=4;i<
n;i++)"改成"for(i=4;i< =n;i++)"或相同作用的语句。这是原程序中的第一
个错误。
另外,printf函数各参数之间应用逗号隔开,格式字符串的前缀是%而不是&。
所以应该把原程序中的"printf( "\nThe term %d is &d\n" m, FFF( m ) );"
改成"printf("\nThe term %d is %d\n",m,FFF(m) );"或相同作用的语句。
【真题3】 函数fun 的功能是:将两个两位数的正整数a、b 合并形成一个整数放在
c 中。合并的方式是:将a 数的十位和个位数依次放在c 数的千位和十位上,b 数的
十位和个位数依次放在c 数的百位和个位上。 例如,当a=45,b=12。调用该函数
后,c=4152。 注意:部分源程序存在文件prog.c 中。 请勿改动主函数main 和
其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include < conio.h >
#include < stdio.h >
void fun(int a,int b,long *c)
{……}
main()
{ int a,b;long c;
clrscr();
printf("Input a,b:");scanf("%d%d",&a,&b);
fun(a,b,&c);
printf("The result is: %ld\n",c);
}
(2011年2月)
解析: 本题的考核点是求取整数相应位上的数值的算法。 提示思路:可用整除
和求余的运算求取整数各位上的数值。方法是整除相应位上的位权值,再对其
求余,余数即为相应位上的数值。
void fun(int a, int b, long *c)
{ int a_up,a_low,b_up,b_low;
a_up=a/10; /*求正整数a 的十位数*/
a_low=a%10; /*求正整数a 的个位数*/
b_up=b/10; /*求正整数b 的十位数*/
b_low=b%10; /*求正整数b 的个位数*/
*c=a_up*1000+b_up*100+a_low*10+b_low; /*将a 数的十位和
个位数依次放在c 数的千位和十位上,b 数的十位和个位数依次放在c 数的
百位和个位上*/
}
判断能否构成三角形:若能构成等边三角形,则返回3,若是等腰三角形,则返回
2,若能构成三角形则返回1,若不能,则返回0。 试题程序:
#include < math.h >
#include < stdio.h >
___1___fun(int a,int b,int c)
{ if(___2___)
{if(a==b&&b==c)
return 3;
else if(a==b||b==c||a==c)
return 2;
else return 1;
}
___3___ return 0;
}
main()
{ int a,b,c,shape;
printf("\nInput a,b,c: "); scanf("%d%d%d",&a,&b,&c);
printf("\na=%d, b=%d, c=%d\n",a,b,c);
shape=fun(a,b,c);
printf("\n\nThe shape :%d\n",shape);
}
(2011年2月)
解析: 填空1:这里要问的是函数的类型,由主程序main()可知这个函数是
int型的,也可由其多个返回值语句来判断其类型。
填空2:很显然,这个条件判断语句是判断输入的三个边长是否可以构成三角形
的,由数学知识我们可以知道这个关系应该是a+b >c&&b+c >a&&a+c
>b。
填空3:这是一道语法题,因为表面上看函数有多个返回值语句,好象不缺什
么,但你运行一下就会发现这个返回语句不会被调用,因其缺少了关键字
else,该题只要理解了if语句中的条件,并能读懂题目定义就可轻松解决。
答案:【1】int 【2】a+b >c&&b+c >a&&a+c >b 【3】else
【真题2】 文件modi.c 中程序的功能是:读入整数m(0≤m≤99),按下面的公式
计算并输出数列的第m 项。 ┌ 2, m = 1; │ 3, m = 2; FFF( m ) = ┤ 5, m =
3; └ FFF(m - 3) + FFF(m - 1), m > 3; 例如,若输入整数 9,则应输出:47。
请改正程序中的错误,使它能计算出正确的结果。 注意:
#include < conio.h >
#include < stdio.h >
int FFF( int n )
{ int i, f1 = 2, f2 = 3, f3 = 5, ff;
if( n == 1 ) ff = f1;
else if( n == 2 ) ff = f2;
else if( n == 3 ) ff = f3;
else
/************found**********/
for( i = 4; i < n; i++ )
{ ff = f1 + f3;
f1 = f2;
f2 = f3;
f3 = ff;
}
return( ff );
}
main()
{ int m;
clrscr();
printf( "\nPlease enter a number:\n" );
scanf( "%d", &m );
/************found**********/
printf( "\nThe term %d is &d\n" m, FFF( m ) );
}
(2011年2月)
解析: 本题的考核点是c 语言中的分支程序设计及for 循环语句的使用。
原程序中,for 循环语句里的"f1 = f2;f2 = f3;f3 = ff;"实际上就相当于 "f1
= FFF(i - 2);f2 = FFF(i - 1);f3 = ff;",所以无论n 有多大,f1 始终是
FFF(i - 2),f3 始终是ff,把"ff = f1 + f3"放在循环的开始,则for 循环和
FFF(i) = FFF(i -3)+ FFF(i - 1)的作用是完全相同的。
原程序中,for 循环的上界为n - 1,因此FFF函数返回的不是FFF(m)而是
FFF(m-1),如果想求FFF(9)却会返回FFF(8),所以应该把"for(i=4;i<
n;i++)"改成"for(i=4;i< =n;i++)"或相同作用的语句。这是原程序中的第一
个错误。
另外,printf函数各参数之间应用逗号隔开,格式字符串的前缀是%而不是&。
所以应该把原程序中的"printf( "\nThe term %d is &d\n" m, FFF( m ) );"
改成"printf("\nThe term %d is %d\n",m,FFF(m) );"或相同作用的语句。
【真题3】 函数fun 的功能是:将两个两位数的正整数a、b 合并形成一个整数放在
c 中。合并的方式是:将a 数的十位和个位数依次放在c 数的千位和十位上,b 数的
十位和个位数依次放在c 数的百位和个位上。 例如,当a=45,b=12。调用该函数
后,c=4152。 注意:部分源程序存在文件prog.c 中。 请勿改动主函数main 和
其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include < conio.h >
#include < stdio.h >
void fun(int a,int b,long *c)
{……}
main()
{ int a,b;long c;
clrscr();
printf("Input a,b:");scanf("%d%d",&a,&b);
fun(a,b,&c);
printf("The result is: %ld\n",c);
}
(2011年2月)
解析: 本题的考核点是求取整数相应位上的数值的算法。 提示思路:可用整除
和求余的运算求取整数各位上的数值。方法是整除相应位上的位权值,再对其
求余,余数即为相应位上的数值。
void fun(int a, int b, long *c)
{ int a_up,a_low,b_up,b_low;
a_up=a/10; /*求正整数a 的十位数*/
a_low=a%10; /*求正整数a 的个位数*/
b_up=b/10; /*求正整数b 的十位数*/
b_low=b%10; /*求正整数b 的个位数*/
*c=a_up*1000+b_up*100+a_low*10+b_low; /*将a 数的十位和
个位数依次放在c 数的千位和十位上,b 数的十位和个位数依次放在c 数的
百位和个位上*/
}