学习C语言的经典书籍

PART 1. 推荐经典书籍(内容不全,慢慢补充)

①C语言:(读完之后请混CSDN论坛进行巩固)

《C语言程序设计》

作 者:郭有强 编

出 版 社:清华大学出版社

评价:书很利索,该有的都有,如果你还没有一本满意的C语言课本,买它没错。(也可以阅读外国的经典C语言书籍)

《C和指针》

POINTERS ON C Kenneth A.Reek、

徐波 人民邮电出版社

评价:不算厚的书,纠正对指针的错误理解,这是必读经典,相信会带给你很多思考。(单单一本还不够,继续往后看)

《C陷阱与缺陷》

Andrew Koenig、 高巍

人民邮电出版社

评价:172页,应当1-2天看完,读完豁然开朗,对C语言常见的陷阱进行剖析,必须经典。

《C专家编程》

Expert C Programming Deep C Secrets Peter Van

Der Linden 人民邮电出版社 (20xx-02出版)

评价:200多页,应当2天左右看完,本书读起来很舒坦,不可多得的好书,带你领略语法之外的奥秘,必读经典。

②数据结构与算法:

《清华大学计算机系列教材?数据结构(C语言版)(附光盘1张)》

吴伟民、 严蔚敏

清华大学出版社

评价:数据结构都是类C的伪代码描述,初次接触编程的同学可能理解不了,我也一样。我是看严蔚敏视频学会的数据结构,希望这个办法对你们也同样有效。

《计算机算法设计与分析(第3版)》

王晓东

电子工业出版社

评价:这是我们的课本,不过的确是学习它才把数据结构和算法入门了,为后面进阶做了铺垫。

《算法艺术与信息学竞赛?算法竞赛入门经典》

刘汝佳

清华大学出版社

评价:了解数据结构怎么用,常用算法与思想,书不厚,但很给力。初学可能有障碍,但这的确是入门经典书籍,请不要放弃。

《算法导论(原书第2版)》

科曼(Cormen T.H.)、等、潘金贵

机械工业出版社 (20xx-09出版)

评价:经典中的经典,无需多说,不要问我看哪些内容,负责任的说:有能力就多看点,其实都能看懂,书中的内容与思想将会终身受用。

《编程之美:微软技术面试心得 》

《编程之美》小组

电子工业出版社

评价:微软出品,像是一本小故事集,将数学和编程之美展露无疑,学起来很轻松,反复回顾收获颇丰。

《编程珠玑(第2版)》

Jon Bentley、黄倩、 钱丽艳

人民邮电出版社

评价:主要是数据结构和算法,都是常用的内容,不过作者思维新奇,跟随作者一起思考会碰撞出不少火花,评价非常高的一本书,本人没有顺序阅读,感兴趣的内容翻了翻。

《算法艺术与信息学竞赛 》

刘汝佳

清华大学出版社

评价:放在最后,因为此书的确很专业,我这点智商也驾驭不了,信息学竞赛必备。

《程序员面试宝典(第3版)》

欧立奇、刘洋、 段韬

电子工业出版社

评价:这本书很神奇,大二下学期的时候我就买了并看完了,等到大三找工作的时候发现里边的提到的陷阱题目还是有点意思的,C语言掌握的怎么样拿这本书验一验就知道了。

《数学之美》

(《浪潮之巅》作者吴军最新力作,李开复作序推荐,Google黑板报百万点击)

评价:吴军博士那是相当犀利,《浪潮之巅》足以让人拜服了,此书一出无与争锋,放在数据结构与算法这里比较合适。

 

第二篇:学习C语言后的感悟

我学了C,C++,JAVA.还有很多的脚本语言,最后彻底留下的只有c语言,c++的许多机制忘了,JAVA就没有记住几种机制。

面对编程高手(会n种),而且很牛b的那种,我依然以我会c语言自豪,我也因为我会c语言而自信。面对什么什么技术“趋势”的时代,我只精通c语言,发现已经足够了,而且是完全足够了。当我需要学习PHP的时候,我1个星期可以说基本掌握了;当我要学B shell的时候,1个星期也够了;当我要学习JSP的时候....什么?什么是JSP?别说我学过这些垃圾。

我爱用最简单的语言机制构建出你复杂逻辑,你严谨的思维。当你发现这么简单的C语言男够构架出UNIX操作系统和大部分UNIX程序的时候,你就发现你不能轻视C。

有的人说机制少,不安全,不健全......那么安全的语言机制就失去了灵活,失去了轻便。 有的人说功能少,C库少,连界面都不能写.......那么当malloc都由自己写的时候,程序才牢牢掌握在自己手中。真正的程序员是没有界面的,程序员在text mode下能快捷,方便地做你想做的一切事情。

