2024年6月8日发(作者:)

函数习题

一.选择题

1.以下正确的说法是 B 。

A)用户若需要调用标准库函数,调用前必须重新定义

B)用户可以重新定义标准库函数,如若此,该函数将失去原有定义

C)系统不允许用户重新定义标准库函数

D)用户若需要使用标准库函数,调用前不必使用预处理命令将该函数所在的头文件包含编译,系

统会自动调用。

2.以下正确的函数定义是 D 。

A)double fun(int x, int y) B)double fun(int x,y)

{ z=x+y ; return z ; } { int z ; return z ;}

C)fun (x,y) D)double fun (int x, int y)

{ int x, y ; double z ; { double z ;

z=x+y ; return z ; } return z ; }

Page 1 of 30

3.以下正确的说法是 D 。

A)实参和与其对应的形参各占用独立的存储单元

B)实参和与其对应的形参共占用一个存储单元

C)只有当实参和与其对应的形参同名时才共占用相同的存储单元

D)形参时虚拟的,不占用存储单元

4.以下正确的函数声明是 C 。

A)double fun(int x , int y) B)double fun(int x ; int y)

C)double fun(int x , int y) ; D)double fun(int x,y)

5.若调用一个函数,且此函数中没有return语句,则正确的说法是 D 。

A)该函数没有返回值

B)该函数返回若干个系统默认值

C)能返回一个用户所希望的函数值

D)返回一个不确定的值

6.以下不正确的说法是 B 。

Page 2 of 30

A)实参可以是常量,变量或表达式

B)形参可以是常量,变量或表达式

C)实参可以为任意类型

D)如果形参和实参的类型不一致,以形参类型为准

7.C语言规定,简单变量做实参时,它和对应的形参之间的数据传递方式是 B 。

A)地址传递

B)值传递

C)有实参传给形参,再由形参传给实参

D)由用户指定传递方式

8.C语言规定,函数返回值的类型是由 D 决定的。

A)return语句中的表达式类型 B)调用该函数时的主调函数类型

C)调用该函数时由系统临时 D)在定义函数时所指定的函数类型

9.以下正确的描述是 B 。

A)函数的定义可以嵌套,但函数的调用不可以嵌套

Page 3 of 30

B)函数的定义不可以嵌套,但函数的调用可以嵌套

C)函数的定义和函数的调用均不可以嵌套

D)函数的定义和函数的调用均可以嵌套

10.若用数组名作为函数调用的实参,传递给形参的是 A 。

A)数组的首地址 B)数组中第一个元素的值

C)数组中的全部元素的值 D)数组元素的个数

11.如果在一个函数中的复合语句中定义了一个变量,则该变量 A 。

A)只在该复合语句中有定义 B)在该函数中有定义

C)在本程序范围内有定义 D)为非法变量

12.以下不正确的说法是 D 。

A)在不同函数中可以使用相同名字的变量

B)形式参数是局部变量

C)在函数内定义的变量只在本函数范围内有定义

D)在函数内的复合语句中定义的变量在本函数范围内有定义

Page 4 of 30

13.以下不正确的说法是 B 。

A)形参的存储单元是动态分配的

B)函数中的局部变量都是动态存储

C)全局变量都是静态存储

D)动态分配的变量的存储空间在函数结束调用后就被释放了

14.下面程序的输出是 A 。(不同的编译系统可能有不同的结果,

int i=2 ;

printf(“%d%d%d”,i*=2,++i,i++) ;

A) 8,4,2 B)8,4,3 C)4,4,5 D)4,5,6

15.已知一个函数的定义如下:

double fun(int x, double y)

{ …… }

则该函数正确的函数原型声明为: C

A)double fun (int x,double y) B)fun (int x,double y)

Page 5 of 30

6,3,2)

C)double fun (int ,double ); D)fun(x,y) ;

16关于函数声明,以下不正确的说法是 C 。

A)如果函数定义出现在函数调用之前,可以不必加函数原型声明

