相关文章推荐
失落的金鱼  ·  The Rise and Fall of ...·  4 月前    · 
个性的木耳  ·  Flask app cannot ...·  6 月前    · 
腼腆的水龙头  ·  [bitnami/ghost] ...·  7 月前    · 

选择什么教材来学习C语言?

上一篇文章我们讲到C语言的发明人丹尼斯·里奇(Dennis Ritchie),他于1972年左右发明了C语言,C语言里的时间/日期计算起点,有个unix timestamp(unix 时间戳)是 Jan 1, 1970 UTC。即 1970年1月1日,是UNIX元年。

C原因发明至今接近50年了,达到了知天命的年龄了。大家想想,你10年前使用的产品到现在还在用的能有多少呢?在高速发展的计算机领域,发展速度更是惊人,你之前经常浏览的网站、玩过的游戏能坚持10年的有多少呢?大家回头再看看C语言,在2019年7月的计算机语言排行榜上,50岁的C语言高居第2名!

时间、流行度已经充分证明了C语言的生命力!大学大一新生一般都开设C语言的课程,选用的教材一般是谭浩强先生的,见下图:

红色的书皮、1400万册的发行量充分证明了它的使用率。但大家在知乎等上搜索这本教材,会发现怨言颇多(这里并没有对谭浩强先生表示不敬的意思),吐槽书中表述和程序错误颇多,最主要大家认为该书过于讲授语言的知识,而不是编程的快乐,以及用编程来解决实际问题的能力!

那如果让我来推荐一本学习C语言的教材,我会推荐本文要介绍的人物布莱恩·克尼汉和C语言发明人丹尼斯·里奇共同撰写的《C程序设计语言》!这里绝不是打广告。

首先这本书很短小,288页而已,不会有太大的心理负担。抛掉不用的chapter 1和8,另外有时chapter 6 structures因为课时问题也会不讲,最多也就120-140来页,一点阅读负担都没有。另外,两位作者都善于写“教科书”,语言简洁清爽,解释却很清楚和规范。作为C的创造者和同时拥有丰富的开发经历(他们也是Unix的开发者),他们给出的建议和选择的风格,都是非常有指导性。作为初学者,学规范的东西无疑是最为正确的选择。这里的规范,不仅仅是基本的代码形式上的规范。学了坏习惯再改总是一件困难的事情。

起初,C语言没有官方标准。1978年贝尔实验室正式发表了C语言。布莱恩·克尼汉(Brian Kernighan)和丹尼斯·里奇(Dennis Ritchie)出版了《The C Programming Language》。这本书被 C语言开发者们称为K&R,很多年来被当作 C语言的非正式的标准说明。人们称这个版本的 C语言为K&R C。至此,布莱恩·克尼汉(Brian Kernighan)和丹尼斯·里奇(Dennis Ritchie)两人简称K&R。

布莱恩·克尼汉

布莱恩·克尼汉在1942年出生在加拿大多伦多,他在普林斯顿大学取得了电气工程的博士学位,2000年之后取得普林斯顿大学计算机科学的教授教职。

他与Shen Lin合作共同完成了两个知名的NP-complete优化问题的解决方案:图划分问题和旅行推销员问题。旅行推销员问题(Travelling Salesman Problem, 又称为旅行商问题、货郎担问题、TSP问题)是一个多局部最优的最优化问题:有n个城市,一个推销员要从其中某一个城市出发,唯一走遍所有的城市,再回到他出发的城市,求最短的路线。

布莱恩·克尼汉除了和丹尼斯·里奇撰写了《C程序设计语言》之外,还撰写了《UNIX编程环境》,这本书对UNIX操作系统的编程环境做了详细而深入的讨论,内容包括UNIX的文件系统、Shell、过滤程序、I/O编程、系统调用等,并对UNIX中的程序开发方法做了有针对性的指导。

布莱恩·克尼汉在普林斯顿大学为非计算机专业学生开设了一门介绍计算机技术基础的课程,根据课程讲义编写《D is for digital》——中文译名《世界是数字的》。书中解释了当今计算和通信领域的工作方式,包括硬件、软件、因特网等,讨论了新技术带来的社会、政治和法律问题。

awk是由Alfred Aho 、Peter Weinberger和Brian Kernighan这三个人创造的,awk由这个三个人的姓氏的首个字母组成。

awk早期是在unix上实现的,所以,我们现在在linux的所使用的awk其实是gawk,也就是GNU awk,简称为gawk,awk还有一个版本,New awk,简称为nawk,但是linux中最常用的还是gawk。

awk其实是一门编程语言,它支持条件判断、数组、循环等功能。所以,我们也可以把awk理解成一个脚本语言解释器。可以利用awk命令,将一些文本整理成我们想要的样子,比如把一些文本整理成“表”的样子,然后再展示出来。

