编程——C语言与算法

Python037

编程——C语言与算法,第1张

#请回答,你的年度知识点#

C语言是国际上广泛使用的一种计算机语言,它适合作为系统描述语言,既可以用来编写系统软件,又可以用来编写应用软件。C语言从发布之日起就得到了广泛传播,为大多数程序员所接受,C语言使用率也一直在编程语言排行榜中稳居前三位,因此学习C语言前景也是非常可观的。

一个程序通常包含算法、数据结构、程序设计方法及语言工具和环境4个方面,其中,算法是核心,算法就是解决“做什么”和“如何做”的问题。算法与程序设计以及数据结构密切相关,是解决一个问题的完整的步骤描述,是解决问题的策略、规则、方法,是求解特定问题的一组有限的操作序列。比如建造一栋楼之前,要先在图纸上绘出其构造图,算法就是在编写程序前先整理出基本思路。算法的描述形式有很多种,如传统流程图、结构化流程图及计算机程序语言等。

一个程序应该包括对数据的描述和对数据的操作。其中,对数据的描述是指在程序中要指定数据结构,即数据的类型和数据的组织形式;对数据的操作也就是对数据进行操作的步骤,即算法。 著名的计算机科学家沃思(Nikiklaus Wirth)曾经提出过一个公式: 算法+数据结构=程序 随着时代的发展以及计算机技术的进步,这个公式已经不够准确了。

实际上,一个程序还应该包括采用一种程序设计方法进行程序设计并用计算机语言描述,经常采用的是结构化的程序设计方法。

算法一般可以分为两大类,一类是解决科学与工程计算方面的算法,如求解数值积分、微分方程、线性方程组和代数方程等,这类算法称为数值运算算法;另一类是解决数据处理方面问题的算法,称为非数值运算算法,如各种各样的查找算法、排序算法以及遍历算法等。目前,计算机在非数值运算方面的应用远远超过了在数值运算方面的应用。

先通过输入角度,通过的点等获得光线的直线方程Ax+By+C=0。.

判断光线过不过某个点(x0, y0),最简单的就是把这个点代入方程,如果等于0就在直线上,不等于0就不在。或者可以通过判断该点与直线的距离d=(|A*x0+B*y0+C|)/√(a^2+b^2),如果d小于允许值,则判断其在直线上,否则不在

人们对里奇的纪念,远不及对乔布斯铺天盖地的悼念。可是,里奇值得人们那样去做。

还是有人出来说了句公道话。

“史蒂夫·乔布斯去世引发了巨大的反响,这当然合情合理。即便影响实际上更为广泛,丹尼斯却不为公众所知”,罗伯·派克说。罗伯是一名在Google工作的程序员,作为业界的传奇性人物,曾经与里奇在著名的贝尔实验室共事20年。

周三晚间,派克在Google+上发表消息称,在与病魔进行长久的抗争后,里奇于上周末在新泽西的家中溘然长逝。虽然在技术圈内引起大量反响,但在主流媒体上,里奇却没有得到同巨大影响相称的悼念。丹尼斯·里奇作为C语言之父,和贝尔实验室资深研究员肯·汤姆森一起使用C语言开发了Unix,当今世界大量依赖的操作系统,其中包括史蒂夫·乔布斯治下的苹果帝国。

“现下互联网基本都在用这两样东西:C语言和UNIX”,派克对《连线》杂志称,“浏览器是用C语言写的。UNIX的内核——基本上是因特网运作的基础——也是用C写的。Web服务器也是用C语言写的,如果不是的话,那就是用Java或者C++写的,两者都是C语言的派生;要不就是Python或者Ruby,用C语言实现的。然后我几乎敢保证,运行这些程序的网络硬件,是用C语言开发的软件驱动的。”

“几乎很难夸大丹尼斯在信息经济基础设施方面无所不在的影响力。”

他补充说,Windows曾经也是用C语言编写,而UNIX同时也支撑了苹果桌面操作系统Mac OS X,以及iPhone与iPad的操作系统iOS。“如果说乔布斯是台前之王,那里奇就是幕后之王。”MIT电气工程与计算机系教授Martin Rinard如此评价道。Rinard也是计算机科学与人工智能实验室的成员。