B)如果在所有函数定义之前,在函数外部已做了声明,则各个主调函数不必再做函数原型声明

C)函数再调用之前,一定要声明函数原型,保证编译系统进行全面的调用检查

D)标准库不需要函数原型声明

17.以下不正确的说法是 D 。

A)全局变量,静态变量的初值是在编译时指定的

B)静态变量如果没有指定初值,则其初值为0

C)局部变量如果没有指定初值,则其初值不确定

D)函数中的静态变量在函数每次调用时,都会重新设置初值

18.以下不正确的说法是 B 。

A)register变量可以提高变量使用的执行效率

B)register变量由于使用的是CPU的寄存器,其数目是有限制的

Page 6 of 30

C)extern变量定义的存储空间按变量类型分配

D)全局变量使得函数之间的“耦合性”更加紧密,不利于模块化的要求

二.填空题

1.C语言函数返回类型的默认定义类型是 int 。

2.函数调用语句:fun((a,b),(c,d,e))实参个数为 2 。

3.函数的实参传递到形参有两种方式: 值传递 和 地址传递 。

4.在一个函数内部调用另一个函数的调用方式称为 嵌套调用 。在一个函数内部直接或间接调

用该函数自身成为函数 递归 的调用方式。

5.C语言变量按其作用域分为 外部变量 和 内部变量 。按其生存期分为 全局变

量 和 局部变量 。

6.已知函数定义:void dothat(int n,double x) { …… },其函数声明的两种写法为

void dothat(int n,double x);和

void dothat(int,double); 。

7.C语言变量的存储类别有 auto , extern , register 和

static 。

Page 7 of 30

8.凡在函数中未指定存储类别的局部变量,其默认的存储类别为 auto 。

9.在一个C程序中,若要定义一个只允许本源程序文件中所有函数使用的全局变量,则该变量需要

定义的存储类别为 static 。

10.变量被赋初值可以分为两个阶段:即 编译阶段 和 运行阶段 。

三.程序阅读题

1.写出下面程序的运行结果。

func (int a,int b)

{ static int m=0,i=2;

i+=m+1;

m=i+a+b;

return (m);

}

main ( )

{ int k=4,m=1,p1,p2;

Page 8 of 30

p1=func(k,m) ; p2=func(k,m) ;

printf(“%d,%dn”,p1,p2) ;

}

8,17

2.写出下面程序的运行结果。

# define MAX 10

int a[MAX], i ;

sub1 ( )