下面介绍一下我学习的方法,觉得特别有用。。

如果是连高数,计算机原理之类的书或是英语没有入门的人,那就不应该学习编程,不可能牛起来。

如果是C语言刚上手,最好选一本国内语言语法,语句讲得细致的书。

如果上手了,或者学习过其他的语言,那么就一定要看一本最经典的C语言书,比如《C语言程序设计》,这本书我后来又看一遍才知道有多好,眼界十分开阔。

认为都学的差不多了,最最最好的联系方法(切身体会!!!),就是自己写程序,写什么呢??两个中你挑一个:md5加密算法的实现 或者是 lzss或lzw压缩算法的实现。这两个程序接近底层又不算十分大,又有很多的数据结构和算法。资料就要自己去找了,网上有讲算法的,你来具体实现,能自己设计算法并能够在unix机器上实现那更好。

搞过这个你就能体会到自己终于入门了,因为你到时候就会发现又很多的内容还等着你去学.....并且你可以拿着你的程序炫耀了,事实证明能把这个程序彻底些出来并且些的很好的(bug少),已经有功底了,你可以把程序发布到sourceforge.net等开源社区上,招人开启你自己的工程。

当然有了功底,剩下的路你自己就应该知道怎么走了,有一条向linux工程师的方向,就是学习linux,如果你c语言足够好,可以直接学习内核,试着编写,编译内核;也可以弄弄上层的东西,shell,awk,iptable之类的.....当然经典的书《unix高级编程》是讲unix下的gcc程序开发的

还有网络工程师的路,那就要学协议,有巨他妈经典的3卷的书:《TCP/IP详解》一,二,

三。只看一也可以。然后看一看《unix网络编程》,那就足够了.....

如果想向软件工程师发展,那更不成问题。你再学什么语言,什么JAVA,C++,JSP....那是哇哇的简单,但是注意,一定要看最经典的书,你才能成为高手!!

还有一条我最向往的路,就是成为一个hacker,就是黑客,做这个你必须有一定的经济收入和空余的时间才可以...。宗旨是为全世界的IT页贡献出力量。这个有一个好处,就是任凭你自己的兴趣,喜欢游戏的可以开发游戏,想搞unix的可以开发内核什么的。

这个最后一定要进入一个很好的自由社区,比如apache基金会或是GNU基金会,想在后一代的著名程序比如apache httpd,tomcat,kerneln.n上刻上自己的名字就可以向这方面发展。也可以在sourceforge.net上找找自己喜欢的工程,申请加入..如果搞的好还能有基金会的money外快又能满足自己的兴趣,可惜我现在没钱,否则早干了....

那个时候,你已经有找一份很体面的工作的实力了..干什么都可以轻轻松松的..

不论走到哪,c语言还是根本,不论IT格局怎么变,有C语言有如心中一块石头,它是不可能变的,就像tcp/ip,不管上层再有什么技术,基本原理和接口20几年就是没有变过! 回顾几年的IT学习生涯,就像是浓缩的过程,东西越学越少,最后好像只有c语言了....

一)“项目驱动”式教学

目前最著名、最有影响、应用最广泛的windows、linux和UNIX三个操作系统都是用C语言编写的。0S是计算机系统(由软硬件两个子系统构成)的核心和灵魂,它是软件中最庞大最复杂的系统软件。既然如此庞大复杂的0S都可以用c语言编写,从狭义而言,还有什么系统软件和应用软件不能用c语言编写呢?由此可以肯定的说,c语言是一门十分优秀而又重要的语言。

c语言程序设计是过程性程序设计语言,它的发展贯穿了计算机发展的历程,它蕴含了程序设计的基本思想,囊括了程序设计的基本概念,所以它是理工科高等院校的一门基础课程。 从市面上有关c语言的书籍和高等院校采用的教材来看,它们有一个共性,那就是:脱离了实际应用(全是小打小闹的小例子),纯粹的过程性程序设计,没有软件工程思想的体现,没有一定程序设计风格,仅仅是为了让大家明白什么是c语言而已。

高等院校开设c语言程序设计的目的是让学生对程序设计有个入门,有个直观的理解,同时为其他后续课程作铺垫。但是如果教学仅仅以此为目的,那么教学本身就效果而言是个大大的失败。

大家知道,在商业上讲究唯利是图,“利”是商业追求的目标,离开了“利”经商,则商无动力,其结果是必败无疑。在c语言程序设计教学当中,教师应该把“唯用是图”作为教学的首要目标。如果抛开了实际应用进行程序设计教学,就是纸上谈兵,就是“说明书”式的教学。印度的程序设计课程采用“事件驱动式”教学,我认为在中国的c语言程序设计教学中应该采用“项目驱动式”教学。“项目驱动式”教学就是以项目为目的,以c语言理论教学为过程,最终能用c语言设计项目,实现项目的要求。“项目驱动式”教学的关键在于培养学生“如何做什么”和“可以干什么”。一个项目就是一个工程,在“项目驱动式”教学中,首先应该让学生简单了解什么是软件工程思想,其次在c语言理论教学过程中,让学生懂得面向对象的程序设计的风格,最后引导他们来设计项目。

