文档库 最新最全的文档下载
当前位置:文档库 › 第八章 函数

第八章 函数

文档的质量,源自对文档的精心挑选!
第八章 函数
一:选择题
【例8-1】:以下对C语言函数的有关描述中,正确的是
A)在C中,调用函数时,只能把实参的值传送给形参,形参的值不能传送给实参
B)C函数既可以嵌套定义又可以递归调用
C)函数必须有返回值,否则不能使用函数
D)C程序中有调用关系的所有函数必须放在同一个源程序文件中
解析:C函数不能嵌套定义,可以没有返回值,并且一个函数可以调用不属于同一个源文件的外部函数,所以选项B、C、D都是错误的。
答案:A
【例8-2】:以下叙述中不正确的是
A)在C中,函数的自动变量可以赋值,每调用一次,赋一次初值
B)在C中,在调用函数时,实际参数和对应形参在类型上只需赋值兼容
C)在C中,外部变量的隐含类别是自动存储类别
D)在C中,函数形参可以说明为register变量
解析:外部变量的隐含类别是全局变量,不是自动存储类别。选项A、B、D正确。
答案:C
【例8-3】:以下叙述中不正确的是
A)在不同的函数中可以使用相同名字的变量
B)函数中的形式参数是局部变量
C)在一个函数内定义的变量只在本函数范围内有效
D)在一个函数内的复合语句中定义的变量在本函数范围内有效
解析:在一个函数内复合语句中定义的变量,只能在该复合语句范围内有效,因此选项D是错误的。
答案:D
【例8-4】:当调用函数时,实参是一个数组名,则向函数传送的是
A)数组的长度
B)数组的首地址
C)数组每一个元素的地址
D)数组每个元素中的值
解析:C语言中的函数调用分为传值调用和传地址调用,而数组名其实存放的是该数组的首地址,因此当实参是数组名时,向函数传送的是该数组的首地址。
答案:B
【例8-5】:函数调用:strcat(strcpy(str1,str2),str3)功能是
A)将串str1复制到串str2中后再连接到串str3之后
B)将串str1连接到串str2之后再复制到串str3之后
C)将串str2复制到串str1中后再将串str3连接到串str1之后
D)将串str2连接到串str1之后再将串str1复制到串str3中
解析:题目中所给函数的功能是:先用函数strcpy把参数串str2复制到参数串str1中去,然后用函数strcat把参数串str3连接到经过修改后的参数串str1后,因此,选项C正确。
答案:C
【例8-6】:有以下程序:
void fun(int a,int b,int c)
{a=456;b=567;c=678;}
main()
{int x=10,y=20,z=30;
fun (x,y,z);
printf("%d,%d,%d\n",z,y,x);
}
输出结果是
A)30,20,10 B)10,20,30 C)456,567,678 D)678,567,456
解析:函数fun的x、y、z参数都是传值调用,函数体中对形参值的改变不会带回

到主函数,因此主函数中输出z,y,x的值没变,为30、20、10。
答案:A
【例8-7】:以下程序运行后,输出结果是
A)8,15 B)8,16 C)8,17 D)8,8
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,p;
 p=func(k,m);printf("%d,",p);
 p=func(k,m);printf("%d\n",p);
}
解析:本题主要考察静态变量的应用,k=4,m=1时,第一次执行函数func(4,1),i+=m+1使得i=2+(0+1)=3,m=i+a+b=3+4+1=8;主函数中并没有改变k和m的值,因此第二次仍然执行函数func(4,1),只是此时func中不再对m和i赋初值,m=8,i=3,于是i=3+(8+1)=12,m=i+a+b=12+4+1=17,返回主函数并输出17,程序结束。
答案:C
【例8-8】:以下程序运行后,输出结果是
A)84 B)99 C)95 D)44
int d=1;
fun(int p)
{ int d=5;
 d+=p++;
 printf("%d",d);
}
main()
{ int a=3;
 fun(a);
 d+=a++;
 printf("%d\n",d);
 }
解析:本题主要考察全局变量和局部变量的作用域,如果全局变量和局部变量的名字相同,那么全局变量在局部变量所在的区域不起作用。本题执行函数 fun(3)中,d+=p++使得局部变量d=5+3=8并输出,然后在主函数的d+=a++使得全局变量d=1+3=4并输出。
答案: A
【例8-9】:以下程序的输出结果是
A)54321 B)012345 C)12345 D)543210
main()
{ int w=5;
 fun(w);
 printf("\n");}
fun(int k)
{ if(k>0)fun(k-1);
 printf("%d",k);
}
解析:本题主要考察递归函数的调用。只有当实参等于0时,才会输出,然后依次递归输出1、2、3、4、5。
答案: B
【例8-10】:以下程序的输出结果是
A)6 9 9 B)6 6 9 C)6 15 15 d)6 6 15
int d=1;
fun(int p)
{ static int d=5;
 d+=p;
 printf("%d",d);
 return(d):}

