作业━━第3章━━函数的递归调用重载默认参数

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

函数的递归调用、重载、默认参数【学习要点】1.掌握递归函数的调用及其执行过程。2.掌握递归算法的一般设计方法,掌握简单递归算法的实现。3.掌握重载函数的概念、定义和应用。4.掌握带默认值形参的概念、定义和调用规则。5.掌握内联函数的定义和实质。6.掌握C++程序的多文件结构、及其编译和连接方法。7.掌握编译预处理命令(文件包含、宏定义、条件编译)的概念和应用。-------------------------------------------------------------------------------------------------------------------------------------------------【例题分析】1.若有函数调用语句fun(a+b,(y=9,y*x),fun(y,n,k));则其实参的个数是______。A.3B.4C.5D.6【答案】A【解析】调用函数进行值传递时,调用式中对应的实参可以是常量、变量、表达式。本题的实参分别为算术表达式、逗号表达式、函数表达式共3个。2.下面描述中正确的是______。A.建立内联函数的主要目的是提高程序的执行效率B.建立内联函数的主要目的是减少程序文件所占用的内存C.内联函数的参数传递关系与一般函数的参数传递关系不同D.任意函数均可定义成为内联函数【答案】A【解析】内联函数是使用更多的存储空间,以减少执行的时间,即采用空间换取时间,以提高程序执行效率,当多次调用同一内联函数时,程序本身会增加所占用空间。除了函数体中含有循环语句、switch语句的函数不能定义为内联函数以外,其余均可定义为内联函数。内联函数的参数传递关系与一般的函数相同。3.下面程序的运行结果是______。#includeiostream.h#defines(a)a*avoidmain(){intx=1,y=2,t;t=s(x+y);couttendl;}【答案】5【解析】由于宏替换只是简单的字符替换,先用实参x+y代替形参a,而s(x+y)展开后的表达式为x+y*x+y,故程序运行结果是5。需提醒的是在进行宏定义时应注意圆括号的正确使用,本例若改为:#defines(a)(a)*(a)后,则程序运行结果是9。4.下面两个函数是否合法的重载函数______。intfc(intx,inty){return(x+y);}longfc(intx,inty){return(x*y);}【答案】不是合法的重载函数【解析】两个函数的参数类型、个数完全一样,仅是返回类型不同,不是合法的函数重载。5.下面两个函数是否合法的重载函数______。intval(intx,inty){return(x*y);}intval(int&x,int&y){return(x+y);}【答案】不是合法的重载函数【解析】引用类型变量的使用与普通变量的使用在形式上是一样的,这使得两个函数的参数类型、个数完全一样,故不是合法的函数重载。6.下面两个函数是否合法的重载函数______。intf(intx,inty){return(x*y);}intf(charx,chary){return(x+y);}【答案】要具体问题具体分析,看看该程序中对应的调用式是否会造成二义性。【解析】这个问题需要具体分析。当C++调用一个函数时,需进行实参与形参的结合,这个结合过程要将主调函数的实参表与每个重载函数的形参表进行比较,若实参表和某一个重载函数的形参表完全匹配,则调用该重载函数;若没有找到严格的匹配函数,则C++编译器会试图通过类型转换找到一个匹配函数,此时编译器可能会发现有多个重载函数匹配,从而造成了二义性。例:调用式f(2,2)、f('a','b')是正确的,而对于调用式f('a',3),编译器无法确定将它转换为f(int,int)形式,还是f(char,char)形式,会造成二义性。7.下面程序的运行结果是______。#includeiostream.hvoidf(int);voidmain(){f(3);}voidf(intn){staticints=5;inta=5;if(n!=0){s++;a++;coutn’\t’s’\t’aendl;f(n-1);}}【答案】第1行输出:366第2行输出:276第3行输出:1868.下面程序的运行结果是______。#includeiostream.hvoidfun(int);voidmain(){intk=5;fun(k);coutkendl;}voidfun(intk){if(k0)fun(k-1);coutk;}【答案】输出:01234559.编写程序:求x的n次幂的递归函数getPower(intx,intn)。分析:确立递归公式为:x;n=1getPower(x,n)=x*getPower(x,n-1);n=2【答案】编写程序如下:#includeiostream.hintgetPower(intx,intn){if(n==1)returnx;return(x*getPower(x,n-1));}voidmain(){intx,n;cout“请输入两个正整数x和n=”;cinxn;coutx“的”n“次幂=”getPower(x,n)endl;}10.用递归算法实现函数:intfactors(intnum,intk);其功能是求整数num中包含因子k的个数并返回,若num中不含k因子,则返回0。要求编写主函数main()去调用递归函数factors()。【答案】编写程序如下:#includeiostream.hintfactors(intnum,intk){if(num%k!=0)return0;return(1+factors(num/=k,k));}voidmain(){intnum,k;cout“请输入正整数num和因子数k=”;cinnumk;cout“整数”num“中含有因子”k“的个数=”;coutfactors(num,k)endl;}-------------------------------------------------------------------------------------------------------------------------------------------------【思考题】㈠选择题1.下面描述中正确的是______。A.C++程序中各函数之间不允许直接递归调用也不允许间接递归调用B.C++程序中各函数之间允许直接递归调用但不允许间接递归调用C.C++程序中各函数之间不允许直接递归调用但允许间接递归调用D.C++程序中各函数之间既允许直接递归调用也允许间接递归调用【答案】???2.下面描述中正确的是______。A.用#include命令所包含头文件的后缀不可以是“.a”B.在对某个含有错误的头文件进行修改后,包含此头文件的源程序不必重新进行编译C.宏名必须用大写字母表示D.宏替换不占用程序的运行时间【答案】???-------------------------------------------------------------------------------------------------------------------------------------------------㈡填空题1.编译预处理命令有三种,它们是______。【答案】???2.内联函数的实质是______。【答案】???-------------------------------------------------------------------------------------------------------------------------------------------------㈢写出下列程序的输出结果1.下面程序的运行结果是______。#includeiostream.hvoidf(int);voidmain(){f(3);}voidf(intn){staticints=5;inta=5;if(n!=0){s++;a++;f(n-1);coutn’\t’s’\t’aendl;}}【答案】第1行输出:???第2行输出:???第3行输出:???2.下面程序的运行结果是______。#includeiostream.hvoidfun(int);voidmain(){fun(12345);coutendl;}voidfun(intn){if(n10)fun(n/10);coutn%10;return;}【答案】输出:???3.下面程序的运行结果是______。#includeiostream.hvoidfun(int);voidmain(){fun(12345);coutendl;}voidfun(intn){coutn%10;if(n10)fun(n/10);return;}【答案】输出:???4.下面程序的运行结果是______。#includeiostream.hvoidfun(int);voidmain(){intk=5;fun(k);}voidfun(intk){coutk;if(k0)fun(k-1);coutk;}【答案】输出:???5.下面程序的运行结果是______。#includeiostream.h#defineT1(x,y)(x)*(y)#defineT2(x,y)x*yvoidmain(){inta,b,c1,c2;a=3;b=5;c1=T1(a,b);c2=T2(a,b);coutc1‘\t’c2endl;c1=T1(a+2,b+4);c2=T2(a+2,b+4);coutc1‘\t’c2endl;c1=4*T1(a+2,b+4);c2=4*T2(a+2,b+4);coutc1‘\t’c2endl;}【答案】第1行输出:???第2行输出:???第3行输出:???6.下面程序的运行结果是______。#includeiostream.hcharadd(charx,chary){cout“两个char型数据相加!\t\t”;return(x+y);}intadd(intx,inty){cout“两个int型数据相加!\t\t”;return(x+y);}floatadd(floatx,floaty){cout“两个float型数据相加!\t\t”;return(x+y);}doubleadd(doublex,doubley){cout“两个double型数据相加!\t\t”;return(x+y);}voidmain(){chara0=‘1’,b0=‘3’;inta1=1,b1=3;floata2=5.1,b2=8.1;doublea3=5.2,b3=8.2;coutadd(a0,b0)endl;coutadd(a1,b1)endl;coutadd(a2,b2)endl;coutadd(a3,b3)endl;coutadd(2,4)endl;coutadd(2.1,4.1)endl;coutadd(‘A’,‘2’)endl;//coutadd(‘A’,2)endl;//请思考:此句为何编译不通过?}【答案】第1行输出:???第2行输出:???第3行输出:???第4行输出:???第5行输出:???第6行输出:???第7行输出:???7.下面程序的运行结果是______。#includeiostream.hintadd(intx=1,inty=2,intz=3);voidmain(){intadd(

1 / 6
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功