第5章函数习题与答案_第1页
第5章函数习题与答案_第2页
第5章函数习题与答案_第3页
第5章函数习题与答案_第4页
第5章函数习题与答案_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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)D)void fun(in

4、t 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,4,3,2,1,C)1,

6、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程序的基本单位是函数B)可以

7、在一个函数中定义另一个函数C)main()函数必须放在其他函数之前D)所有被调用的函数一定要在调用之前进行定义答案:A解析: 本题综合考查C语言的概念部分,关于C语言,我们应该了解以下必须要掌握的基础知识:C程序是由函数构成的。一个函数由两部分组成:函数的首部和函数体。一个C程序总是从main函数开始执行的,而不论main函数的整个程序中的位置如何(main函数可以放在程序最开始,也可以放在程序最后,或写在一些函数之前,在另一些函数之后)。C程序在书写上,表现形式比较自由,一行内可以写几个语句,一个语句可以分写在几行上。每个语句和数据定义的最后必须有一个分号。8.若有函数内部说明:int a3

8、4;则数组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行的括号内指定形参的类型,而在括号外单独指定。选项B)中re

10、turn后面的值可以是一个表达式。选项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=312.在C语言中,变量的隐含

11、存储类别是A)autoB)staticC)externD)无存储类别答案:A解析: auto变量:无static声明的局部变量。用auto作存储类别的声明时,可以不写auto,存储类别隐含确定为auto(自动存储类别)。是动态存储方式。大多数变量是自动变量。用static声明的局部变量是静态局部变量。函数调用结束后静态局部变量占据的内存存储单元空间不释放,局部变量保留原值,下次调用时可以继续使用该值。用extern声明外部变量,外部变量即全局变量,可以用extern声明来改变全局变量的作用域,实际上,关键字“auto ”可以省略,auto不写则隐含确定为“自动存储类别”,它属于动态存储方式。1

12、3.若有以下程序#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-2);else retu

14、rn(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和register C)regis

15、ter和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; for(k=1;k0&an。

16、请填空完善函数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初值为8,b初值为3,程序运行后

18、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.阅读下列程序,则运行结果为 #include

20、 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=fun(a+b,a-b);p

21、rintf(%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(%d,p);int f(i

22、nt 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, 88, 58,4

24、2, 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,则应输出0.。#incl

25、ude #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. 编写函数fun,它的功能是:求出s

28、s 所指字符串中,指定字符的个数,并返回此值.例如:若输入字符串:,输入字符为: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(nThe number

29、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,82; printf(ma

31、x=%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(),它

32、的功能是求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是大于指定比较的数的最小的数,而它的前一个数就是小于指定比较的数的最大的数。 源程序:#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; while (ct); /*如果求得的数c比指定比较的数大时,退出循环*/ c=a; /*此时数c的前一个Fibonacci数为小于指定比较的数的最大的数*/ return c;main() int n; clrscr(); n=1000; pri

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论