{ for (i=0; i

}

sub2 ( )

{ int a[MAX], i ,max ;

max=5;

for (i=0; i

Page 9 of 30

}

sub3 (int a[ ])

{ int i ;

for (i=0; i

printf(“n”);

}

main ( )

{ sub1( ); sub3(a); sub2( ); sub3(a);

}

0 2 4 6 8 10 12 14 16 18

0 2 4 6 8 10 12 14 16 18

3.若输入的值是-125,写出下面程序的运行结果。

#include

fun (int n)

Page 10 of 30

{ int k,r ;

for (k=2; k<=sqrt(n); k++) {

r = n % k ;

while (!r) {

printf(“%d”,k); n=n/k;

if (n>1) printf(“*”);

r = n % k ;

}

}

if (n!=1) printf(“%dn”,n);

}

main ( )

{ int n ;

scanf(“%d”,&n);

Page 11 of 30

printf(“%d=”,n);

if (n<0) printf(“-”);

n = fabs(n); fun(n);

}

-125=-5*5*5

4.写出下面程序的运行结果。

int i=0;

fun1 (int i)

{ i = (i%i)*(i*i)/(2*i)+4 ;

printf(“i=%dn”,i);

return (i) ;

}

fun2(int i)

{ i = i<=2 ? 5 : 0 ;

Page 12 of 30

return (i) ;

}

main ( )

{ int i = 5 ;

fun2(i/2) ; printf(“i=%dn”,i) ;

fun2(i=i/2) ; printf(“i=%dn”,i) ;

fun2(i/2) ; printf(“i=%dn”,i) ;

fun1(i/2) ; printf(“i=%dn”,i) ;

}

i=5

i=2

i=2

i=4

i=2

Page 13 of 30

5.写出下面程序的功能。

func (int n)

{ int i,j,k;

i=n/100; j=n/10-i*10 ; k=n%10 ;

if (i*100+j*10+k) == i*i*i+j*j*j+k*k*k) return n ;

return 0;

}

main ( )

{ int n,k ;

for (n=100; n<1000 ; n++)

if (k=func(n)) printf(“%d”,k) ;

}

153 370 371 407

四.程序判断题

Page 14 of 30

1.下面add函数求两个参数的和;判断下面程序的正误,如果错误请改正过来。

void add(int a,int b) 改为 int

{ int c ;

c = a + b;

return (c) ;

}

2.下面函数fun的功能是:将长整型数中偶数位置上的数依次取出,构成一个新数返回,例如,当

s中的数为:87653142时,则返回的数为:8642;判断下面程序的正误,如果错误请改正过来。

long fun(long s)

{ long t , sl=1;

int d ;

t = 0 ;

while ( s > 0 ) {

d = s%10;

Page 15 of 30

if (d%2=0) { 改为 = =

t=d* sl+ t;

sl *= 10;

}

s = 10;

}

return (t);

}

3.下面函数fun的功能是:统计字符串s中各元音字母(即A,E,I,O,U)的个数,注意:字母不分大,

小写;判断下面程序的正误,如果错误请改正过来。

fun (char s[ ], int num[5])

{ int k; i=5;

for (k=0; k

num[i]=0;

Page 16 of 30

for (k=0; s[k]; k++) {

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; break;

}

if (i >= 0)

num[i]++;

}

}

4.函数fun的功能是:根据整型形参m,计算如下公式的值:

Page 17 of 30

y

111



100*100200*200300*300

1

m*m

判断下面程序的正误,如果错误请改正过来。

fun (int m)

{ double y = 0, d ;

int i ;

for ( i =100; i <= m;i += 100 ) {

d = (double) i * (double) I ; 改为i

y += 1.0 / d ;

}

return ( y ) ;

}

5.下面函数fun的功能是:依次取出字符串中所有数字字符,形成新的字符串,并取代原字符串;

判断下面程序的正误,如果错误请改正过来。

void fun (char s[ ])

Page 18 of 30

{ int i,j;

for (i=0,j=0; s[i]!=’0’; i++)

if (s[i]>=’0’ && s[i]<=’9’)

s[j]=s[i]; 改为s[j++]

s[j]=”0”;

}

五.程序填空题

1.下面函数用“折半查找法”从有10个数的a数组中对关键字m查找,若找到,返回其下标值,

否则返回-1,请填(2)空使程序完整。

经典算法提示:

折半查找法的思路是先确定待查元素的范围,将其分成两半,然后比较位于中间点元素的值。如果

该待查元素的值大于中间点元素的值,则将范围重新定义为大于中间点元素的范围,反之亦反。

int search(int a[10],int m)

{ int x1=0,x2=0,mid ;

while (x1<=x2) {

Page 19 of 30

mid = (x1+x2)/2;

if (m

else if (m>a[mid]) 【2 x1=mid+1 】;

else return (mid) ;

}

return (-1) ;

}

函数的作用是删除有序数组a中的指定元素x,n为数组a的元素个数,函数返回删除后的数

组a元素个数,请填(2)空使程序完整。

int del (int a[10],int n,int x)

{ int p=0,i ;

while (x>=a[p]&&p

【1 p++ 】;

for (i=p-1; i

Page 20 of 30

【2 a[i]=a[i+1] 】;

return (n-1) ;

}

xyzy

xyzy

,请填(3)空使程序完整。 3.以下程序的功能是计算函数

F(x,y,z)

# include

【1 float fun(float a,float b) 】;

main ( )

{ float x,y,z,f ;

scanf(“%f,%f,%f”,&x,&y,&z);

f = fun (【2 x+y,x-y 】);

f += fun (【3 z+y,z-y 】);

printf(“f=%d”,f);

}

float fun(float a,float b)

Page 21 of 30

{ return (a/b) ;

}

函数的作用是计算数组array的平均值返回,请填(3)空使程序完整。

float avg(float array[10])

{ int i ;

float avgr , sum=0 ;

for (i=1; 【1 i<10 】; i++)

sum+=【2 array[i] 】;

avgr = sum / 10 ;

【3 return avgr 】;

}

六.编程题

1.写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结

果,且两个整数的输入也在主函数。

Page 22 of 30

#include

int max(int m,int n)

{ int w;

while (n) {

w= m%n ;

m= n;

n=w;

}

return m;

}

int min(int m,int n){

return m*n/max(m,n);

}

main(){

Page 23 of 30

int m,n;

scanf("%d,%d",&m,&n);

printf("%d ,%dn",max(m,n),min(m,n));

}

2.写一个判素数的函数,在主函数输入一个数,输出是否为素数的信息。

#include

#include

int prime(int m)

{ int i;

for(i=2;i<=sqrt(m);i++)

if(m%i==0)

return 0;

return 1;

}

Page 24 of 30

main(){

int m;

scanf("%d",&m);

if(prime(m))

printf("%d isn", m);

else

printf("%d is notn", m);

}

3.写一个函数,使给定的一个二维数组(N×N)转置,即行列互换。(N是不大于10的数,由输入

决定)。(可不作)

4.编写一个fun函数void fun(char s1[],char s2[]),将两个字符串s1和s2连接起来存放在s1中。

void fun(char s1[],char s2[])

{

int i,j;

Page 25 of 30

for(i=0;s1[i]!=’0’;i++);

for(j=0;(s1[i]=s2[j])!=’0’;i++,j++);

}

5.编写一个fun函数:long fun(char s[]),将一个数字字符串转换为一个整数(不得调用标准库函

数)。例如,若输入字符串“-1234”,则函数把它转换为整数值-1234。

#include

long fun(char s[]){

int i, n, sign;

for (i = 0; isspace(s[i]); i++) /* skip white space */

;

sign = (s[i] == '-') ? -1 : 1;

if (s[i] == '+' || s[i] == '-') /* skip sign */

i++;

for (n = 0; isdigit(s[i]); i++)

Page 26 of 30

n = 10 * n + (s[i] - '0');

return sign * n;

}

6.编写一个fun函数:int fun(int a[], int n),删去一维数组中所有相同的数,使之只剩一个。数组中

的数已按由小到大的顺序排列,函数返回删除后数组中数据的个数。例如,一维数组中的数据是:2 2 2

3 4 4 5 6 6 6 7 7 8 9 9 10 10 10,删除后,数组中的内容应该是:2 3 4 5 6 7 8 9 10(可不作)

#include

int fun(int a[], int n){

int i,j;

for(i=1,j=0;i

if(a[j]!=a[i]){

j++;

a[j]=a[i];

}

return j+1;

Page 27 of 30

}

main(){

int m,n;

int a[100]={1,2,2,2,3,3,4,4,4,5,5,6};

n=fun(a,12);

for(m=0;m

printf("%d ", a[m]);

}

7.提高题:写一个函数,输入一个4位整数,要求输出这个数的4个数字字符,但每个字符间空一

个格。

#define N 5

#include

void fun(int n){

int i,j=0;

Page 28 of 30

char s[N];

while(n)

{

i=n%10;

s[j++]=i+'0';

n=n/10;

}

s[j]='0';

for(i=j-1;i>=0;i--)

printf("%c ",s[i]);

}

main(){

int m;

scanf("%d",&m);

Page 29 of 30

fun(m);

}

Page 30 of 30