admin 管理员组

文章数量: 1086019


2024年4月22日发(作者:手机可以学编程么)

第5章 函数

5.1典型考试题剖析

5.1.1选择题

【例1】下列程序执行后的结果是_______。

#include

f(int a)

{

int b=0;

static c=3;

a=c++,b++;

return(a);

}

main()

{

int a=2,i,k;

for(i=0;i<2;i++)

k=f(a++);

printf("%dn",k);

}

A) 3 B) 0 C) 5 D) 4

考点:变量的作用域。

分析:此题函数f中的变量c是一个静态变量。第一次调用函数时,使

用的参数是a,值为2,进入子函数f内,变量b=0,c=3,然后语句

“a=c++,b++;”是一个逗号表达式,不是赋值表达式,a被赋的值是c

的值,不同逗号表达式的值,所以a=3,此时c的值同时变为4;第二次

调用函数,使用的参数是a,值为3,进入子函数内,变量b=0,c=4(这

是静态变量的特性)。

答案:D

【例2】下面程序的输出是_______。

int w=3;

fun(int k);

main()

{

int w=10;

printf("%dn",fun(5)*w);

}

fun(int k)

{ if (k==0)

return(w);

return(fun(k-1)*k);

}

A) 360 B) 3600 C) 1080 D) 1200

考点:函数的递归调用和全局变量。

分析:此题涉及到了函数的递归调用和全局变量的用法,最容易出错的

地方是变量w,程序首先定义了全局变量w,并赋了初值为3,然后在主

函数中又定义了一个局部变量w,并赋初值为10,在子函数中引用了变

量w,一定要认清这个变量是全局变量w的值而不是主函数中局部变量w

的值。

答案:B

【例3】有以下程序

#include

int abc(int u,int v);

main()

{

int a=24,b=16,c;

c=abc(a,b);

printf("%dn",c);

}

int abc(int u,int v)

{

int w;

while(v)

{ w=u%v;

u=v;

v=w;

}

return(u);

}

输出结果为 。

A) 6 B) 7 C) 8 D) 9

考点:函数的返回值。

分析:进入子函数后,循环共执行了三次:第一次结束后w=8,u=16,v=8;

第二次结束后w=8,u=8,v=8;第三次结束后w=0,u=8,v=0。

答案:C

【例4】以下程序运行后,输出结果是_______。

int d=1;

fun(int p)

{ int d=5;

d+=p++;

printf("%d" ,d);

}

main()

{

int a=3;

fun(a);

d+=a++;

printf("%dn" ,d);

}

A) 8 4 B) 9 9 C) 9 5 D) 4 4

考点:全局变量与局部变量。

分析:此题应注意全局变量d和函数fun中定义的局部变量d的作用范

围,在子函数fun中全局变量d不起作用。

答案:A

【例5】以下程序的输出结果是_______。

int d=1;

fun(int p)

{ static int d=5;

d+=p;

printf("%d" ,d);

return(d);

}

main()

{

int a=3;

printf("%dn" ,fun(a+fun(d)));

}

A) 699 B) 669 C) 61515 D) 6615

考点:函数的调用。

分析:先求fun(d)的值,调用参数为全局变量d,其值为1,进入子函

数,参数d的值传给形参p,p的值为1,由于是第一次进入子函数,故

静态变量d的值即为初始化的值5,执行语句“d+=p;”,得到d=6,输

出第一个数值6,退出fun(d)的调用,返回函数值6到主函数中。再求

fun(a+fun(d))的值,调用参数为“a+fun(d)”,其值为9,进入子函数,

由于不是第一次进入子函数,故静态变量d的值是上一次调用后的结果,

为6,执行语句“d+=p;”,得到d=15,输出数值15,退出fun(d)的调

用,返回函数值15到主函数中。执行主函数中的输出语句,输出函数调

用fun(a+fun(d))的结果为15。

答案:C

【例6】有如下函数调用语句:

func(rec1,rec2+rec3,(rec4,rec5));

该函数调用语句中,含有的实参个数是_______。

A) 3 B) 4 C) 5 D) 有语法错

考点:实参。

分析:函数中有三个参数,分别是:一个变量rec1,一个算术运算表

达式rec2+rec3,一个逗号表达式(rec4,rec5)。

答案:A

【例7】以下程序的输出结果是_______。

int a,b;

void fun()

{

a=100;

b=200;

}

main()

{

int a=5,b=7;

fun();

printf("%d%dn" ,a,b);

}