(二)“项目驱动”式教学应注意的问题

1.c语言程序设计教学要帮助学生树立面向工程的观点

在计算机行业中,软件是通过人们的智力活动、把知识与技术转化成信息的一种产品。软件

的设计已经用工程的观念来进行管理。软件设计工作被当作一项系统工程来对待。软件的的生存周期一般可分为以下阶段:问题定义、可行性研究、需求分析、概要设计、详细设计、编码、测试、运行与维护。我们不难看出软件工程的复杂程度是很大的。理工科高等院校把c语言作为一门基础课程,也是为了给社会培养信息技术人才。众所周知,养成一个好的习惯是非常重要的,所以c语言程序设计作为大多数工科院校学生接触的第一门程序设计语言(有的院校讲pascal),就应该让学生树立正确的观点。那么当前的程序设计教学也必须以切合将来软件工程开发的实际需要为第一目标,使学生在学习程序设计的初级阶段就树立正确的软件工程观点。这样做不仅可以为学生将来从事计算机应用设计打下良好的基础,而且有利于培养学生分析问题的完备性,以及统筹全局,协调关系的基本素质。

2.理论教学应从单一的“结构化程序设计”向“结构化与面向对象并举”转变

“结构化程序设计”方法是程序设计的基础,必须让学生掌握得坚实可靠。结构化程序设计的过程是培养学生思维能力的过程,在教学中经常发现有些学生的思维混乱。这些都是缺乏思维训练的结果。结构化程序设计的训练不仅可以让学生养成良好的程序设计习惯,而且可以有效地培养学生思维的条理性和逻辑性。所以在授课过程中要注意讲解结构化程序设计的思想时应突出两点:(1)程序的质量首先取决于它的结构。(2)程序设计的基本方法是自顶向下地逐步求精和模块化。

在c程序教学过程中,越到后面的章节,学生越会产生设计程序逐渐变难的感觉,这是不符合逻辑的一种怪现象。按照常理,C语言学的越多,说明你的程序设计知识越多,设计起程序来应该更加得心应手,那么出现这种现象的原因何在呢?当然该问题的出现的原因是多方面的,但是其中最重要的一点就是长期以来程序设计的观念不是以如何处理好对象为出发点,而是以如何使用好语言为基本点。受这种思想的影响,我们的程序设计教学大多数不是以如何解决好问题为重点,而是以讲解语法规则和语句格式为重点,是“说明书”式的教学。这样做造成的结果就是见到一个程序后学生首先想到是该用哪条语句,而不是思考怎样合理的解析。要切实解决这个问题,首先应该改变程序设计的观念。“面向对象程序设计”思想是目前最为流行、极为实用的一种程序设计方法,但是让学生直接接触“面向对象程序设计”,肯定不能对程序设计打下牢固的基础。“结构化与面向对象并举”是现代计算机程序设计的发展趋势,应该认真探索研究,让学生有一个较为轻松的学习过程。程序设计的实质就是编写处理对象的过程,所以将c与c++有机的融为一体的教材应该是首选教材,在教学过程中,我们应该从社会发展的角度进行探索研究,将目前最为流行又极为实用“面向对象程序设计”思想融合到c语言教学中。

3.c语言教学应培养学生良好的程序设计风格

具有良好的设计风格应该是程序员所具备的基本素质,在实际的项目中程序员往往都有自己的一些编程风格。目前95%以上的程序设计书籍不注重程序设计风格问题,这导致了很多学生没有良好的程序设计风格,在他们刚刚毕业踏入社会时,如果周围的同事没有良好的编程风格,那么很难通过环境来使自己提高这方面的素质,即使有提高也不容易比较全面的提高。因此在学生接触的第一门程序设计语言教学中,就应该培养学生良好的程序设计风格,使他们一进工作环境就具备这个素质。

Pascal设计者N.Writh教授十分重视程序设计风格的养成,他坚信“教给学生们以表达他们思维的语言会深深地影响他们思维和创造发明的习惯,而正是这些语言本身的混乱直接影响着学生们的程序设计的风格”,他这里所指的“这些运用”是当时那些主要用于程序设计教学的计算机语言。对学生来讲,一开始就强调程序设计风格很有必要,良好的程序设计风格不仅有助于提高程序的可靠性、可理解性、可测试性、可维护性和可重用性,而且也能够促进技术的交流,改善软件的质量。所以培养良好的程序设计风格对于初学者来说非常重要。 程序设计风格,实际上是指的是编码风格。在教学过程中应从源程序文档化,数据说明的原