文档的质量,源自对文档的精心挑选!
main()
{ int a=3;
 printf("%d\n",fun(a+fun(d)));
 }
解析:本题关键在于静态变量d,第一次执行 fun(d),即fun(1),在函数fun里对静态变量赋初值5,得到d=d+p=5+1=6并输出,然后返回6,第二次执行fun(a+fun(d)),即fun(3+6)=fun(9),在函数fun中直接执行d=d+p=6+9=15并输出,然后返回15,再一次输出。
答案:C
【例8-11】:下面程序执行后的输出结果是
A) hello B) hel C) hlo D) hlm
func1(int i);
func2(int i);
char st[ ]="hello,friend!";
func1(int i)
{ printf("%c",st[i]);
 if(i<3){i+=2;func2(i);}}
func2(int i)
{printf("%c",st[i]);
if(i<3){i+=2;func1(i);}}
main()
{int i=0;func1(i);printf("\n");}
解析:i=0,调用func1(0)函数输出st[0],h,i=2;i=2,调用func2(2)输出st[2],l,i=4;i=4;调用func1(4)函数输出st[4],o;输出换行。
答案:C
【例8-12】:有如下函数调用语句:
fun(rec1,rec2+rec3,(rec4+rec5));
该函数调用语句中,含有的实参个数是


A)3 B)4 C)5 D)有语法错误
解析:实参是以逗号分开的,其中rec2+rec3是算术表达式,(rec4,rec5)是逗号表达式,都只能算作一个参数。
答案:A
【例8-13】:有如下程序
int func(int a,int b)
{return(a+b);}
main()
{int x=2,y=5,z=8,r;
r=func(func(x,y),z);
printf("%d\n",r);}
该程序的输出结果是
A)12 B)13 C)14 D)15
解析:func(x,y)的值是7,然后又作为func的第一个参数,结果为15
答案:D
【例8-14】:有如下程序
long fib(int n)
{if(n>2)return(fib(n-1)+fib(n-2));
else return(2);}
main()
{printf("%ld\n",fib(3));}
该程序的输出结果是
A)2 B)4 C)6 D)8
解析:该题主要考察函数的递归调用,由函数fib的定义,fib(1)=2,fib(2)=2,因此fib(3)=fib(2)+fib(1)=2+2=4
答案:B

【例8-15】:在c语言中,函数的隐含存储类别是
A)auto B)static C)extern D)无存储类别
解析:C语言中如无特别说明,函数的隐含存储类别为外部extern类别。
【答案】C
【例8-16】:以下所列的各函数首部中,正确的是
A)void play(var:Integer,var b:Integer) B)void play(int a,b)
C)void play(int a,int b) D)Sub play(a as integer,b as integer)
解析:C语言中函数首部中的各参数,必须分开单独定义。因此选项C才是正确的。
答案:C
【例8-17】:以下程序的输出结果是
A)0 B)29 C)31 D)无定值
fun(int x,int y,int z)
{z=x*x+y*y;}
main()
{int a=31;
fun(5,2,a);
printf("%d",a);}
解析:实参a与形参z之间是单向传值的关系,z值的变化不会回传给a;因此a的值保持不变。该题主要考察,函数参数之间传值时,形参值的改变,不会改变实参变量的值。
答案:C
【例8-18】:以下只有在使用时才为该变量分配内存单元的存储类说明是
A)auto和static B)auto和register C)register和static D)extern 和register
解析:动态存储变量是指在动态存储区存放、动态分配存储单元的数据,包括自动变量、形参变量和寄存器变量,又随着所在函数的调用结束而释放,下一次调用时再重新分配并释放存储单元。而静态存储变量在程序编译时分配存储单元,全局变量占用固定的存储单元。
答案:B
【例8-19】:以下程序的输出结果是
A)1 B)2 C)3 D)4
long fun(int n)
{long s;
if(n==1||n==2)s=2;
else s=n-fun(n-1);
return s;}
main()
{printf("%ld\n",fun(3));}
解析:这是个简单的函数调用。根据该函数定义,fun(3)=3-fun(2)=3-2=1。
答案:A
【例8-20】:以下正确的说法是:
A) 定义函数时,形参的类型说明可以放在函数体内
B) return语句后面不能为表达式
C) 如果return后表达式的类型与函数的类型不一致,以定义函数时的函数类型为准
D) 如果形参与实参的类型不一致,以实参类型为准
解析:如果返回

值的类型与定义的函数类型不一致,会以函数类型为标准,返回值类型进行自动类型转换
答案:C
二、写出下面程序的运行结果
【例8-1】以下程序的输出结果是
#include
int s=10;
func(int a)
{ int c;
 c=a+s;
 return c;}
main()
{ int x=8,y=9,t;

文档的质量,源自对文档的精心挑选!
 t=func((x+y,x--,y++));
 printf("%d\n",t);}