“乔布斯的过人之处在于其品位独特,打造人们为之着迷并引人注目的产品。而里奇却擅长于开发一些技术人员使用的基础设施,天天被人们使用却不为人知。”

从B语言到C语言

为了更好开发UNIX,丹尼斯·里奇而发明了C语言。最初的UNIX内核使用汇编语言编写,之后他们很快决定要用一种高级语言,让他们更好的驾驭操作系统中的复杂数据。1970年左右,他们尝试使用Fortran,不过没有达到预期目标。接着,在汤姆森创立的B语言基础上,里奇提出了一门新语言

不管你是从哪里听来的消息,B语言得名于汤姆森的妻子Bonnie,抑或是BCPL,一门剑桥于60年代中期开发的语言。

B语言是一种解释性语言——意味着它由一个运行于CPU之上的中间件解释执行——而C却是一门编译语言。它被翻译成机器代码,在CPU上直接执行。即便如此,C当时被认为是一门高级语言。C语言提供了里奇和汤姆森想要的灵活性,却也很快。

关于里奇一直流传的一个笑话是:C语言同时拥有了“汇编语言的强大能力以及...汇编语言的便利性”。换句话说,他承认C语言并不完美,并且十分接近硬件层次。如今C语言被认为是一门低级语言而不是高级语言。不过这个笑话并不公平。C语言提供了真正的数据结构概念,从这个角度来说已经足够高级了。

“当你在编写一个大型程序——比如UNIX——你必须管理好各种各样模块之间的交互:所有用户、文件系统、磁盘、程序执行等等。而有效的管理则需要良好的数据表示,这就是所谓的数据结构”,派克说。

“在没有数据结构组织的情况下,编写一个与UNIX一样一致和优雅的内核基本上是不可能的。需要一个机制组织好数据,而Fortran却不擅长于此。”

在那个时候,写一个操作系统并不多见,这也给了里奇和汤姆森机会,在70年代末把操作系统移植到其它平台。“从此UNIX洪水之门被打开”,派克说,“这全都多亏有了C语言。”

苹果、微软及其他

与此同时,C语言也开始传播到全世界,从贝尔实验室到全世界的大学,也到了微软,一个在80年代异军突起的软件公司。“C语言的开发是一个重大的飞跃,是个很好的折衷...C语言达到了完美的平衡,让你在较高层次高效率开发的同时,却不失去对每处细节的控制”,NVIDIA和贝尔的首席科学家兼斯坦福大学工程系教授Bill Dally说。“它为之后数十年来软件开发定下了基调。”

正如派克指出的那样,C语言内置的数据结构后来发展出面向对象范式,被现代编程语言如C++和Java大量采用。

1973年,里奇发表了关于这门语言的论文,被认为是革命开始的标志。5年后,他和同事布莱恩·克尼汉(Brian Kernighan)发布了C语言的权威著作:《C程序设计语言》。该书最早是克尼汉为C语言编写的教程,后来他拉着丹尼斯一起把书写完。

当派克还在多伦多大学读本科的时候,在一个因病返家的下午里读到了这本书。“那本参考手册相对于其他的手册而言,简直就是清晰和可读的典范。毋庸置疑是一部经典之作。”,他说,“我生病躺床上翻一翻,没想到竟让我忘记了病痛。”

和许多大学生一样,Pike那时已经开始使用C语言了。由于贝尔实验室开始分发UNIX源代码,它逐渐风靡大学校园。此外,UNIX还催生了现代开源运动。这并不是什么言过其实,里奇的影响之大怎么说都不为过。即便里奇在1983年获得的图灵奖和1998年获得的国家技术勋章也不能完全彰显他的贡献。

在克尼汉和派克眼中,里奇是一个少有的孤僻的人。“我和他一同工作了超过20个年头,但还是觉得不是很了解他这个人”,派克说。但这并不是他低调的理由。史蒂夫·乔布斯也是一个孤僻的人,只不过保持低调只使得人们对他的崇拜有增无减。

里奇所处的时代和工作环境与乔布斯千差万别,这也许是他未得到应得纪念的原因。但是,他留下的遗产总有大佬能够明白。“众所周知牛顿说过他是站在巨人的肩膀上”,克尼汉说,“我们都站在丹尼斯的肩膀上。”