C语言程序设计题库 第五章:函数

一、单选题

1、以下正确的说法是_______。
A、用户若需调用标准库函数,调用前必须重新定义。
B、用户可以重新定义标准库函数,若如此,该函数将失去原有含义。
C、系统根本不允许用户重新定义标准库函数。
D、用户若需调用标准库函数,调用前不必使用预编译命令将该函数所在文件包括到用户源文件中,由系统自动去调用。

解析:解析:答案选C

2、以下正确的函数形式是_______。
A、double fun( int x , int y )
{
z = x + y ;
return z ;
}
B、fun( int x , y )
{
int z ;
return z ;
}
C、fun( x , y )
{
int x , y ;
double z ;
z = x + y ;
return z ;
}
D、double fun( int x , int y )
{
double z ;
z = x + y ;
return z ;
}

解析:答案选D
函数的组成:返回类型 函数名(函数参数, 函数参数,…){语句项;}
A、函数体中的变量z未定义。选项A错误。
B、如果没有对函数类型未加说明,则该函数默认为隐含类型int,即返回值必须为int型,形式参数y没有指定类型,函数体z未初始化。选项B错误。
C、形式参数x、y没有指定类型。选项C错误。
D、选项D正确。

3、如果一个函数没D有返回值,那么该函数的类型应该定义为______。
A、int
B、char
C、float
D、void

解析:答案选D

4、C语言允许函数值类型缺省定义,此时该函数值隐含的类型是_______。
A、int
B、char
C、float
D、void

解析:答案选A
如果没有对函数类型未加说明,则该函数默认为隐含类型int,即返回值必须为int型。

5、以下说法不正确的是_______。
A、实参可以是常量、变量或表达式
B、形参可以是常量、变量或表达式
C、形参如果存在则一定是变量
D、形参应与其对应的实参类型一致

解析:答案选B
C语言形参和实参的区别:转载自:C语言形参和实参的区别(非常详细)
C语言函数的参数会出现在两个地方,分别是函数定义处和函数调用处,这两个地方的参数是有区别的:
形参(形式参数)
在函数定义中出现的参数可以看做是一个占位符,它没有数据,只能等到函数被调用时接收传递进来的数据,所以称为形式参数,简称形参。
实参(实际参数)
函数被调用时给出的参数包含了实实在在的数据,会被函数内部的代码使用,所以称为实际参数,简称实参。
形参和实参的功能是传递数据,发生函数调用时,实参的值会传递给形参。
形参和实参的区别和联系
1)形参变量只有在函数被调用时才会分配内存,调用结束后,立刻释放内存,所以形参变量只有在函数内部有效,不能在函数外部使用。
2)实参可以是常量、变量、表达式、函数等,无论实参是何种类型的数据,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参,所以应该提前用赋值、输入等办法使实参获得确定值。
3)实参和形参在数量上、类型上、顺序上必须严格一致,否则会发生“类型不匹配”的错误。当然,如果能够进行自动类型转换,或者进行了强制类型转换,那么实参类型也可以不同于形参类型。
4)函数调用中发生的数据传递是单向的,只能把实参的值传递给形参,而不能把形参的值反向地传递给实参;换句话说,一旦完成数据的传递,实参和形参就再也没有瓜葛了,所以,在函数调用过程中,形参的值发生改变并不会影响实参。

6、一个函数形参的作用域是_______。
A、main函数
B、形参所在函数体
C、从定义处到文件尾
D、整个程序

解析:答案选B
作用域(scope):它是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。
1)局部变量的作用域是变量所在的局部范围。
2)全局变量的作用域是整个工程。
生命周期:变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段。
1)局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
2)全局变量的生命周期是:整个程序的生命周期。选项B正确。

7、以下关于形参和实参的说明中,错误的是_______
A、简单变量实参和形参占用不同的内存单元,即使同名也相互不影响
B、实参在进行函数调用时,它们都必须有确定的值,以便把这些值传给形参
C、实参对形参的数据传送是双向的,可以把实参的值传给形参,也可以把形参的值反向传给实参
D、形参变量只有在被调用时才分配内存单元