则,输入/输出方法这三个方面培养学生的编码风格,进而从编码原则探讨提高程序的可读性、改善程序质量的方法。

(1)源程序文档化。编码的目的是产生程序,但是为了提高程序的可维护性。源代码是需要实现文档化的。源程序文档化包括选择标识符(变量和标号)的名字、安排注释以及标准的书写格式等。

①选择标识符的命名规则。标识符包括模块名、变量名、常量名、标号名、子程序名等。这些名字应能反映它所代表的实际东西,应有一定实际意义,使其能顾名思义。另外在模块名、变量名、常量名、标号名、子程序名中使用下划线是一种风格。使用这一技术的一种广为人知的命名规则就是匈牙利命名法(变量类型由一个或两个字符表示,并且这些字符将作为变量名的前缀)。当然使用匈牙利命名法与否都没有错误,重要的是要保持一致性——在整个程序中使用相同的命名规则。这就是说,如果你在一个小组环境中编程,你和其他小组成员应该制定一种命名规则。并自始至终使用这种规则。如果有人使用了别的命名规则,那么集成的程序读起来将是很费劲的。此外,你还要与程序中用到的第三方库(如果有的话)所使用的风格保持一致。如果可能的话,你应该尽量使用与第三方库相同的命名规则,这将加强你的程序的可读性和一致性。

②注释。程序中的注释是程序设计者与程序阅读者之间通信的重要手段。注释能够帮助读者理解程序,并为后续测试维护提供明确的指导信息。因此,注释是十分重要的,大多数程序设计语言提供了使用自然语言来写注释的环境,为程序阅读者带来很大的方便。注释分为功能性注释和序言性注释。

a.功能性注释。功能性注释在源程序中,用以描述其后的语句或程序段是在做什么工作,也就是解释下面要“做什么”,而不是解释下面怎么做。对于书写功能性注释,要注意以下几点:第一描述一段程序,而不是每一个语句。第二利用缩进和空行,使程序与注释容易区别。第三注释要准确无误。

b.序言性注释。序言性注释通常位于每个程序模块的开头部分,它给出程序的整体说明,对于理解程序具有引导作用。有些软件开发部门对序言性注释做了明确而严格的规定,要求程序编制者逐项列出。有关内容包括:程序标题;有关该模块功能和目的的说明;主要算法;接口说明:包括调用形式,参数描述,子程序清单;有关数据描述;模块位置(在哪一个源文件中,或隶属于哪一个软件包);开发简历:模块设计者、复审考、复审日期。 ③用标准的书写格式。源程序清单的书写建议采用以下几点:

a.每行只写一条语句;

b.用分层缩进的写法显示嵌套结构层次,这样可使程序的逻辑结构更加清晰,层次更加分明。 c.书写表达式时适当使用空格或圆括号作隔离符。

d.在注释段周围加上边框;

e.注释段与程序段、以及不同的程序段之间插入字行;

(2)数据说明采用的原则。在编写程序时,要注意数据说明的风格。

数据说明的次序如果规范,将有利于测试,排错和维护。首先说明的先后次序要固定,例如,按常量说明、简单变量类型说明、数组说明用数据块说明、所有的文件说明的顺序说明。当然在类型说明中还可进一步要求,例如按如下顺序排列:整型量说明、实型量说明、字符量说明、逻辑说明。

其次当用一个语句说明多个变量名时,应当对这些变量按字母的顺序排列。

最后对于复杂数据结构,应利用注释说明实现这个数据结构的特点。

(3)输入/输出方法。输入/输出的方式和格式应当尽量避免因设计不当给用户带来的麻

烦。这就要求,源程序的输入/输出风格必须满足能否为用户接受这一原则。所以在设计程序时,应考虑以下原则:输入数据时,要使输入的步骤和操作尽可能简单,应允许使用自由格式输入;应允许缺省值;对输入的数据要进行检验,以保证每个数据的有效性。

(三)结束语

在教学过程中,我们让学生设计一个程序模拟体育彩票的销售与对奖的过程,取得了良好的效果。他不仅启发和诱导了学生独立思考、积极思维的主动性,而且充分调动了学生学习的自觉性和积极性,使学生融会贯通地掌握了所学知识,提高了分析问题和解决实际问题的能力。

搞好c程序设计的教学工作涉及的因素很多,如果以项目来驱动教学,首先让学生树立面向工程的思想,其次把教学从单一的“结构化程序设计”向“结构化与面向对象并举”转变,最后特别要培养学生养成良好的编码风格,从而使他们学会能够“干什么”,那么我们认为教学目的就达到了。

相关推荐