A) 100200 B) 57 C) 200100 D) 75

考点:全局变量与局部变量。

分析:在主函数中全局变量a和b被同名的局部变量所覆盖,所以主函

数中引用 的a和b是局部变量。

答案:B

【例8】以下程序的输出结果是_______ 。

int f()

{ static int i=0;

int s=1;

s+=i;

i++;

return s;

}

main()

{

int i,a=0;

for (i=0;i<5;i++)

a+=f();

printf("%dn",a);

}

A) 20 B) 24 C) 25 D) 15

考点:无参函数的调用。

分析:这是一个无参函数的调用,在函数f中i是一个静态变量,而s

是一个局部变量,s的初值永远是1,而i的值第一次调用时是0,执行

了i++之后,第二次调用时就是1,直到4。

答案:D

【例9】以下程序的输出结果是_______。

f(int b[],int m,int n)

{ int i,s=0;

for (i=m;i

s=s+b[i];

return(s);

}

main()

{

int x,a[]={1,2,3,4,5,6,7,8,9};

x=f(a,3,7);

printf("%dn",x);

}

A) 10 B) 18 C) 8 D) 15

考点:数组的调用。

分析:已知一维数组有9个值,用子函数求得从下标3开始到下标6的

这4个数中下标为3,5这几个数之和。

答案:A

【例10】有以下程序

int f(int n)

{ if (n==1)

return(1);

else

return(f(n-1)+1);

}

main()

{

int i,j=0;

for (i=1;i<3;i++)

j+=f(i);

printf("%dn",j);

}

程序运行后的输出结果是______。

A) 4 B) 3 C) 2 D) 1

考点:递归调用。

分析:此题是一个递归调用的题目,在子函数中当n!=1时,递归调用

当前函数 f(n-1)。

答案:B

【例11】有以下程序

void f(int x ,int y)

{ int t;

if (x

{

t=x;

x=y;

y=t;

}

}

main()

{

int a=4,b=3,c=5;

f(a,b);

f(a,c);

f(b,c);

printf("%d,%d,%dn",a,b,c);

}

执行后输出的结果是_______ 。

A) 3,4,5 B) 5,3,4 C) 5,4,3 D) 4,3,5

考点:函数的返回值。

分析:此题想通过两两比较,求a,b,c三者之间从大到小的顺序,但是

由于子函数没有返回值,所以子函数的结果不影响主函数,主函数中

a,b,c的值依旧还是初始值4,3,5。

答案:D

【例12】下列函数定义中,会出现编译错误的是_______

A) max(int x, int y, int *z) B) int max(int x,y)

{*z=x>y?x:y;}

{ int z;

z=x>y?x:y;

return z;

}

C) max(int x, int y) D)

int max(int x, int y)

{ int z;

{ return(x>y?x:y);}

z=x>y?x:y;

return(z);

}

考点:子函数的格式。

分析:此题考的是子函数的格式,在子函数参数表中,要求每个变量都

必须定义一个类型,而B中x,y一起定义为int ,应该写成int x,int y。

答案:B

5.1.2填空题

【例1】下面的程序通过函数average计算数组中各元素的平均值,请填空。

float average(int pa[],int n)

{

int i;

float avg=0.0;

for (i=0;i

avg=avg+ 【1】 ;

avg= 【2】 ;

return(avg);

}

main()

{

int i,a[5]={2,4,6,8,10};

float mean;

mean=average(a,5);

printf("mean=%fn",mean);

}

考点:函数参数(数组)的调用。

分析:程序的功能是求5个数的平均值。子函数的功能是求平均数,pa

是传递过来的数组,n指明了求平均值的数据的个数。第一个空位于循

环内,是求和的语句,第二个空是求平均值。

答案:【1】pa[i] 【2】avg/n

【例2】若函数fun的类型为void,且有以下定义和调用语句:

#define M 50

main()

{

int a[M];

fun(a);

}

定义fun函数的首部可以用三种不同的形式,请写出这三种形式: 【1】 、

【2】 、 【3】 。(注意,1) 形参的名字请用q,2)使用同一种

风格)。

考点:函数和原型。

分析:此题考的是函数的原型。

答案:【1】void fun(int q[]) 【2】void fun(int q[M]) 【3】

void fun(int *q)

【例3】以下程序的输出结果为___ ____。

#include

int fun(int x,int y)

{

static int m=0,i=2;

i+=m+1;

m=i+x+y;

return m;

}

main()