解析:答案选C
A、形参变量只有在被调用时才分配内存单元,在调用结束时, 即刻释放所分配的内存单元。因此,形参只有在函数内部有效。 函数调用结束返回主调函数后则不能再使用该形参变量。 实参和其所对应的形参分别占用不同的存储单元,彼此之间不影响。选项A正确。
B、实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值。选项B正确。
C、在一般传值调用的机制中只能把实参传送给形参,而不能把形参的值反向地传送给实参。因此在函数调用过程中,形参值发生改变,而实参中的值不会变化。选项C错误。
D、形参变量只有在被调用时才分配内存单元。选项D正确。

8、C语言规定,简单变量做实参时,它和对应形参之间的数据传递方式是_______。
A、地址传递
B、单向值传递
C、由实参传递给形参,再由形参传回给实参
D、由用户指定传递方式

解析:答案选B

9、关于函数调用的形式,以下错误的描述是________。
A、可以出现在执行语句中
B、可以出现在一个表达式中
C、可以作为一个函数的实参
D、可以作为一个函数的形参

解析:答案选D

10、C语言规定,函数返回值的类型是由________。
A、return语句中的表达式类型所决定
B、调用该函数时的主调函数类型所决定
C、调用该函数时系统临时决定
D、在定义该函数所指定的函数类型所决定

解析:答案选D

11、以下函数原型声明语句正确的是_______。
A、void f( int x ) ;
B、void f( x ) ;
C、void f( int x )
D、void( int x ) ;

解析:答案选A
A、函数的声明:返回类型 函数名(函数参数, 函数参数,…);(注意有分号)。选项A正确。
A、函数参数未定义类型。选项B错误。
C、函数末尾没有分号。选项C错误。
D、函数缺少函数名。选项D错误。

12、以下不正确的说法是_______。
A、在不同函数中可以使用相同名字的变量
B、形式参数是局部变量
C、在函数内定义的变量只在本函数范围内有效
D、在函数内的复合语句中定义的变量在本函数范围内有效

解析:答案选D
A、在不同函数中可以使用相同名字的变量。选项A正确。
B、形式参数是局部变量,作用域为函数内部。选项B正确。
C、形参变量只有在被调用时才分配内存单元,在调用结束时, 即刻释放所分配的内存单元。因此,形参只有在函数内部有效。选项C正确。
D、在函数内的复合语句中定义的变量只在复合语句的范围内有效,请看示例一:
在这里插入图片描述
在这里插入图片描述
13、凡在函数中未指定存储类型的局部变量,其隐含的存储类型为______。
A、自动(auto)
B、静态(static)
C、外部(extern)
D、寄存器(register)

解析:答案选A
函数中未指定存储类别的局部变量,其隐含的存储类别为自动存储类别(auto)。函数中的局部变量,如果不专门声明为static存储类别,都是动态的分配存储空间的,数据存储在动态存储区中。

14、能正确求解两单精度数之和的程序是________。
A、float add(float x,float y)
{ float r;
r=x+y;
return r;
}
B、float add(float x, y)
{ float r;
r=x+y;
return r;
}
C、int add(float x,float y)
{ float r;
r=x+y;
return r;
}
D、void add(float x,float y)
{ int r;
r=x+y;
return r;
}

解析:答案选A
A、选项A正确。
B、形式参数y未定义类型。选项B错误。
C、按照实际,函数返回类型应为float。选项C错误。
D、按照实际,函数返回类型应为float,并且变量r应定义为float。选项D错误。

15、以下说法中正确的是______
A、组成C语言程序的基本单位是主程序,程序总是从第一个定义的函数开始执行
B、组成C语言程序的基本单位是子程序,程序中要调用的函数必须在main()函数中定义
C、组成C语言程序的基本单位是函数,程序总是从main()函数开始执行
D、组成C语言程序的基本单位是过程,程序中的main()函数必须放在程序的开始部分

