C++第三章课后习题

如果可以,还请点个赞

3-1C++中的函数是什么?什么叫主调函数?什么叫被调函数?二者之间有什么区别?

解:C++程序是由一组变量或是函数的外部对象组成的。 函数是一个自我包含的完成一定相关功能的执行代码段。我们可以把函数看成一个“黑盒子”,你只要将数据送进去就能得到结果,而函数内部究竟是如何工作的,外部程序是不知道的。外部程序所知道的仅限于输入给函数什么以及函数输出什么。函数提供了编制程序的手段,使之容易读、写、理解、排除错误、修改和维护。
C++程序中函数的数目实际上是不限的,如果说有什么限制的话,那就是,一个C++程序中必须至少有一个函数,而且其中必须有一个并且仅有一个以main为名的函数,这个函数称为主函数,整个程序从这个主函数开始执行。
C++语言程序鼓励和提倡人们把一个大问题划分成一个个子问题,对应于解决一个子问题编制一个函数,因此,C++语言程序一般是由大量的小函数而不是由少量大函数构成的,即所谓“小函数构成大程序”。这样的好处是让各部分相互充分独立,并且任务单一。因而这些充分独立的小模块也可以作为一种固定规格的小“构件”, 用来构成新的大程序。
被调函数:被调用的函数为被调函数,调用该函数的函数为主调函数。

3-2观察下面程序的运行输出,和你设想的有何不同?仔细体会引用的用法。

解:
在这里插入图片描述可通过重新赋值改变引用的值

3-3比较值传递和引用传递的相同点和不同点。

解:
传值
是把实参的值赋值给形参
那么对形参的修改,不会影响实参的值
传引用
真正的以地址的方式传递参数
传递以后,形参和实参都是同一个对象,只是他们名字不同而已
对形参的修改将影响实参的值

3-4什么叫内联函数?它有哪些特点?

解:
定义时使用关键字inline的函数叫做内联函数。编译器在编译时在调用处用函数体进行替换,节省了参数传递、控制转移等开销。使用内联函数时应注意以下几点:

(1)内联函数体内不能有循环语句和switch 语句;

(2)内联函数的定义必须出现在内联函数第一次被调用之前;(3)对内联函数不能进行异常接口声明。

3-5函数原型中的参数名与函数定义中的参数名以及函数调用中的参数名必须一致吗?

解:
不必须,形参与实参是分离的,只需形参与实参参数类型相同即可,函数调用时,形参与实参结合,返回给主调函数。

3-6调用被重载的函数时,通过什么来区分调用的时哪个函数?

解:
通过形参类型和形参的个数来区分。

3-7完成函数。参数为两个unsigned short int型数,返回值为第一个参数除以第二个参数的结果,数据类型为short int;如果第二个参数为0,则返回值为-1.在主函数中实现输入输出。在这里插入图片描述

3-8编写函数把华氏温度转换成摄氏温度,公式为C=5/9(F-32),在主函数中提示用户输入一个华氏度,转化后输出相应的摄氏温度。

解:
在这里插入图片描述//设定函数的返回值时应该用double型,否则分数除法得出来的结果为0

3-9编写函数判别一个数是否是一个质数,在主程序中实现输入输出。

解:
在这里插入图片描述//通过遍历的方法,用要判断的数从1开始一个一个的除,看有没有余数,如果全部都没有证明这个数是质数,否则为非质数。

编写函数求两个整数的最大公约数和最小公倍数。

解:
//最大公约数求法(辗转相除法,欧几里得法):大数除以小数,取余,再用这条式子的被除数除以余数,再取余,以此类推直到余数为0;
例如,求(319,377):
∵ 319÷377=0(余319)
∴(319,377)=(377,319);
∵ 377÷319=1(余58)
∴(377,319)=(319,58);
∵ 319÷58=5(余29)
∴ (319,58)=(58,29);
∵ 58÷29=2(余0)
∴ (58,29)= 29;
∴ (319,377)=29。
//两个数的乘积 = 两个数的最大公约数 * 最小公倍数
在这里插入图片描述

3-11什么叫做嵌套调用?什么叫做递归?

解:
嵌套调用就是这个函数里面调用了其他函数,几个函数合起来用。
递归就是这个函数自己本身调用了自己,在函数体内行使本身这个函数的功能。

3-12在主程序中提示输入整数n,编写函数用递归的方法求1+2+3+……+n的值。

解:
在这里插入图片描述

3-13用递归的方法编写函数求Fibonacci级数,公式为Fn = Fn-1+Fn-2,F1 = F2 = 1,观察递归调用的过程。

解:
在这里插入图片描述真恐怖,我就试了个20就那样了,你们可以试试一百要花多长时间

3-14用递归的方法编写函数求n阶勒让德多项式的值,在主函数中实现输入输出。递归公式为

Pn(x) = {1 n=0
{x n=1
{[(2n-1)x*Pn-1(x)-(n-1)Pn-2(x)]/n n>1
解:
在这里插入图片描述

3-15编写递归函数getPower计算x的平方,在同一个程序中针对整型和实型实现两个重载的函数:

int getPower(int x,int y); //整型形式,当y<0时,返回0
double getPower(double x,int y); //实型形式
在主程序中实现输入输出,分别输入一个整数a和一个实数b作为底数,在输入一个整数m作为指数,输出a的m次方和b的m次方。另外请读者思考,如果在调用getPower函数计算a的m次方时希望得到一个实型的结果(实型结果表示范围更大,而且可以准确表示m<0时的结果),该如何调用?
在这里插入图片描述//函数重载的情况只要调用时注意对应形参的类型和形参的个数就好了

3-16当函数发生递归调用时,同一个局部变量在不同递归深度上可以同时存在不同的取值,这在底层时如何做到的?

解:
递归函数被调用时,系统会运行一个运行工作栈,用来保存信息,包括(调用函数的返回地址,调用函数的局部变量值),在没进入下一层递归调用时,系统就建立一个新的工作记录,并把这个工作记录压栈;;每返回一层递归调用,就出栈一个工作记录。
相信看到这你应该能明白了。其实递归调用和普通函数调用很相似,只不过是递归调用是调用自身而已,或者是几个函数相互调用,导致循环递归。
这类问题你看看 微机原理 或者 计算机组成原理 会很容易理解的。

  • 10
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值