解析:函数func的参数只有一个,调用函数func时的实参是逗号表达式,其值为表达式y++的值,为9,s为全局变量,故函数func中执行语句c=a+s;后得c=19,c值返回给主函数的变量t,因此,输出为19。
答案: 19
【例8-2】以下程序的输出结果是
int t(int x,int y,int cp,int dp)
{ cp=x*x+y*y;
 dp=x*x-y*y;}
main()
{ int a=4,b=3,c=5,d=6;
 t(a,b,c,d);
 printf("%d %d\n",c,d);}
解析:由于函数t中的4个参数都是传值调用。函数体对形参值的改变不会返回给实参,因此主函数中c和d的值没有改变。
答案:5 6
【例8-3】以下程序的输出结果是
void fun()
{ static int a=0;
 a+=2;
 printf("%d",a);}
main()
{ int cc;
 for(cc=1;cc<4;cc++)fun();
 printf("\n");}
解析:该题主要考察静态变量的引用,C语言中静态变量的初始化只执行一次,以后直接引用。在本题中,cc从1~3共执行3次循环。第一次调用函数fun,对静态变量a赋出值0,并加2后输出;第二次再调用函数,直接加2输出。
答案: 246
【例8-4】以下程序的输出结果是
#include
void fun()
{ static int x=0;
 int y=0;
 printf("x=%d,y=%d\n",++x,++y);
}
main()
{ int k=0;
 while(k++<3)
fun();}
解析:x为局部静态变量,只在编译时,赋一次初值,每次函数调用是在原值的基础上加1,y是auto存储类别的局部变量,每次调用函数临时分配内存并赋初值0,在初值0的基础上加1。
答案: x=1,y=1
x=2,y=1
x=3,y=1
【例8-5】下面程序从终端输入123,则输出结果为
#include
main()
{int reverse();
reverse();
printf("\n");}
int reverse()
 { char c;
if((c=getchar())!='\n')
reverse();
putchar( c);
return(0);}
解析:程序递归调用reverse函数,每调用一次,从终端读取一个字符,直到读取到行结束标志'\0',最后读取字符为3。如果不细心,很容易认为只是输出字符3。但不要忘了,在执行if语句后,要执行putchar(c);语句,因此,每调用一次reverse函数,最终都要执行一次putchar(c);语句,最后一次调用时最先执行putchar(c);语句,从而实现反向输出输入的字符串。
答案:321
三:程序填空
【例8-1】以下程序中,主函数调用了LineMax函数,实现在3行4列的二维数组中,找出每一行上最大值。
void LineMax(int x[3][4])
{int i,j,p;
fo

r(i=0;i<3;i++)
{ p=0;
 for(j=1;j<4;j++)
if(x[i][p]printf("The max value in line %d is %d\n,i", ② );}}
main()
{int x[3][4]={1,5,7,4,2,6,4,3,8,2,3,1};
③ ;
}
解析:解答该题的关健在于理解i,j,p的意义,i和j不难理解,i是行循环的横坐标,j是列循环的纵坐标,而p是每一行里最大值的纵坐标。
首先,在i循环里的p=0是假设每一行的第一个元素为最大,然后在j循环里对当前最大元素x[i][p]与该行中的每一个元素x[i][j]比较,如果前者小,那么就要更新p的值,使p=j。显而易见,printf语句所输出当前行的最大值即为x[i][p]。
主函数中主要考察函数调用,该题又包含传地址的调用,将实参数组x的地址传给函数LineMax中的形参x。
答案:① p=j ②x[i][p] ③ LineMax(x)
【例8-2】函数 fun 的功能是:使一个字符串按逆序存放。
void fun(char str[ ])
{ char m;
 int i,j;
 for(i=0,j=strlen(str);i< ① ;i++,j--)
{m=str[i];
str[i]=②;
str[j-1]=m;}
 printf("%s\n",str);}
解析:i和j分别指向字符串的首尾字符,通过中间字符变量m交换下标为i和j-1(因为最后一个字符是字符串结束号'\0')的字符,有 str[i]=str[i-1].再通过循环变量的改变i++,j--,从两头往中间搜索交换,达到逆序存放字符串。因此,循环共执行字符串长度的一半,有i答案: ①strlen(str)/2 ② str[j-1]
四、程序改错
【例8-1】下面函数把两个字符串s1与s2连接起来
[1] con(char s1[],s2[])
[2] {int i=0,j=0;
[3] while(s1[i]!='\0')i++;
[4] while(s2[j]!='\0')s1[i++]=s2[j++];
[5] s1[i]='\0';}
解析:本题考点是函数形参的使用。在定义函数时,函数名后面括号中的变量称为形参,形参之间以逗号分隔。形参是函数的内部变量,只在函数的内部才有意义。对每个形参必须单独指明其数据类型和名字。
答案:错误:第[1]行 改正:con(char s1[],char s2[])


文档的质量,源自对文档的精心挑选!

相关文档
相关文档 最新文档