解析:答案选C
C语言程序是由函数构成,函数可以是库函数和自定义函数。C语言程序总是从main()函数开始执行。在函数体内,可以调用其它函数,但不能定义另一个函数,即函数可以嵌套调用,但不能嵌套定义。函数(包括main()函数)可以放在文件的任何位置。选项C正确。

16、C语言规定,调用一个函数时,实参变量和形参变量之间的数据传递方式是________。
A、地址传递
B、单向值传递
C、由实参传给形参,并由形参传回给实参
D、由用户指定传递方式

解析:答案选B
在调用函数时,系统会按对应的顺序用实参的值初始化形参。实参是表达式,简单的表达式可以是常量或变量,形参是被调函数的局部变量(在调用函数时分配空间)。实参初始化形参是将实参表达式的值赋给形参变量。如果实参是变量,则实参和形参有各自的存储单元,形参的改变,不能改变实参的值。选项B正确。

17、以下程序的运行结果是________。

#include <stdio.h>
int func (int a,int b)
{ int c ;
c = a+b ;
return c ;
}
int main ()
{ int x=6,y=7,z=8,r ;
r=func ((x--,y++,x+y), z--) ;
printf ("%d \n",r) ;
return 0;
}

A、11
B、20
C、21
D、31

解析:答案选C
func的功能是加法运算两个参数并返回两者和,(x–,y++,x+y)是逗号表达式,逗号表达式会从左往右依次计算,但是表达式的值是最后一个表达式的值并作为函数的第一个参数,逗号表达式的值为13,13和8之和为21。选项C正确。
程序运行截图
在这里插入图片描述
18、C语言中函数返回值的类型是由__________决定的。
A、return语句中的表达式类型
B、调用该函数的主调函数类型
C、调用函数时临时
D、定义函数时所指定的函数类型

解析:答案选D
函数的类型决定了函数返回值的类型。选项D正确。

19、已知一个函数的定义如下:

double fun(int x, double y)
{ …… }

则该函数正确的函数原型声明语句为:
A、double fun (int x,double y)
B、fun (int x,double y) ;
C、double fun (int ,double );
D、fun(x,y);

解析:答案选C
A、函数声明末尾缺少分号。选项A错误。
B、函数声明缺少函数类型。选项B错误。
C、选项C正确。
D、函数声明缺少参数类型和函数返回。选项D错误。

20、以下程序运行输出结果是________。

#include <stdio.h>

int fun1(int x,int y)
{ return x>y?x:y; }

int fun2(int x,int y)
{ return x>y?y:x; }

int main()
{ int a=4, b=3, c=5, d=2, e, f, g;
e=fun2(fun1(a,b),fun1(c,d));
f=fun1(fun2(a,b),fun2(c,d));
g=a+b+c+d-e-f;
printf("%d,%d,%d\n",e,f,g);
return 0;
}

A、4,3,7
B、3,4,7
C、5,2,7
D、2,5,7

解析:答案选A
函数功能:fun1求较大值,fun2求较小值。
fun1(a,b)=4,fun1(c,d)=5,所以e=fun2(4,5)=4;fun2(a,b)=3,fun2(c,d)=2,所以f=fun1(3,2)=3;g=a+b+c+d-e-f=4+3+5+2-4-3=7,所以打印结果为:4,3,7。选项A正确。

21、以下程序运行结果是________。

#include <stdio.h>
int fun (int x,int y)
{ if (x!=y)
return ((x+y),2);
else
return (x);
}

int main()
{ int a=4, b=5, c=6;
printf("%d\n",fun(2*a,fun(b,c)));
return 0;
}

A、11
B、6
C、8
D、2

解析:答案选D
函数功能:两个参数不同返回2,相同返回第一个参数的值。
fun(b,c)=2, fun(2*a,2)=2。
程序运行截图
在这里插入图片描述
22、以下程序运行结果是________。

#include <stdio.h>
int d=1;

void fun(int p)
{ 
int d=5;
d+=p++;
printf ("%d ",d);
}

int main()
{ int a=3 ;
fun(a);
d+=a++;
printf("%d ",d) ;
return 0;
}

