[C和指针] ch07. 函数

第七章:函数

GitHub 链接:ch07. 函数

函数式编程,面向过程。

本章总结及注意点

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


部分课后习题解答

7.10 问题

  1. 可在其内部打印一句话,表示它已被调用。

  2. 我认为,没有半毛钱优点…严格的规范,学起来才简单。

    参考答案:它的一个优点是它允许您变得懒惰;可以编写的代码更少。其他的后果,比如能够用错误的参数数或类型调用函数,是所有缺点。

  3. 最终值将转换为 A 类型。

  4. return ; 可以,但是不能 return 表达式; 编译器将报错。

  5. 返回值将被按照 int 类型进行解释。

  6. 将被解释为形参类型,而不是实际类型。

  7. demo04.c。该函数假定了传入进来的数组大小是 10 个元素,如果数组元素大于 10 个,则会忽略后面的元素,如果数组元素小于 10 个,则出现越界访问。事实上就是数组名做了参数,即退化为指针。且由于 for 循环固定死了为 10 次,这是问题的本质所在。

  8. 都要有终止条件,且不断逼近终止条件。

  9. 在多个源文件中使用#include比复制原型更容易。原型本身只有一个副本。在定义函数的文件中包含原型可确保它们匹配。

  10. demo05.c

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U9ehEMJw-1609067244009)(https://raw.githubusercontent.com/Y-puyu/picture/main/images/20201220161621.png)]

7.11 编程练习

  1. 简单的递归,见 demo06.c

  2. 经典的 gcd 函数,一行搞定,且代码时间复杂度为 O ( l o g n ) O(logn) O(logn)。见 demo07.c

  3. 实际上就是实现 atoi() 函数。见 demo08.c

  4. demo09.c。简单的可变参函数。

  5. 该来的还是来了,实现一个简单的 printf 函数。主要就是格式化字符串中的 %,如果不为 % 后面的一个字符,则将该字符直接打印输出。找到 % 后,查看其下一个字母是什么,分别针对处理即可。注意处理 % 下一个为 \0 的情况,以及 %s 这个情况。见 demo10.c

  6. 个人感觉可等价看作 16312=16*1000 + 3*100 + 12 即可,故任何一个数字都可以这样分解,在进行组合即可。但是看着简单写着好麻烦…参考答案,见 demo11.c

随笔

函数确实经常在用着。但是关于函数声明(函数原型)、C语言不支持重载函数、可变参函数实现等些许细节问题,自己在以往的学习过程中并没有深究探索。还是知道的太少了。

疑问

本章用的很多,但是细节知道的却很少,如:当函数定义在 main 函数下面,且之前未声明就在 main 函数直接调用会发生什么?编译器怎么处理?可变参函数编程的应用?printf 函数的具体实现。等等,函数确实是 C 语言项目的骨架。

  1. C语言编译出现conflicting types for错误?

  2. 现代编译器是如何实现自定义函数在main()函数之后实现的呢?

  3. 可变参函数编程,printf 函数实现原理。

  4. 最后一个编程题真滴 np!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
好的,我来改进一下ch07_09.cpp中的冒泡排序算法。冒泡排序算法的主要思想是比较相邻两个元素的大小,如果前一个元素比后一个元素大,就将它们交换位置,这样一轮比较下来,最大的元素就会被移动到数组的末尾。我们可以通过增加一些优化来提高冒泡排序的效率,比如记录上一次交换的位置,下一轮比较时只需要比较到上一次交换的位置,因为该位置之后的元素已经是有序的。 下面是改进后的代码: ```c++ #include <iostream> using namespace std; void bubbleSort(int arr[], int n) { int i, j, lastSwap; for (i = 0; i < n - 1; i++) { lastSwap = n - 1; // 初始化为数组末尾 for (j = 0; j < lastSwap; j++) { if (arr[j] > arr[j + 1]) { swap(arr[j], arr[j + 1]); lastSwap = j; // 更新上一次交换的位置 } } if (lastSwap == n - 1) break; // 如果这一轮没有发生交换,说明数组已经有序,结束循环 } } int main() { int arr[] = {5, 2, 8, 4, 7, 1, 3, 9, 6}; int n = sizeof(arr) / sizeof(arr[0]); bubbleSort(arr, n); cout << "排序后的数组:"; for (int i = 0; i < n; i++) { cout << arr[i] << " "; } cout << endl; return 0; } ``` 这里我们增加了一个变量`lastSwap`来记录上一次交换的位置,每次内层循环时都将`lastSwap`初始化为数组的末尾。当发生交换时,将`lastSwap`更新为当前交换的位置。下一轮比较时,只需要比较到`lastSwap`即可。如果这一轮没有发生交换,说明数组已经有序,结束循环。这样可以减少比较的次数,提高冒泡排序的效率。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ypuyu

如果帮助到你,可以请作者喝水~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值