1、第 5 章函数 习题及解答一选择题。1.若已定义的函数有返回值,则以下关于该函数调用的叙述中错误的是A)函数调用可以作为独立的语句存在 B)函数调用可以作为一个函数的实参C)函数调用可以出现在表达式中 D)函数调用可以作为一个函数的形参答案:D解析: 本题综合考查函数的调用方式。函数的形参和实参具有以下特点:形参变量只有在被调用时才分配内存单元,在调用结束时, 即刻释放所分配的内存单元。因此,形参只有在函数内部有效。 函数调用结束返回主调函数后则不能再使用该形参变量。实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形
2、参。 因此应预先用赋值,输入等办法使实参获得确定值。实参和形参在数量上,类型上,顺序上应严格一致, 否则会发生“类型不匹配”的错误。函数调用中发生的数据传送是单向的。 即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。2.有以下程序int fun(int x,int y)return(x+y);main()int a=2,b=5,c=8;printf(“%dn“,fun(int)fun(a+c,b),a-c) );程序运行后的输出结果是A)编译出错B)9C)21D)9.0答案:B解析: 本题考查函数的综合知识。首先,我
3、们可以利用强制转换类型转换运算符将一个表达式转换成所需类型。如:(double)a是将a转换成double类型;(int)(x+y)是将x+y的值转换成整型。本题可按部就班地逐步运算:fun(int)fun(a+c,b),a-c)fun(int)fun(10,5),2-8)fun(int)15.000000,-6)fun(15,-6)93.若有以下调用语句,则不正确的fun函数的首部是main() int a50,n;fun(n, A)void fun(int m, int x )B)void fun(int s, int h41 )C)void fun(int p, int *s)D)voi
4、d fun(int n, int a)答案:D解析: 函数定义的一般形式为:类型说明符 函数名()类型说明语句根据 fun 函数的调用语句可知,fun 函数的第二个参数是一个地址值。4.以下说法正确的是A)C语言程序总是从第一个的函数开始执行B)在C语言程序中,要调用函数必须在main()函数中定义C)C语言程序总是从main()函数开始执行D)C 语言程序中的 main()函数必须放在程序的开始部分答案:C解析: C 语言的程序是由主函数 main()开始运行,由主函数来调用其他函数,所以,选项 A)错误。C 语言中定义的函数必须是并列的,不能在一个函数中定义其他函数,选项 B)错。函数必须
5、先定义后使用,在调用函数以前要定义函数,而 main()函数不必放在最前面,故选项 D)错。5.以下程序中函数sort的功能是对a数组中的数据进行由大到小的排序void sort(int a,int n)int i,j,t;for(i=0;ivoid f(int n);main() void f(int n);f(5);void f(int n) printf(“%dn“,n); 则以下叙述中不正确的是A)若只在主函数中对函数f进行说明,则只能在主函数中正确调用函数fB)若在主函数前对函数f进行说明,则在主函数和其后的其他函数中都可以正确调用函数fC)对于以上程序,编译时系统会提示出错信息:提
6、示对f函数重复说明D)函数 f 无返回值,所以可用 void 将其类型定义为无返回值型答案:C解析: C语言规定,一个函数中调用另一个函数(即被调用函数)需要具备的条件有:首先被调用的函数必须是已经存在的函数(是库函数或用户自己定义的函数) 。如果使用库函数,一般还应该在本文件开头用#include命令将函数调用有关库函数时所需要到的信息“包含”到本文件中来。如果使用自定义函数,而且该函数与调用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数作声明,即向编译系统声明将要调用此函数,并将有关信息通知编译系统。在C语言中,可以使用函数原型进行声明,函数原型的一般形式为:函数类型 函数名
7、(参数类型1,参数类型2)或函数类型 函数名(参数类型1 参数名1,参数类型2 参数名2)14. 有如下程序long fib(int n) if(n2) return(fib(n-1)+fib(n-2);else return(2);void main() printf(“%dn”,fib(3);该程序的输出结果是A) 2 B) 4 C) 6 D) 8答案:B15. 有如下函数调用语句func(rec1,rec2+rec3,(rec4,rec5);该函数调用语句中,含有的实参个数是A) 3 B) 4 C) 5 D) 有语法错答案:A16.C语言允许函数值类型缺省定义,此时该函数隐含的类型是_。
8、A) float 型 B) int 型 C)long 型 D) double 型答案:B17.以下存储类型只有在使用时才为该类型变量分配内存的是_。A)auto 和 static B)auto 和 register C)register 和 static D)static 和extern答案:B18. 设有以下函数:fun(int x)int y=0;static int z=2;y+; z+;return(x+y+z);若在下面主程序中调用该函数,则输出结果是_。main()int x=3,k;for(k=1;k0double p=1.0;for(i=1;i#include int fun(
9、int *x,int y)【9】 t;t=*x;*x=y;return(t);main()int a=3,b=8;printf(“%d %dn “,a,b);b=fun(【10】,b);printf(“%d %dn “,a,b);答案:【9】int 【10】“ 。填空3:fun()函数的调用方式说明fun()函数的参数应当为指针类型,即应该把变量的地址作为参数传递(符号“fun1() int k=20;return k;fun2() int a=15;return a;fun3(int a,int b) int k;k=(a-b)*(a+b);printf(“%dn“,k);A)0B)184C
10、)175D)编译不通过答案:C 2.阅读下列程序,则运行结果为 #include “stdio.h“fun() static int x=5;x+;return x;main() int i,x;for(i=0;i2)return(fun(n-1)+fun(n-2) );else return(2);main()printf(“%ldn“,fun(5) );答案:10【命题目的】考查对于函数的递归的掌握情况。【解题要点】这是使用递归算法求著名的菲波拉奇数列,并要熟悉函数的递归方法的调用。【考点链接】递归的函数调用必须要有使递归结束的条件。4.阅读下面程序,则程序的执行结果为 #include
11、“stdio.h“main()int a=30,b=20,z;z=fun(a+b,a-b);printf(“%dn“,z);fun(int a,int b)int z;z=a/b;return z;答案:5【命题目的】考查对于函数的调用和返回值的掌握情况。【解题要点】函数调用的时候,函数名字必须与所调用的函数名完全一致,形参与实参类型要一致,在没有给出函数返回值类型的情况下,默认为整形,当返回值为整型的函数放到主函数后面时,可以不需要事先说明就调用这个函数。【考点链接】retrun 既可以返回一个普通常量,也可以返回一个指针变量。5.阅读下面程序,则程序的执行结果为 main() int i=
12、2,p;int j,k;j=i;k=+i;p=f(j,k);printf(“%d“,p);int f(int a,int b) int c;if(ab)c=1;else if(a=b)c=0;else c=-1;return(c);答案:-1解析: 函数调用相当于f(2,3) ,程序运算应得结果为“-1” 。五编写程序题。1.请编一个函数void fun(int ttMN, int ppN), tt指向一个M行N列的二维数组,求出二维数组每列中最大元素,并依次放入pp所指的一维数组中。二维数组中的数已在主函数中给出。【解析】本题中函数的功能是求出二维数组中每列的最大元素。首先,假设各列中的第一
13、个元素最大,然后利用行标值的移动来依次取得各列中其他元素的值,并与假设的最大值进行比较,如果遇到更大的,则把这个更大的元素看做当前该列中最大的元素,继续与该列中其他元素比较。#include #include #define M 3#define N 4void fun(int ttMN,int ppN)int i,j,max;for(j=0;jmax) /*如果各列中的其他元素比最大值还大,则将这个更大的元素看做当前该列中最大的元素*/max=ttij;ppj=max; /*将各列的最大值依次放入pp数组中*/main()int tMN=68, 32, 54, 12,14, 24, 88,
14、58,42, 22, 44, 56;int pN,i,j,k;clrscr();printf(“The riginal data is:n“);for(i=0;i#include double fun(int m) double y=1.0;double j=1.0;int i;for(i=2; iv)t=u;u=v;v=t;a=u;b=v;while(r=b%a)!=0)b=a;a=r;return(a);int lcd(int u,int v,int h)return(u*v/h);main()int u,v,h,l;scanf(“%d,%d“,h=hcf(u,v);printf(“H.C
15、.F=%dn“,h);l=lcd(u,v,h);printf(“L.C.D=%dn“,l);4.写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的信息。解:/* 判断整数是否为素数 */#include “stdio.h“int prime(int number)int flag=1,n;for(n=2;n#include void inverse(char str)char t;int i,j;for(i=0,j=strlen(str);i#include int main ()int i=0,x=0,y=0,z=0;char ch;printf(“nnttt 请输入一组字符!n“
16、);doch=getchar();if (ch = a for(i=0;ifun(int n)int c;if(n=1)c=15;elsec=fun(n-1)*2;return(c);main()int n;printf(“Enter n:“);scanf(“%d“,printf(“The result :%dnn“,fun(n);10. 请编写函数fun(),它的功能是求Fibonacci数列中小于t的最大的一个数,结果由函数返回。其中Fibonacci数列F(n)的定义为F(0)0,F(1)1F(n)=F(n-1)+F(n-2)例如:t=1000时 ,函数值为987。【解析】根据所给数列定
17、义不难发现,该数列最终的结果是由两个数列之和组成,所以可以在循环内部始终把c看成是前两项之和(即第n项),而a始终代表第n-2项,b始终代表第n-1项(通过不断地重新赋值来实现)。应注意,退出循环时得到的数c是大于指定比较的数的最小的数,而它的前一个数就是小于指定比较的数的最大的数。源程序:#include #include #include int fun(int t)int a=1,b=1,c=0,i; /*a代表第n-2项,b代表第n-1项,c代表第n项*/*如果求得的数c比指定比较的数小,则计算下一个Fibonacci数,对a,b重新置数*/do c=a+b;a=b;b=c; whil
18、e (c void shxs( void) int i,j,k,n; for (n=100;n# include str_cat(char a,char b) int i=0,m,n;m=strlen(a)+1;n=strlen(b);for (i=0;i#includevoid root(double a,double b,double c) double diata,x1,x2,firstp;if(a=0)printf(“Input error“);elsediata=b*b-4*a*c;firstp=-2*a/b;if(fabs(diata)1e-6)x1=firstp+sqrt(diata)/(2*a*c);x2=firstp-sqrt(diata)/(2*a*c);printf(“有两个不相等的根:x1=%.2f,x2=%.2f“,x1,x2);elsex1=sqrt(-diata)/(2*a*b);printf(“有两个复根:x1=%.2f+%.2fi,x2=%.2f-%.2fi“,firstp,x1,firstp,x1);void main(void)double a,b,c;puts(“Please input a b c like 1.2 3 4“);scanf(“%f%f%f“,root(a,b,c);