A、8 4
B、9 6
C、9 4
D、8 5
解析:答案选A
详细步骤:
在这里插入图片描述
23、在程序执行过程中,该程序的某一个函数func ()中说明的static型变量x有这样的特性:
A、x存在于func()被调用期间且仅能被func()所用
B、x存在于整个程序执行过程中且仅能被 func() 所用
C、x存在于func()被调用期间且可被所有函数所用
D、x存在于整个程序执行过程中且可被所有函数所用

解析:答案选B
static修饰局部变量:存放在内存静态区的变量,生命周期变长了,作用域不变;
static修饰全局变量:变量只能在当前.c文件中使用;
static修饰函数:函数只能在当前文件使用。

24、以下程序的正确运行结果是________。

#include <stdio.h>
void num()
{ extern int x,y;
int a=15,b=10;
x=a-b;
y=a+b;
}
int x, y;
int main(void)
{ int a=7,b=5;
x=a+b;
y=a-b;
num();
printf("%d, %d\n", x, y);
return 0;
}

A、12,2
B、不确定
C、5,25
D、1,12
解析:答案选C
详细步骤
在这里插入图片描述

二、填空题

25、下面程序的运行结果是________。

#include<stdio.h>
int main( )
{ 
       int max( int x , int y ) ;
       int a = 1 , b = 2 , c ;
       c = max( a , b ) ;
       printf( "max is %d\n" , c ) ;
    return 0 ;
}
int max( int x , int y )
{ 
       int z ;
       z = ( x > y ) ? x : y ;
       return z ;
}

解析:答案为:max is 2
函数功能:返回两个参数中的较大值,所以打印:max is 2。
程序运行截图
在这里插入图片描述
26、下面程序的运行结果是________。

#include<stdio.h>
int main( )
{ 
       void f( int x , int y ) ;
       int a = 1 , b = 2 ;
       f( a , b ) ;
       printf( "a=%d,b=%d\n" , a , b ) ;
    return 0 ;
}
void f( int x , int y )
{ 
       x = 100 ;
       y = 200 ;
}

解析:答案为:a=1,b=2
函数功能:函数没有任何作用,因为是传值调用,函数没有返回值,x、y是局部变量,退出函数即销毁,没有将a和b的值改变,所以打印:a=1,b=2。
程序运行截图
在这里插入图片描述

27、下面程序的运行结果是________。

#include<stdio.h>
int main( )
{
       void increment( ) ;
       increment( ) ;
       increment( ) ;
       increment( ) ;
return 0 ;
}
void increment( )
{
       int x = 0 ;
       x += 1 ;
       printf( "%d\t" , x ) ;
}

解析:答案为:1 1 1(包括三个1一共24位)
函数功能:打印1,每一次进入局部变量都会重新创建并初始化为1,离开函数局部变量又会销毁,所以每次打印结果都一样,打印:1 1 1。如果需要实现123递增效果的话,需要在int x=0;语句前加上static。
程序运行截图
在这里插入图片描述
在这里插入图片描述
28、下面程序的运行结果是______。

#include<stdio.h>
int main( )
{
       int f( int a );
       int a = 2 , i;
       for( i = 0 ; i < 3 ; i++ )
              printf( "%4d" , f( a ) );
    return 0;
}
int f( int a )
{
    int b = 0;
    static int c = 3;
    b++;
    c++;
    return ( a + b + c );
}

解析:答案为: 7 8 9
详细步骤:
在这里插入图片描述
程序运行截图:
在这里插入图片描述
29、下面程序的运行结果是________。

#include<stdio.h>
int main( )
{
       int func( int a , int b );
       int k = 4 , m = 1 , p;
       p = func( k , m );
              printf( "%d\t" , p );
       p = func( k , m );
             printf( "%d\n" , p );
    return 0;
}
int func( int a , int b )
{
       static int m = 0 , i = 2;
       i += m + 1;
       m = i + a + b;
       return m;
}

解析:答案为:8 17
详细步骤
在这里插入图片描述
程序运行截图:
在这里插入图片描述
30、下面程序的运行结果是________。