{

int j=4,m=1,k;

k=fun(j,m);

printf("%d",k);

k=fun(j,m);

printf("%dn",k);

}

考点:静态局部变量。

分析:注意子函数中的变量m和I是静态局部变量,故第二次调用子函

数时,m和I的值分别是8和3,而不是0和2。

答案:8 17

【例4】以下程序输出的最后一个值是______。

int ff(int n)

{

static int f=1;

f=f*n;

return f;

}

main()

{

int i;

for (i=1;i<=5;i++)

printf("%dn",ff(i))

}

考点:静态变量。

分析:这是一个简单的变量传递的函数,在子函数中f是一个静态变量,

前一次的结果会影响下一次的初值,这个题目分别会输出1!,2!,3!,

4!,5!的值。

答案:120

【例5】若变量n中的值为24,则prnt函数共输出 【1】 行,最后

一行有 【2】 个数。

void prnt(int n,int aa[])

{

int i;

for(i=1;i<=n;i++)

{

printf("%6d",aa[i]);

if (!(i%5))

printf("n");

}

printf("n");

}

考点:函数功能。

分析:根据要求一共有24个数要输出,语句“if !(i%5)”说明个数满

了5个以后,就执行语句“printf("n");”进行换行,所以一行只输出

5个值。

答案:【1】5 【2】4

【例6】若已定义:int a[10],i;以下fun函数的功能是:在第一个循环中

给前10个数组元素依次赋1,2,3,4,5,6,7,8,9,10;在第二个循环中使a数组前

10个元素中的值对称折叠,变成1,2,3,4,5,5,4,3,2,1。请填空。

fun (int a[])

{

int i;

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

【1】 =i;

for (i=0;i<5;i++)

【2】 =a[i];

}

考点:简单函数的功能。

分析:此题的第一个循环就是将1-10分别赋给数组a[0]-a[9],第二

个循环使数组a中的前五个元素不变,后五个元素是前五个元素的逆序。

答案:【1】a[i-1] 【2】a[9-i]

【例7】有以下程序

float fun(int x,int y)

{

return(x+y);

}

main()

{

int a=2,b=5,c=8;

printf("%3.0fn",fun((int)fun(a+c,b),a-c));

}

程序运行后的输出结果是______。

考点:函数的调用。

分析:先通过子函数求出fun(a+c,b)的值,然后强行取整,之后再求

fun((int)fun(a+c,b),a-c)的值。

答案:9

【例8】若有以下程序

int f(int x,int y)

{ return(y-x)*x;

}

main()

{ int a=3,b=4,c=5,d;

d=f(f(3,4),f(3,5));

printf("%dn",d);

}

执行后输出结果是__ ___。

考点:函数的调用。

分析:先求f(3,4)的值和f(3,5)的值,再求f(f(3,4),f(3,5))的值。

答案:9

【例9】函数YangHui的功能是把杨辉三角形的数据赋给二维数组的下半三

角,形式如下:

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

其构成规律是:

(1)第0列元素和主对角线元素均为1

(2)其余元素为其左上方和正上方元素之和

(3)数据的个数每行递增1

请将程序补充完整。

#define N 6

void yanghui(int x[N][N])

{

int i,j;

x[0][0]=1;

for(i=1;i

{

x[i][0]= 【1】 =1;

for(j=1;j

x[i][j]= 【2】 ;

}

}

考点:函数的参数(二维数组)传递。

分析:要使0列元素为1,每一行i上第0列表示为x[i][0],要使主

对角线元素也为1,每一行i上的主对角线上的元素表示为x[i][i],根

据要求其余元素为其左上方和正上方元素之和,除了为1的元素之外,

其它每一个元素x[i][j]均为x[i-1][j-1]和x[i-1][j]之和。

答案:【1】x[i][i] 【2】x[i-1][j-1]+x[i-1][j]

【例10】以下程序的功能是调用函数fun计算:m=1-2+3-4+…+9-10,并输

出结果。请填空。

int fun( int n)

{

int m=0,f=1,i;

for(i=1; i<=n; i++)

{ m+=i*f;

f= 【1】 ;

}

return m;

}

main()

{

printf("m=%dn", 【2】 );

}

考点:简单的参数调用。

分析:此题由子函数求要求的内容,主函数只负责输出。在子函数中用

i×f来代表每一个要求的数,用m来累计它们的和,i的值从1变化到

10,由f为控制这10个数的符号。

答案:【1】-f 【2】m

5.2自测练习与参考答案


本文标签: 函数 子函数 考点 输出 变量