0-Preview

期末写博客也是实属少见,起因是《数据结构与算法》结课了,要写课程设计。
所以在写课程设计的时候,结合上一学期来学习数据结构的收获,终于可以写一写关于代码方面的思路了。
还有一个原因是👴太懒了,先发个雏形出来,这样假期就会激发👴的强迫症,让👴给他写完。

1-算法的意义

首先,我写过不少算的上还能用的小玩意儿。有合法的也有不知道合不合法的。
image-20211223180942837

虽然程序成功运行以后成就感满满,但是👴经过这几天的沉淀,才发现了潜藏着成就感之后的东西。我也不知道为何一个 PWN ✋要对一些web感兴趣。
之前写的所有程序,有比赛中用来解题的🦶📘,有用来自动健康报备、自动签到一类的小🔧。也有各科的课程设计一类的。

以上这些程序,我编写的进度以及满意度都不是很好,现在看来是受限于算法。例如,今年 ISCC 中Tokeii出的一道 MISC 题目,我当时用的是双表互相遍历,压根没想到去用查询算法,硬着头皮让电脑风扇转了十几分钟,才跑出来结果。

In my judgment,我们进行开发时不是看哪里能用上算法就去用,而是要掌握算法的思维模式,成为一种习惯。目的不是用算法,而是让自己的程序更快更小更灵活。I don‘t know whether it’s the popular opinion ,but it’s my two cents on the issue.

2-调试思维

我见过太多为了找一个bug,将代码翻来翻去,改来改去还是找不到具体位置的情景。
就目前而言,我所有能打听到的学校都有这种情况,而且还不少。
而用有调试思维的人,大多都有汇编基础以及对底层方面有过研究。他们都说这是天赋,是一种独特的思维方式。

简单的调试方式,并不需要额外的操作系统,额外的工具,只需要一个思路:

2.1-定位

定位bug的位置有很多方法,最不靠谱的一种就是利用编译器报错,无论你用的是1996年的 devc++ 还是2006年的codeblocks还是vscode2021 ,他们并没有智能到理解你的程序,只是纠正了你的代码编写错误,而且还经常搞错。

🔑活断点

活断点不需要任何基础,使用方法就是在程序每个重要的逻辑节点加一个puts随便输出个啥玩意儿,可以通过这样判断程序的逻辑是否正确。也可以起到检测数值的作用,如果计算结果不正确,可以每一个参数都输出,仔细看一下哪里出了问题。

🔑断点

每个编译器都有不同的快捷键,具体可以去百度一下。

断点也可以在一次调试中设置断点,下一次只需让程序自动运行到设置断点位置,便可在上次设置断点的位置中断下来,极大的方便了操作,同时节省了时间。

🔑Debug

大部分软件现在都自带了 debug功能,不过不是很好用,和gdb差的远了。有条件还是自己装一个吧。
用起来界面也不是很友好,很迷糊。

2.2-逻辑测试

当程序的函数关系变得混乱时候,可以使用 go to来解决,就是设置一个路标的意思。比函数灵活,但是不如函数的通用性高。

3-进阶

如果想要掌握动调的话难度太高,还需要一些前置知识和技能。如果你现在是大一的话,那还来得及从头开始:

1、扔掉你手中学校发的 《C语言》 课本,去买一本 《深入理解计算机操作系统》别名就是 大名鼎鼎的 CSAPP
2、换掉你的工作系统,使用 Linux 进行代码的编写。
3、将学习 C语言和 Python 和汇编结合起来,不要担心学混了。
4、学会使用 gcc 和 gdb

以上这些就足够了,可以支撑到将代码和算法玩明白了。

进阶的后面再写,期末预习课本去。

airsten