#include<stdio.h>
int a[3] ;
int main( ) 
{
       void f1( );
       void f2( );
       void print( );
       f1( );
       print( );
       f2( );
       print( );
    return 0;
}
void f1( )
{
       int i ;
       for ( i = 0 ; i < 3 ; i++ )
              a[i] = i ;
}
void f2( )
{
       int i ,a[3] ;
       for ( i = 0 ; i < 3 ; i++ )
              a[i] = i ;
}
void print( )
{
       int i ;
       for ( i = 0 ; i < 3 ; i++ )
              printf( "%3d" , a[i] ) ;
}

解析:答案为: 0 1 2 0 1 2
详细步骤:
在这里插入图片描述
程序运行截图:
在这里插入图片描述
31、下面程序的功能是:area函数计算圆的面积,main函数中调用area函数,计算给定半径的圆的面积,输出时显示两位小数。请填空。

#include<stdio.h>
#define PI 3.14
int main( )
{
       __________________;
       float x = 2.4 , y ;
       y = area( x ) ;
       printf( "%6.2f\n" , y ) ;
  	  return 0 ;
}
float area ( float r )
{
       float s ;
       s= PI * r * r ;
       ____________;
}

解析:答案为:float area ( float r )和return s;
注意到本提函数area未进行声明且缺少返回值,所以答案为float area ( float r )和return s。

32、下面程序的功能是:fun函数实现x的y次方的计算,main函数中调用fun函数,计算4的3次方的值。请填空。

