章节读后感-第一部分-第四章:函数和递归

来源:互联网 发布:老虎手游端口 编辑:程序博客网 时间:2024/04/29 16:50

第三章有两道题卡在那里了···“循环小数”和“浮点数”

今天做循环小数卡了···自己的模拟能力真的特别烂特别特别烂···

最终还是上网看了别人的代码 有的真简洁!真的是开了眼界了 由衷的佩服

看了其他的代码 思路都是利用 抽屉原理 但是“菜小白”的实现起来真的棒 能看出来 C语言 玩的真转···

做的快晕了···打算明天做(其实逃避了···真鄙视自己···)


只想等着状态好了再做 正如3xian说的: 那些真正的牛人无论什么情况下都能AC 都能拿牌··

自己真的是太菜了···

我一定要坚持走下去,虽然我逻辑能力 我的数学思维 都很菜 可是 1年后呢 3年后呢 10年后呢···

我愿意用时间去累计 去弥补自己的笨拙 我虽然没有天资 但是我下定决心坚持 就一定会等来那天 我不再着急那一天的到来 只管前进前进 不断地努力 剩下的

就交给时间吧


言归正传

翻开新的一章

函数和递归

太棒了 终于要系统的学递归了!

还记得大一时看不懂汉诺塔代码时候问老师时老师也解释不清楚的情景···哎···

①函数是“过程式程序设计:的自然产物(我还是不能领会过程语言是什么

②本章主要目的在于理解这纷繁复杂的、最后的语法(最后?真 !的 !吗!语法果然不是竞赛的重点

③还有学会gdb 一开始我是畏惧的  可是当我知道 学会gdb 可以从根本上帮助我理解,看清事物的本质。我至少愿意直面它

④还有会学到一些编写算法程序的一般方法和技巧


4.1 #自定义函数和结构体

get到***:为了使用方便,往往用“typedef stuct{ }类型名;“的方式定义一个新类型名。

可是 我不用这种方式 也可以像原生数据类型一样使用这个自定义类型啊···(这里留个疑惑···难道是C的标准变了????

get到***:即使最终答案在所选择的数据类型范围之内,计算的中间结果仍然可能溢出,一种简单的解决办法是“约分”

get到***:过这样的int m=floor(sqrt(n)+0.5)四舍五入避免了浮点误差-如果sqrt讲某个本应是整数的值变成了xxx.9999,也将被修正正确的值,但若直接写m=sqrt(n) “.9999”会被直接截掉。

4.2 #函数调用与参数传递

 浅尝了一下gdb···

get到***:

C语言用调用栈(Call Stack)来描述函数之间的调用关系。

get到***

windows 命令行

更换C D盘 直接 输入C: 或 D:
 cd.. 返回上层目录

进入当前目录下的文件夹 cd 文件夹名

gcc 文件名.c -o 执行文件名(一般和文件名一样) -g 生成可执行文件并为进行gdb调试做准备

编译选项 -g 告诉编译器生成调试信息

例:gcc gdb-sample.c -o gdb-sample -g

使用“file”命令载入被调试程序 gdb-sample

命令“q”,退出(Quit)GDB调试环境

使用“b”命令在 main 函数开头设置一个断点(Breakpoint):
在 main 函数中的第一个可执行语句(前面的“int n;”为变量定义语句,并非可执行语句)上设置了断点
再次使用“r”命令执行(Run)被调试程序:
程序中断在gdb-sample.c第19行处,即main函数的第一个可执行语句处。
显示信息 为:下一条将要执行的源代码为“n = 1;”,它是源代码文件gdb-sample.c中的第19行。
使用“s”命令(Step)执行下一行代码(即第19行“n = 1;”):
用“p”命令(Print)看一下变量 n 的值是不是 1 :p n
分别在第26行、tempFunction 函数开头各设置一个断点(分别使用命令“b 26”“b tempFunction”):
b 26 b tempFunction
使用“c”命令继续(Continue)执行被调试程序,程序将中断在第二个断点(26行)

使用“d”命令——Delete breakpoint删除目前所有断点

参考GDB十分钟教程 - Liigo's blog - 博客频道 - CSDN.NET

get到***:算法竞赛的核心是算法,没有必要纠缠如此(指针)复杂的语言特性。


在编程时候尽量避免,不要滥用指针,会让自己搞糊涂。


指针加减法这里,我学到:用P1 P2来指向一个数组,那么P2-P1是从P1到P2的元素个数(不包含P2);

把数组作为指针传递给函数时,数组内容是可以修改的。因此,若果要写一个“返回数组”的函数,可以加一个数组参数,然后在函数内修改数组。不过在算法竞赛中经常采用其他做法,原因在第五章作进一步说明,好啊,总是能激发我读下去的欲望···

开始 做题啦~

4.3## 递归

段是指二进制文件内的区域,所有某种特定类型信息被保存在里面。一个可执行文件包括正文段(存储指令),数据段(存储已初始化的全局变量),和bss段(存储未赋值的全局变量所需空间)组成。

调用栈所在的段称为堆栈段,和其他段一样,堆栈段也有自己的大小,不能越界访问,否则"段错误"-栈溢出。

堆栈段在程序运行时由程序动态创建,里面放着调用栈,因此保存着“调用关系”和“局部变量” ,另外,较大的数组放在main函数外面是因为,局部变量也是放在堆栈段的。

栈溢出不一定是递归调用太多,也可能局部变量太大。

只要总大小超过了允许的范围,就会栈溢出。

NOte :  不用函数和递归也可以写出所有程序。但是···不实用···

!





0 0
原创粉丝点击