grep 、sed、awk被称为linux中的“三剑客”。总结一下这三个“剑客”的特长:

grep:更适合单纯的查找或匹配文本

sed:更适合编辑匹配到的文本

awk:更适合格式化文本,对文本进行较复杂格式处理

以下就是awk程序的示例:

选择什么教材来学习C语言?上一篇文章我们讲到C语言的发明人丹尼斯·里奇(Dennis Ritchie),他于1972年左右发明了C语言,C语言里的时间/日期计算起点,有个unix timestamp(unix 时间戳)是 Jan 1, 1970 UTC。即 1970年1月1日,是UNIX元年。C原因发明至今接近50年了,达到了知天命的年龄了。大家想想,你10年前使用的产品到现在还在用的能有多少呢?... 原创: 秦陇纪 科学Sciences 今天 科学Sciences导读:继本号操作系统、指令集等计算机科普文章后,接着介绍 编译器 相关知识。本文按事、人、物的顺序,介绍 编译器 发展史 、典型 人物 、技术知识。 编译器 发展史 5个十年3大 人物 编译器 知识(25289字) A 编译器 发展史 5...
B ria n Kernighan 算法可以用于清除二进制数中最右侧的1。B ria n Kernighan 算法的做法是先将当前数减一,然后在与当前数进行按位与运算。 x=x&(x-1) 举个例子,20的二进制表示为10100,其最右侧的1在第三位上。20-1=19,19的二进制表示为10011,10100&10011=10000。可以看到,B ria n Kernighan 算法可以二进制数将最右侧的1清除。
《C程序设计语言》(第2版新版)是由 C语言 的设计者B ria n W. Kernighan 和Dennis M.Ritchie编写的一部介绍标准 C语言 及其程序设计方法的权威性经典著作。是一本较好的 C语言 入门书籍。 《C程序设计语言》(第2版新版)讲述深入浅出,配合典型例证,通俗易懂,实用性强,适合作为大专院校计算机专业或非计算机专业的 C语言 教材,也可以作为从事计算机相关软硬件开发的技术人员的参考书。《C程序设计语言》(第2版新版)原著即为 C语言 的设计者之一Dennis M.Ritchie和著名的计算机科学家B ria n W. Kernighan 合著的一本介绍 C语言 的权威经典著作。我们现在见到的大量论述 C语言 程序设计的教材和专著均以此书为蓝本。原著第1版中介绍的 C语言 成为后来广泛使用的 C语言 版本——标准C的基础。人们熟知的“hello,world”程序就是由本书首次引入的,现在,这一程序已经成为所有程序设计语言入门的第一课。
文章目录1 B ria n Kernighan 算法2 判断一个数字n的比特位中1的个数2 leetcode231. 2的幂3 201. 数字范围按位与4 不创建临时变量,交换两个数字 1 B ria n Kernighan 算法   这个算法的意思是,对任何一个数 nnn,n&(n−1)n\&(n-1)n&(n−1)的结果是nnn的比特位最右端的1变为0的结果。例如,n=12,n−1=11,11&12=8n=12,n-1=11,11\&12=8n=12,n−1=11,11&
lkh算法是一种求解旅行商问题(TSP)的启发式算法。TSP是一个经典的组合优化问题,目标是寻找一条路径,使得经过所有城市且总成本最小。lkh算法的全名是Lin– Kernighan 启发式算法,是由Lin(王昌潮)和 Kernighan (彼得·克尼戈恩)在1973年提出的。 Lkh算法的核心思想是通过迭代优化当前解来逐步接近最优解。它首先基于一个初始解,然后使用一系列的局部搜索策略来改进解的质量。其中最重要的策略是Lin– Kernighan 交换操作,它通过交换两个边来尝试产生更优路径。该算法还使用了3-opt操作和k-opt算法等局部搜索技术。 Lkh算法的优点是在求解TSP问题时能够找到较好的解,并且具有一定的鲁棒性。它在解决大规模问题时的表现尤为出色。此外,lkh算法还是开源的,可以在多种编程语言中实现,并且有很多改进版本可供选择。 然而,lkh算法也存在一些限制。由于TSP是一个NP-hard问题,因此在某些情况下,lkh算法可能无法找到全局最优解。此外,算法的执行时间可能随着问题规模的增加而增加,因此对于复杂的问题,算法的运行时间可能较长。 总的来说,lkh算法是一种有效的TSP求解算法,可以在实际问题中得到应用。在实际使用时,我们需要结合具体问题的特点和需求,选择合适的参数和改进策略,以达到更好的求解效果。