C++基础教程
——
作业及参考答案全部汇总文档
节3函数阶段作业

最新版本V2.0
王道C++团队
COPYRIGHT ⓒ 2021-2024. 王道版权所有

基础题篇

Gn!

下面都是一些基础的语法、概念编程练习题。

函数基础语法练习题

Gn!

编写函数实现以下功能:

  1. 键盘录入一个正整数,请判断它是否是一个素数,然后控制台输出对应的结果。要对键盘录入的数据做参数校验,素数是一个大于1的自然数,它仅能被1和自身整除。

  2. 键盘录入两个整数:底(base)和幂指数(exponent),计算base的exponent次幂,并打印输出对应的结果。(注意底和幂指数都可能是负数)

提示:求幂运算时,基础的思路就是先无脑把指数转换成正数,然后累乘,最后再根据指数是否是负数决定是否取倒数。

非常简单且基础的语法练习题,如果这种题目都还有疑惑,说明代码量几乎为0,语法也几乎不熟悉,建议直接看参考代码先熟悉语法。

参考代码如下:

参考代码:

第一题,判断素数:

第二题参考代码:

以上。

函数基础语法练习题2

Gn!

键盘录入三个边长(整数即可),然后用海伦公式计算三角形的面积(如果它确实是一个三角形的话)

海伦公式求三角形面积:

题目2-海伦公式

要求基于下列两个函数完成这个编程题:

注意:不要忘记使用sqrt函数要包含头文件<math.h>

非常简单且基础的语法练习题,如果这种题目都还有疑惑,说明代码量几乎为0,语法也几乎不熟悉,建议直接看参考代码先熟悉语法。

参考代码如下:

参考代码:

以上。

变量种类/值传递等读程序题

Gn!

读下列一段程序代码,回答以下一些问题。

问题一:

通过modify函数调用,能不能修改"param_a"和"param_b"的取值呢?为什么?

问题二:

能不能在main函数当中访问静态局部变量"static_local"呢?为什么?

问题三:

全局变量"global"使用static修饰,这里的static关键字是什么作用?

问题四:

modify函数的两次调用中,"printf"输出打印的自身局部变量"local"的取值是一样的吗?为什么?

问题五:

modify函数内部修改了全局变量"global"的取值,两次调用"printf"函数输出的结果是什么?为什么?

问题六:

modify函数内部修改了静态局部变量"static_local"的取值,两次调用"printf"函数输出的结果是什么?为什么?

问题七:

modify_global函数希望修改"global"全局变量的取值,可以修改成功吗?为什么?

参考回答如下:

问题一:

通过 modify 函数调用,能不能修改 param_aparam_b 的取值呢?为什么?

答:不能修改。

因为 C 语言中函数参数是值传递,实参的值会被拷贝一份传递给形参 param,函数内部对 param 的任何修改都只作用于这份拷贝,而不会影响原变量 param_aparam_b 的值。

问题二:

能不能在 main 函数当中访问静态局部变量 static_local 呢?为什么?

答:不能访问。

因为 static_local 是定义在 test函数 内部的静态局部变量,它的作用域仅限于该函数内部,main 函数无法访问到它,因为并不在作用域范围内。即便静态局部变量生命周期贯穿整个程序运行期间,但它依然无法在函数外部被访问,这就是作用域产生的影响。

问题三:

全局变量 global 使用 static 修饰,这里的 static 关键字是什么作用?

答:将该全局变量的作用域限制在当前问题内部,而不再是整个工程全局都可以访问的了。

也就是说,static int global = 1; 这个变量只能在当前源文件中使用,不能被其他文件访问。

在这个语法中,static非常类似C++面向对象封装机制的访问权限修饰符,即private私有权限修饰符,用于限制变量的外部可见性。

问题四:

modify 函数的两次调用中,printf 输出打印的自身局部变量 local 的取值是一样的吗?为什么?

答:是一样的,都是2。

modify 函数中,local 是一个普通局部变量,每次调用函数时都会重新创建并初始化为 1,然后执行 local *= 2

而不同的函数调用之间,局部变量是独立不互相影响的。

所以不管调用多少次这个函数,其结果都是"local = 2"。

问题五:

modify 函数内部修改了全局变量 global 的取值,两次调用 printf 函数输出的结果是什么?为什么?

答:

  1. 第一次调用后,global 由 1 变为 2(global *= 2);

  2. 第二次调用后,global 再次变为 4。

原因global 是一个全局变量,在函数中直接访问并修改,每次调用函数都会让其值翻倍,且值在全局作用域内持续保留。

问题六:

modify 函数内部修改了静态局部变量 static_local 的取值,两次调用 printf 函数输出的结果是什么?为什么?

答:

  1. 第一次调用:static_local = 1 × 2 = 2

  2. 第二次调用:static_local = 2 × 2 = 4

原因static_local 是一个静态局部变量,其生命周期贯穿整个程序运行过程,在同一个函数的多次函数调用间保持上次的值,所以每次调用会继续累积变化。

问题七:

modify_global 函数希望修改 global 全局变量的取值,可以修改成功吗?为什么?

答:不能修改成功!

modify_global 函数中的参数名是 global,它与全局变量同名,会屏蔽(隐藏)全局变量,函数内部操作的是这个形参的副本,而不是全局变量本身。

再加上是值传递,修改形参也不会影响实参,所以全局变量不会被改变。

以上。

交互式简易计算器-函数/全局变量

Gn!

实现一个终端交互式的简易计算器,交互的形式大体如下:

题目3-示意图

要求至少提供四种运算加减乘除,如下:

并且在结束进程时,打印总共执行操作的次数。(也就是这些函数调用的次数)

注意:除法的实现,要求判断除数不为0,并且在除数为0时使用exit表示异常退出进程。

要求:需要编写一个函数,用于随时随地打印当前操作的执行次数,也就是打印上述四个函数的调用次数。

思考一下:这个变量应该设置为什么变量呢?

参考代码如下:

参考代码:

以上。

递归练习题

Gn!

(1) 汉诺塔

有三根杆子A,B,C。A杆上有 N 个 (N>1) 穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至 C 杆:

  1. 每次只能移动一个圆盘;

  2. 大盘不能叠在小盘上面。

利用递归的方式,打印出移动轨迹。运行结果如下图所示:

题目4-示意图

(2) 十进制转换成二进制

给定任意一个非负十进制整数,请利用递归的方式,求解它的二进制表示方式

基本的思路是:把该整数除以2得到余数,然后倒着输出余数。

思考一下:如何实现倒着打印余数呢?

参考代码如下:

参考代码如下:

第一题,求解汉诺塔移动轨迹,参考代码:

第二题,十进制转换成二进制参考代码:

以上。

扩展题篇

Gn!

以下题目都属于扩展题。

扩展:打印目标步骤汉诺塔移动轨迹

Gn!

汉诺塔移动轨迹的扩展题,感兴趣且学有余力可以研究一下,不做统一要求。

现在你已经知道如何打印n个盘子汉诺塔问题的移动轨迹了,那么在这个的基础上,我们进行以下扩展:

对于n个盘子的汉诺塔问题,给定一个整数m,要求在控制台打印出m + 1步的移动轨迹。

程序的运行图如下所示:

扩展题1-示意图

提示:

既然要打印m + 1步的移动轨迹,那么肯定需要计数器记录移动的步骤,需要用什么变量呢?

核心思路就还是move函数的递归,但要加上一个计数器,实际编码时注意边界值就可以了。

参考代码如下:

参考代码如下:

以上。

The End