《第5章函数习题与答案(共22页).doc》由会员分享,可在线阅读,更多相关《第5章函数习题与答案(共22页).doc(22页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
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.,-6)fun(15,-6)93.若有以下调用语句,则不正确的fun函数的首部是main() int a50,n;fun(n, &a9);A)void fun(int m, int x)B)void fun(int s, int h41)C)void fun(int p, int *s)
4、D)void 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;in-1;i+)for(j=i+1;jn;j+)if(aiaj)t=ai;ai=aj;aj=t;main()int aa10=1,2,3,4,5,6,7,8,9,10,i;sort(&aa3,5);for(i=0;i10;i+)printf(%d,aai);printf(n);程序运行后的输出结果是A)1,2,3,4,5,6,7,8,9,10,B)10,9,8,7,6,5
6、,4,3,2,1,C)1,2,3,8,7,6,5,4,9,10,D)1,2,10,9,8,7,6,5,4,3,答案:C解析: C语言中,实参变量和形参变量之间的数据传递是单向的“值传递”方式。指针变量作函数参也要遵循这一规则,调用函数不可能改变实参指针变量的值,但可以改变实参指针变量所指变量的值。6.在调用函数时,如果实参是简单的变量,它与对应形参之间的数据传递方式是A)地址传递B)单向值传递C)由实参传形参,再由形参传实参D)传递方式由用户指定答案:B解析: 如果实参是简单变量,它与对应形参之间的数据传递方式是由实参传给形参,而形参值的改变不能改变实参的值。7.以下叙述中正确的是A)构成C程
7、序的基本单位是函数B)可以在一个函数中定义另一个函数C)main()函数必须放在其他函数之前D)所有被调用的函数一定要在调用之前进行定义答案:A解析: 本题综合考查C语言的概念部分,关于C语言,我们应该了解以下必须要掌握的基础知识:C程序是由函数构成的。一个函数由两部分组成:函数的首部和函数体。一个C程序总是从main函数开始执行的,而不论main函数的整个程序中的位置如何(main函数可以放在程序最开始,也可以放在程序最后,或写在一些函数之前,在另一些函数之后)。C程序在书写上,表现形式比较自由,一行内可以写几个语句,一个语句可以分写在几行上。每个语句和数据定义的最后必须有一个分号。8.若有
8、函数内部说明:int a34;则数组a中各元素A)可在程序的运行阶段得到初值0B)可在程序的编译阶段得到初值0C)不能得到确定的初值D)可在程序的编译或运行阶段得到初值0答案:C解析: 我们可以把二维数组的常量表达式看做是矩阵或者表格的行数与列数,要注意每个元素有两个下标,第一个是方括号中的下标代表行号,称行下标;第二个是方括号中的下标代表列号。行下标和列下标总是从0开始的,二维数组在不赋初值时,不能得到确定。9.有以下函数char fun(char *p)return p;该函数的返回值是A)无确切的值B)形参p中存放的地址值 C)一个临时存储单元的地址D)形参p自身的地址值答案:B解析:
9、本题考查函数返回值的知识。函数返回值是通过函数中的return语句获得,return语句中的表达式的值就是所求函数的值。此表达式的值必须与函数首部所说明的类型一致。若类型不一致,则以函数值的类型为准,由系统进行转换。10.以下正确的说法是A)定义函数时,形参的类型说明可以放在函数体内B)return后边的值不能为表达式C)如果函数值的类型与返回值类型不一致,以函数值类型为准D)如果形参与实参类型不一致,以实参类型为准答案:C解析: 选项A)中定义函数时,形参的类型说明应该放在形参表列内说明。老版本C语言中,对形参类型的声明是放在函数定义的第2行,也就是不在第1行的括号内指定形参的类型,而在括号
10、外单独指定。选项B)中return后面的值可以是一个表达式。选项D)中实参与形参的类型应相同或赋值兼容。如果实参为整型而形参为实型,或者相反,则按不同类型数值的赋值规则进行转换,以形参类型为准。11.有以下程序int f(int n) if(n=1)return 1;else return f(n-1)+1;main() int i,j=0;for(i=1;i3;i+)j+=f(i);printf(%dn,j);程序运行后的输出结果是A)4B)3C)2D)1答案:B解析: 在main函数中,对f(1)和f(2)的值进行了累加。 f(1)=1 f(2)=f(1)+1=2最后,j的值为1+2=31
11、2.在C语言中,变量的隐含存储类别是A)autoB)staticC)externD)无存储类别答案:A解析: auto变量:无static声明的局部变量。用auto作存储类别的声明时,可以不写auto,存储类别隐含确定为auto(自动存储类别)。是动态存储方式。大多数变量是自动变量。用static声明的局部变量是静态局部变量。函数调用结束后静态局部变量占据的内存存储单元空间不释放,局部变量保留原值,下次调用时可以继续使用该值。用extern声明外部变量,外部变量即全局变量,可以用extern声明来改变全局变量的作用域,实际上,关键字“auto ”可以省略,auto不写则隐含确定为“自动存储类别
12、”,它属于动态存储方式。13.若有以下程序#include void f(int n);main() void f(int n);f(5);void f(int n) printf(%dn,n); 则以下叙述中不正确的是A)若只在主函数中对函数f进行说明,则只能在主函数中正确调用函数fB)若在主函数前对函数f进行说明,则在主函数和其后的其他函数中都可以正确调用函数fC)对于以上程序,编译时系统会提示出错信息:提示对f函数重复说明D)函数f无返回值,所以可用void将其类型定义为无返回值型答案:C解析: C语言规定,一个函数中调用另一个函数(即被调用函数)需要具备的条件有:首先被调用的函数必须是
13、已经存在的函数(是库函数或用户自己定义的函数)。如果使用库函数,一般还应该在本文件开头用#include命令将函数调用有关库函数时所需要到的信息“包含”到本文件中来。如果使用自定义函数,而且该函数与调用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数作声明,即向编译系统声明将要调用此函数,并将有关信息通知编译系统。在C语言中,可以使用函数原型进行声明,函数原型的一般形式为:函数类型 函数名(参数类型1,参数类型2)或函数类型 函数名(参数类型1 参数名1,参数类型2 参数名2)14. 有如下程序long fib(int n) if(n2) return(fib(n-1)+fib(n
14、-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语言允许函数值类型缺省定义,此时该函数隐含的类型是_。A) float型 B) int 型 C)long 型 D) double 型答案:B17.以下存储类型只有在使用时才为该类型变量分配内存的是_。A)auto和static B)auto和reg
15、ister 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;k=3;k+) printf(%dn,fun(x);A) 7 B) 7 C) 7 D) 7 8 9 10 7 9 11 13 7答案:A19.运行下面程序: int ff(int n) static int f=1; f=f*n; return f;main() int k; f
16、or(k=1;k0&an。请填空完善函数fun()的功能。例如:m=12,n=8时,运行结果应该是495.。#include #include float fun (int m, int n) int i;double p=1.0;for(i=1;i=m;i+)【3】;for(i=1;i=n;i+)【4】;for(i=1;i=m-n;i+)p=p/i;return p;main () clrscr();printf (p=%fn,fun (12,8);答案:【3】p=p*i 【4】p=p/i解析:本题中,欲求p的值,需要先求m,n,m-n的阶乘值,可用循环语句实现。3. 下面函数的功能是将一个
17、字符串的内容颠倒过来,请填空。void fun(char str) int i,j, 【5】 ;for(i=0,j= 【6】 ;ij;i+,j-) k=stri; stri=strj; strj=k;答案:【5】k 【6】strlen(str)-14. 下面函数是一个求阶乘的递归调用函数。请填空。int fun(int k) if(k=1)【7】 ;else return( 【8】 );答案:【7】return 1 【8】k*fun(k-1)5.下列给定程序中,函数fun()的功能是:通过某种方式实现两个变量值的交换,规定不允许增加语句和表达式。请填空完善函数fun()的功能。例如变量a初值为
18、8,b初值为3,程序运行后a中的值为3,b中的值为8。试题程序:#include #include int fun(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】&a【解析】填空1:根据题目的意思,这里应该是声名一个新的变量t,由后面的赋值语句以及返回语句可以明白这个变量应该是整型的(因为函数的返回值类型是int)。填空2:根据题目的意思,此处是子函数的返回语句,由C语言的知识,每
19、个语句的结尾都应该使用; 。填空3:fun()函数的调用方式说明fun()函数的参数应当为指针类型,即应该把变量的地址作为参数传递(符号&是取地址操作)。四.阅读程序题。1.阅读下面程序,在程序执行后的结果为 阅读下面程序,则执行后的结果为#include stdio.hmain() fun3(fun1(),fun2();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)175D)编译不通过答案:C 2.阅读下列程序,则运
20、行结果为 #include stdio.hfun() 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 stdio.hmain()int a=30,b=20,z;z=f
21、un(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=2,p;int j,k;j=i;k=+i;p=f(j,k);printf(
22、%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所指的一维数组中。二维数组中的数已在主函数中给出。【解析】本题中函数的功能是求出二维数组中每列的最大元素。首先,假设各列中的第一个元素最大,然后利用行标值的移动来依次取得各列中其他元素的值,并与假设的最大值进行
23、比较,如果遇到更大的,则把这个更大的元素看做当前该列中最大的元素,继续与该列中其他元素比较。#include #include #define M 3#define N 4void fun(int ttMN,int ppN) int i,j,max; for(j=0;jN;j+) max=tt0j; /*假设各列中的第一个元素最大*/ for(i=0;imax) /*如果各列中的其他元素比最大值还大, 则将这个更大的元素看做当前该列中最大的元素*/ max=ttij; ppj=max; /*将各列的最大值依次放入pp数组中*/ main() int tMN=68, 32, 54, 12,14,
24、 24, 88, 58,42, 22, 44, 56; int pN,i,j,k; clrscr(); printf(The riginal data is:n); for(i=0;iM;i+) for(j=0;jN;j+) printf(%6d,tij); printf(n); fun(t,p); printf(nThe result is:n); for(k=0;kN;k+) printf(%4d,pk); printf(n);2.编程实现函数fun()的功能:根据整型形参m,计算如下公式的值。y=1-1/(22)+1/(33)-1/(44)+(-1)(m+1)/(mm)例如:m中的值为5
25、,则应输出0.。#include #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,&u,&v); h=hcf(u,v); printf(H.C.F=%dn,h); l=lcd(u,v,h); printf(L.C.D=%dn,l);4.
26、写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的信息。解:/* 判断整数是否为素数 */#include stdio.hint prime(int number) int flag=1,n; for(n=2;nnumber/2&flag=1;n+) if(number%n=0) flag=0; return(flag);main() int number; printf(请输入一个正整数:n); scanf(%d,&number); if(prime(number) printf(n %d 是素数。,number); else printf(n %d 不是素数。,number);5
27、.写一函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。解:/* 字符串反序存放 */#include #include void inverse(char str) char t; int i,j; for(i=0,j=strlen(str);istrlen(str)/2;i+,j-) t=stri; stri=strj-1; strj-1=t; main() char str100; printf(输入字符串:n); scanf(%s,str); inverse(str); int k=strlen(str); printf(转换后的字符串是:%sn,str);6. 编写函数
28、fun,它的功能是:求出ss 所指字符串中,指定字符的个数,并返回此值.例如:若输入字符串:,输入字符为:1,则输出:3参考答案:#include stdio.h#define M 81int fun(char ss, char c) int i, n=0; for (i=0; ssi; i+) if(ssi=c) n+; return n; void main() char aM,ch; clrscr(); printf(nPlease enter a string:); gets(a); printf(nPlease enter a char:); ch=getchar(); printf
29、(nThe number of the char is :%dn,fun(a,ch); 7.输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。解:#include #include int main () int i=0,x=0,y=0,z=0; char ch; printf(nnttt请输入一组字符.!n); do ch=getchar(); if (ch = a & ch = A & ch = 0 ) | (ch = 9) /*注意.将 判断空格 与 判断数值 的判断代码 进行位置调换.结果会不准确 */ +x; else /* 既没有字母也没有数值.那就是其他字符咯.但
30、这样.好像不太准确.*/ +z; while(ch != n); printf(字符为 %d 数字为 %d 空格为 %d 其他字符为 %d n,i,x-1,y,z); system(pause);8.编写函数fun()实现功能:求出一个2M整型二维数组中最大元素的值,并将此值返回调用函数。#define M 4#include fun (int a2M) int i,j,max=0; for(i=0;i2;i+) for(j=0;jM;j+) if(maxaij) max=aij; return max;main() FILE *wf; int arr2M=5,8,3,45,76,-4,12,
31、82; printf(max=%dn,fun(arr); wf=fopen(out.dat,w); fprintf (wf,%d,fun(arr); fclose(wf);9.编写函数实现功能:按以下递归公式求函数值。例如:当给n输入5时,函数值为240;当给n输入3时,函数值为60。解:试题程序:#include fun(int n) int c; if(n=1) c=15; else c=fun(n-1)*2; return(c);main() int n; printf(Enter n:); scanf(%d,&n); 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。【解析】根据所给数列定义不难发现,该数列最终的结果是由两个数列之和组成,所以可以在循环内部始终把c看成是前两项之和(即第n项),而a始终代表第n-2项,b始终代表第n-1项(通过不断地重新赋值来实现)。应注意,退出循环时得到的数c是大于指定比较的数