#include<stdio.h>
int main( )
{ 
       double fun( double x , int y ) ;
       int y = 3 ;
       double x = 4 , z ;
       __________________;
       printf( "z=%f\n" , z ) ;
       return 0 ;
}
double fun( double x , int y )
{
       int i ;
       double z = 1 ;
    for( i = 1 ; i <= y ; i++ 
              _________________;
    return  z ;
}  

解析:答案为:z=fun( x , y )和z=zx
第一处应该填函数调用:z=fun( x , y );
第二处应该填x的累乘:z=z
x或者z*=x。

33、以下程序的运行结果是____, ____, 。

#include <stdio.h>
void func(int y)
{ ++y;
printf("%d, ",y);
}
int main()
{ int x=5;
func(x);
printf("%d",x);
return 0;
}

解析:答案为:6和5

在这里插入图片描述
程序运行截图:
在这里插入图片描述
34、阅读以下程序,填空写出函数的首部。

____fun(____s1, ____s2, float s3)
{ printf("%d %lf %f",s1,s2,s3); }
int main()
{ int s1, double s2, float s3 ;
int n;fun(s1,s2,s3);return 0;
}

解析:解析:答案为:void、int和double
函数没有返回值,因此函数返回类型为void,因为语句printf(“%d %lf %f”,s1,s2,s3);知形参s1格式化打印用%d,因此类型为int,形参s2格式化打印用%lf,因此类型为double。

35、以下程序的运行结果是:b=____。

#include <stdio.h>
int test()
{ 
float a=5.7;
return a;
}
int main( )
{ int b;
b=test();
printf("b=%d\n",b);
return 0;
}

解析:答案为:5
详细步骤:
在这里插入图片描述
程序运行截图:
在这里插入图片描述
36、写出被调函数的原型声明语句

#include <stdio.h>
____;
int main()
{ int a=2,b=5,c=8;
printf("%3.0f\n",fun((int)fun(a+c,b),a-c));
return 0;
}
float fun(int x,int y)
{ return(x+y); }

解析:答案为:float fun( int x, int y );
自定义函数声明格式为:返回类型 函数名(函数参数, 函数参数,…);(注意有分号)。
所以应该声明函数fun,格式为:float fun( int x, int y );

37、以下程序运行结果是____________。

#include <stdio.h>
void fun(int x)
{ 
if(x/2>0) 
fun(x/2);
printf("%d ",x);
}
int main()
{ 
fun(6);
printf("\n");
return 0;
}

解析:答案为:1 3 6
详细解析:
在这里插入图片描述
函数的递归流程图如下:
在这里插入图片描述
程序运行截图:
在这里插入图片描述

38、以下程序运行结果是____。

#include <stdio.h>
int fun (int a,int b)
{ 
if (b==0)
return a;
else
return (fun(--a,--b));
}
int main()
{ 
printf("%d\n",fun(4,2));
return 0;
}

解析:答案为:
函数的递归流程图如下:
在这里插入图片描述
程序运行截图:
在这里插入图片描述
39、请完善以下程序。

#include <stdio.h>
#include <____>
double fun(int n)
{ double s=0.0;
int i;
for(i=0; i<n;i++) //从0~n中找既能被5整除同时又能被11整除的数
if(i%5==0&&i%11==0)
s=s+i;
s=sqrt(s); //对s求平方根
return s;
}
int main()
{ printf("s=%f\n", fun(100));
return 0;
}

解析:答案为:math.h
调用系统库函数,必须包含其对应的头文件,因为函数必须先声明后使用,在头文件包含了库函数的原型声明。本程序中使用了sqrt(s)数学库函数,其声明在头文件math.h中。

40、以下程序运行结果是____。

#include <stdio.h>
int fun(int n);
int main()
{ 
int a=3,s;
s=fun(a);
s=s+fun(a);
printf("%d",s);
return 0;
}
int fun(int n)
{ static int a=1;
n+=a++;
return n;
}

解析:答案为:9
详细步骤:
在这里插入图片描述
程序运行截图:
在这里插入图片描述

41、求1~n之间所有数的平方根。工程名为sqrtList,由f1.c和f2.c两程序。

源程序文件f1.c的内容:
#include <stdio.h>
int main( )
{ int num;
void SqrtList(int n);
scanf("%d",&num);
if(num>0) SqrtList(num);
return 0;
}
源程序文件f2.c:的内容:
#include <stdio.h>
#include <math.h>
void SqrtList(int n)
{ int i;
for( i=1; i<=n; i++)
printf("sqrt(%d)=%lf\n", i,sqrt(i));
}

输入5,程序的运行结果是____。
解析:答案为:
1 1.000000
2 1.414214
3 1.732051
4 2.000000
5 2.236068
详细步骤:
在这里插入图片描述
程序运行截图:
在这里插入图片描述
42、以下程序的运行结果是____。

源程序文件f1.c
#include <stdio.h>
void funb(); /* 或extern void funb(); */
static void funa()
{ printf("f1--funa "); }
int main( )
{ funa();
funb();
return 0;
}
源程序文件f2.c
#include <stdio.h>
static void funa()
{ printf("f2--funa\n"); }
void funb()
{ funa(); }

解析:答案为:f1–funa f2–funa
static修饰函数:函数只能在当前文件使用,本题中的static修饰f2.c中的funa()函数,所以f2.c中的funa()函数只能在f2.c中使用,static修饰f1.c中的funa()函数,所以f1.c中的funa()函数只能在f1.c中使用,main()函数在f1.c文件中,所以进入main()函数后第一次调用funa()函数时调用的是f1.c中的funa()函数,打印:f1—funa, f1.c文件可以调用f2.c中的funb(),调用f2.c中的funb()后会进入函数调用f2.c中的funa()函数,打印:f2—funa,综上,打印f1—funa<换行> f2—funa<换行>。
程序运行截图:
在这里插入图片描述

三、简答题

43、以下程序能否正常执行?

源程序文件f1.c
#include<stdio.h>
static int A;
int main()
{ 
int power(int);
int b=3, c, d, m;
scanf("%d%d",&A,&m);
d=power(m);
printf("%d^%d=%d\n",A,m,d);
return 0;
}
源程序文件f2.c
extern A;
int power(int n)
{ int i,y=1;
for(i=1;i<=n;i++)
y=y*A;
return(y);
}

解析:案为:不能
因为static修饰的全局变量A只能在当前文件使用。
程序运行截图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一直学不会编程的小徐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值