编程及C/C++初学者 FAQ 四、教材、习题和示例

 

四、教材、习题和示例

能推荐几本好书么
     当然,FAQ的目的之一就是这个。我将分别介绍纯C、C++以及widows编程、数据结构算法以及图形库等等的教材。市场上这些主题中任意一个的教材都是汗牛充栋,读都读不完。不过很显然,大家都公认的经典,也只是那么寥寥数本而已。下面推荐的都是这样的著作,当然总是有好作品在不断推出,我这里不可能把他们都列举出来,你可以用自己的犀利的目光把他们挑出来。

首先是纯C的教材
     第一本:H.M.Deitel和P.J.Deitel的《C HOW TO PROGRAM》(C程序设计教程)
     作者是父子,从事语言教材的编写合计超过40年,本书被美国众多高校选用为教材,既可入门也可翻阅,甚好。本FAQ作者认为如果你只打算看一本的话,那就选他好了。

     第二本:Brian W.Kernighan和Dennis M.Ritchie 的《The C Programming Language 》(C程序设计语言)
     此书简称K&R,由C语言的创建者撰写,是全球销售最多的C语言教材,其品质不容置疑。不过不适合入门,适于在入门之后巩固提高。实体书有原版和译本购买,电子版英文较多。

     第三本:谭浩强的《C程序设计》
     优点在于,面向中国学生,语言易于理解,而且全书篇幅小,看过的人多,容易找到人请教。但是各方面的概念不深入,浅尝辄止,实际上还有些小错误,不是很严谨。因此适合第一次入门学习,例题做完基本就可以抛弃了。有实体书和电子版下载。同时配套有习题集和习题解答,适合自学。

     第四本:王大刚先生的《C语言编程宝典》
     质量不错,与老谭的书一样非常适合中国学生,而且对于TC的图形编程讲解非常透彻。本人没有发现实体书,可能只发布在网络上,在VCgood论坛有转载:
http://www.vcgood.com/bbs/forum_posts.asp?TID=1560&PN=2
http://book.chinaz.com/C/C/index.html

     第五本:无名作者的《C语言初学者入门讲座》
     VCgood论坛转载,作者未知,质量同上一本。http://www.vcgood.com/bbs/forum_posts.asp?TID=1294&PN=4

     第六本:Kenneth A.Reek 的《C和指针》
     进阶读物,把指针一章演绎为一本书可见其技术精度。指针是C的灵魂,能领会本书中的理念,才能算是真正明白了C指针的奥妙,才算懂得了C。

     第七本:Andrew Koenig 的 《C陷阱与缺陷》
     进阶读物,在认真读完上面的入门书之前,暂勿阅读。本书畅销14年历久不衰,足证品质。

     最后一本:ISO C89规范/C99规范
     一切关于C语言的疑问,只有一件东西最权威,那就是ISO的规范。但这不是正式出版物,是类似法律文本的技术说明,而且只有英文版。新手阅读,提防吐血而亡。

然后是C++的教材
     C++比C复杂的多,所以教材也就纷繁芜杂。既有综合性入门性的,也有专项深入的,阅读要循序渐进,以下分阶段介绍(以下文字有部分引用自他人评介)。
  首先是毫无基础的时候,先要初步掌握语法并形成编程的概念
  
   level 0:
     H.M.Deitel和P.J.Deitel的
《 C++ How to Program 》(C++大学教程)
     又是这对父子。有很多号称C++入门的书,但经我的观察,如果要选择能推荐给毫无编程概念的新手用的书,这本算是佼佼者了。此父子的《C程序设计教程》我已推荐了。
  
     仍然是K&R,Brian W.Kernighan和Dennis M.Ritchie 的
《The C Programming Language》(C程序设计语言)
     尽管C++之父亲口说,最好把C++看作一门新语言来学习,但我个人认为,一开始学习C至少有两大好处。相比C++,C还是非常简单的,易于掌握,避免你过早陷入C++的语法泥潭。同时,学C能让你对计算机的底层运行有所认识,建立良好的概念。

     钱能的《C++程序设计教程》
     国内C++教材中较好的一本,作者是教师,总结多年教学实践的经验写成的,比较适合国内学生。
     PS:老谭也有一本C++教材,在此就不太推荐了,它完全是用C的思维来看C++。

     当读者有一定c/c++基础
     推荐的阅读顺序:
     level 1
     从Stanley B.lippman著 侯捷 译的《essential c++》开始,短小精悍,可以对c++能进一步了解其特性。Stanley B.Lippman的职业是提供关于C++和面向对象的训练、咨询、设计和指导。他也是Bjarne Stroustrup领导的Bell实验室Foundation项目的成员之一,负责C++程序设计环境中的对象模型部分。简单说,他是C++的创建者之一。
     以Stanley B.Lippman,Josee LaJoie,Barbara E.Moo的《c++ primer》作字典和课外读物,因为太厚不可能一口气看完,当然你也可以用它作为主力教材。Lippman说过了,Josee LaJoie是C++标准委员会原负责人,Barbara E.Moo 是独立咨询顾问,参与了第一个使用C++编写的商业产品的开发,领导了公司中第一个C++编译器项目。
     C++之父Bjarne Stroustrup的《the c++ programming language》,简称BS的TCPL,全面而深入的书,缺点也是太厚。
     这个阶段 也可以延用前阶段Detiel父子的教材。

     level 2 这个阶段就要养成好习惯
     然后从Scott Meyers的《effective c++》开始转职,这是圣经,请遵守10诫,要经常看,没事就拿来翻翻
     接着是 Herb Sutter的《exceptional c++》。此人是C++标准委员会的主席,主席说话,谁有异议。
     顺下来就是Scott Meyers的《more effective c++》和Herb Sutter的《more exceptional c++》,请熟读并牢记各条款

     level 3 这个阶段 把C++的类搞透
     Stanley B.lippman的《insied the c++ object model》(深度探索C++对象模型)看过后如一缕清风扫去一直以来你对语言的疑惑,你终于能明白compiler到底都背着你做了些什么了,这本书要细细回味,比较难啃,最好反复看几遍,加深印象。
     看完上一本之后,这本Bjarne Stroustrup的《The design and evolution of c++》(C++的设计与演化)会重演一次当年C++他爹在设计整个语言过程中的历程。
     Stephen C. Dewhurst的《C++ Gotchas: Avoiding Common Problems in Coding and Design》(C++程序设计陷阱)会帮你在设计层面避免错误。

     level 4 这个阶段深入STL吧
     Nicolai M.Josuttis的《the c++ standard library》(C++标准程序库—自修教程与参考手册) 是stl的字典,什么都可以查得到。
     Scott Meyers的《effective stl》,它和圣经一样是你日常行为的规范。发现没有,Scott Meyers先生一直在搞effective系列。
     Matthew H. Austern的《generic programming and the stl》(泛型编程与STL)让你从OO(面向对象)向GP(泛型编程)转变。
     光用不行,我们还有必要了解stl的工作原理,那么侯捷的 《stl源码剖析》会解决你所有的困惑。

     level 5 彻底掌握模版泛型编程
     对于c++无非是OO和GP,想进一步提升OO,Herb Sutter的《exeptional c++ style》是一本主席这么多年的经验之谈,是很长esp的。
     一位stl高手是不能不去了解template的,《c++ template》是一本百科全书,足够你看完后对于GP游刃有余。
     Andrei Alexandrescu的《modern c++ design》是太过聪明的人写给明眼人看的。

    level 6
     这个时候,对于C++语法本身,你应该是已经到了随心所欲的境界,你所要练习的大概就是大规模的C++程序的设计以及一些通用的高效库的使用,以及为什么要这样做的理由。
     所以,《C++ 输入输出流及本地化》《C++ Network Programming》《大规模C++程序设计》是你需要的。
     同时,C++教材中的异类:Barbara E.Moo和Andrew Koenig的《Ruminations On C++》(C++ 沉思录)是值得你一看的,他集中反映了C++的关键思想和编程技术,说明了C++是什么样的以及能够做些什么,不仅告诉你如何编程,还告诉你为什么要这样编程。本书曾出现在众多的C++专家推荐书目中。

     和C一样,同样有最后一本书
    
ISO+IEC+14882-1998 C++规范。这可不是宝典圣经,这就是C++的法律,一切疑问以此为准到此打住。不过,有个脚注,某些具体情况取决于编译器实现。


接下来是Windows编程
     至少在国内来说,Windows环境下的编程还是很有市场的。
     第一本书:Charles Petzold 的
《Programming Windows》(Windows程序设计)
     如果说,在windows编程领域只能翻阅一本书的话,那就是他了。《Windows程序设计》由微软出版社在1988年首次出版,后来被认为是这方面最好的导论性读本。在1994年5月,Petzold作为仅有的七个人之一(并且是唯一的作家)被《Windows Magezine》和Microsoft公司授予Windows Pioneer奖,以表彰他对Microsoft Windows的成功做出的贡献。这本书经典到这个程度,以至对于Windows程序员来说,“从Chares 的(Window程序设计)一书中寻找答案。”几乎成了一句至理名言。
     你可以在这个地方观看到他的外观,http://www.charlespetzold.com/pw5/,国内书店有售,电子版则需要仔细搜索。

     第二本:Jeffrey Richter 的
《ProgrammingApplicationsforMicrosoftWindows》(Windows核心编程)《Advanced Windows》(Windows 高级编程指南)
     和上面这本书难分伯仲。这么说吧,你读了之后就会后悔,后悔为什么没有早点读他。建议先看高级,再看核心。

     个人认为除非windows发生革命性的变化,否则看完这三本书,足以应付通常的Windows编程。

     上面三本书介绍的是直接使用WindowsAPI实现应用,总的来说那是一种很基础但很繁琐的方式。Windows下有很多的编程库可以使用,VC和BCB都自备了优良的库。
     在VC来说,存在版本的差异,如果是6.0版本,那么你基本只有MFC这一种选择,但对于2002以后的版本,包括新推出的2008,MFC、ATL、.net都不错。
     对于MFC。
     要学会怎么用,可以看一下这几本:
     微软出版社授权的中文版系列书 由David J.Kruglinski,Scot Wingo,George Shepherd写的
《Programming Visual C++ 6.0 技术内幕(第5版)》,经典的“Visual C++技术内幕”的第5版。
     清华大学出版社出版 杨永国 的
《Visual C++ 6.0实用教程(第2版) 》,这本不是那么经典,同类多得很,但好处是便宜,而且能够买到,有些书已经买不到了。
     如果想知道MFC的原理,侯俊杰先生的
《深入浅出MFC 》(Dessecting MFC)就值得你仔细阅读。

     对于VC2002--2008中的.net,单独讲授的似乎目前还没有像《Windows程序设计》那样经典的书出现,毕竟.net出现的时间也不长。但把.net MFC ATL等综合在一起讲的,倒还是有一些。
     由H.M.Deitel,P.J.Deitel,J.P.Liperi和C.H.Yaeger共同编写的
《Visual C++.NET:How To Program 》(Visual C++.NET大学教程)品质算是上乘。还记得Deitel这对父子作者么,在chinapub上可以看到父子俩合著的教材有47套之多,而且个个畅销,我觉得他们俨然就是美国的谭浩强,只是水平高出不少。
     George Shepherd,David Kruglinski 的
《Visual C++ .NET技术内幕(第6版)》,就是上面那本书的.net升级。
     IVOR HORTON的《VISUAL C++ 2005入门经典》也可一看。

     BCB在版本6以前用的是著名的VCL库,BCBX另起炉灶,用的是wxWidgets库。由于对BC,作者自己涉猎不多,所以这两套库的教材,请大家自行查找。

     就像C++和C的规范文件一样,Windows编程中,也有一件类似万宝全书的神物,那就是Microsoft自己推出的
MSDN
     MSDN是Microsoft Software Developer Network的简称。这是微软的针对开发者的开发计划。你可以在http://msdn.microsoft.com看到有关软件开发的资料。在VisualStudio中包括MSDN Library的光盘,其中包括VisualStudio的帮助文件和许多与开发相关的技术文献。MSDN Library每个季度更新一次,可以向微软订阅更新光盘,不过价格不便宜。
     MSDN就是微软的技术大全,所有微软的软件系统的开发的已公开资料,都在上面。如果在那里也无法找到答案,那你只能想办法咨询微软的内部工程师求得隐藏秘籍。不要妄想能够完全阅读它,3G容量的文档(大部分是文本,不是图片和视频),实在太过巨大了。

Unix/Linux/BSD系统

相对于Windows,在UNIX下编程获得相关文档要方便很多。由于历史原因,能够看到的教材基本上都经受了考验,几乎个个都是经典,不象Win下有鱼龙混杂泥沙俱下的现象。
三本可以替换的入门书,任选其一即可:
Bruce Molay的
《Understanding Unix/Linux Programming A Guide to Theory and Practice》(Unix/Linux编程实践教程) 应该是你的第一本书。一句话,大家都说好。
Kay A.Robbins(美), Steve Robbin(美)的
《UNIX Systems Programming》(UNIX系统编程) 。他是一本介绍UNIX系统的工作原理以及学习UNIX系统程序编写方法的经典教材,一本程序员不可多得的案头必备参考书。
Neil Matthew(英),Richard Stones的
《Beginning Linux Programming》(Linux程序设计) 。本书是Linux程序设计领域的经典名著,以筒单易懂、内容全面和示例丰富而受到广泛好评。

随后,以下几本书排名不分先后,分属不同方面,想深入的伙计建议都看:
W.Richard Stevens, Stephen A.Rago的《
Advanced Programming in the UNIX Environment》(UNIX环境高级编程)
W.Richard Stevens,Bill Fenner, Andrew M. Rudoff,Richard W.Stevens的
《Unix Network Programming》(UNIX网络编程) ,注意这套书是三卷本。
宋宝华 的《Linux设备驱动开发详解》。一本介绍Linux设备驱动开发理论、框架与实例的书,是作者多年Linux设备驱动开发从业经验的总结。能够在众多海外强手的教材阵中脱颖而出,足见作者的实力。
Robert Love 的
《Linux Kernel Development》(Linux内核设计与实现) 。内核相关概念及如何使用内核介绍的非常到位,全书偏应用,主要强调如何用,以及为了用而需要了解的内核实现。
Daniel P. Bovet和Marco Cesati 的
《Understanding the Linux Kernel》(深入理解Linux内核) ,分析内核代码几乎无出其右者。
John Lions(澳)的
《Lion'Cornmentary on UNIX 6th Edition With Source Code》(莱昂氏UNIX源代码分析) 。本书由上下两篇组成。上篇为UNIX版本6的源代码,下篇是莱昂先生对UNIX操作系统版本6源代码的详细分析。本书语言简洁透彻,曾作为未公开出版物在黑客界广泛流传了二十多年。现在MIT的操作系统的研究生课程里面依然采用的是这本书,unixV6的代码量小,门槛比动辄数百万行的linux更适合初学者。绝对是神作,很难买到这本书,所以如果遇上要毫不犹豫弄到手。

和MSDN类似,Unix/Linux/BSD下也有一个文档大全似的东西,而且只要一个命令就能打开他。他就是所有Unix系统都会自带的
man page ,完整安装的情况下,他已经存在系统中,更重要的是,他是免费的,相对照的MSDN宇宙版至少需要几百美元。
最后,在UNIX下无论如何都必须翻阅的教材是由公认的Unix编程大师、开源运动领袖人物之一Eric S. Raymond亲自撰写的
《The Art of Unix Programming 》(UNIX 编程艺术) ,这本书著名到他有个专用缩写: TAOUP。他不是在技术层面讨论问题,而是从哲学角度来讨论UNIX编程,从而把编程上升到了艺术的高度。

数据结构和算法

数据结构就是在机器里组织数据的方法,而算法就是解决某个问题的总思路。数据结构和算法有两个层次,一开始的时候,它是语言相关的,尤其是对于数据结构来说,因此C和C++的教材要分开。后来在算法的层面,他就只是一种思想,也就和语言无关了。
清华教授严蔚敏和广东工业大学教授吴伟民的
《数据结构(C语言版)》 ,这是清华计算机系的标准教材,还有什么要补充的么。
清华教授殷人昆的
《数据结构(用面向对象方法与C++描述)》 ,也是清华的教材。
Mark Allen Weiss的
《Data Structures and Algorithm Analysis in C》(数据结构与算法分析--C语言描述) 《Data Structures and Algorithm Analysis in C++》(数据结构与算法分析--C++语言描述) 。数据结构和算法分析的经典教材。

之后就可以看深入一点的东西了:
王晓东的
《算法设计与分析》 。国内本科教材,书写得不错。
M.H.Alsuwaiyel(沙特)的
《Algorithms Design Techniques and Analysis》(算法设计技巧与分析) 。本书结构简明,内容丰富,适合于作为计算机学科以及相关学科算法课程的教材和参考书,尤其适宜于学过数据结构和离散数学课程之后的算法课教材。同时也可作为从事算法研究的一本好的入门书。
Thomas H.Cormen, Charles E.Leiserson的
《Introduction to Algorithms》(算法导论) 。这是麻省理工学院计算机系的算法教材,已经成为世界范围内广泛使用的大学教材和专业人员的标准参考书。

经典中的经典,每一个想要掌握算法精髓的人都必须看的书,算法书中的圣经,他就是:
大师中的大师 Donald E.Knuth的
《Art of Computer Programming》(计算机程序设计艺术)
Donald E. Knuth(唐纳德 E. 克努特,中文名高德纳)是算法和程序设计技术的先驱者、计算机排版系统TEX和METAFONT的发明者,他因这些成就以及大量富于创造力和具有深远影响的著作(19部书,160篇论文)而誉满全球。这么说吧,目前你所能听说过或者还活着的那些计算机软件大牛,没有哪个不直接或间接的受过Knuth的教导。他强悍的程度只用一件小事就可以说明,在撰写这套《计算机程序设计艺术》的过程中,由于感到原有排版系统的不足,他特地重新制作了一套新的计算机排版系统,这套称为TEX的东西目前已经是出版界的标准系统。
《计算机程序设计艺术》这套关于算法分析的多卷论著已经长期被公认为经典计算机科学的定义性描述。迄今已出版的完整的三卷已经组成了程序设计理论和实践的惟一的珍贵资源,无数读者都赞扬Knuth的著作对个人的深远影响,科学家们为他的分析的美丽和优雅所惊叹,而从事实践的程序员已经成功地将他的“菜谱式”的解应用到日常问题上,所有人都由于Knuth在书中表现出的博学、清晰、精确和高度幽默而对他无比敬仰。微软的盖茨曾经说:如果你能完成他书中50%的习题,请尽管给他寄简历。(事实上,用盖茨来衬托Knuth简直是对Knuth先生的侮辱)

此书原定计划为七卷。目前已出版四卷,作者还在撰写后续部分。已出版的分别为:
第1卷 基本算法 Volume 1: Fundamental Algorithms
第2卷 半数值算法 Volume 2: Seminumerical Algorithms
第3卷 排序与查找 Volume 3: Sorting and Searching
第4卷 组合算法 包括:
第4卷 第0册 组合数学和布尔函数 Introduction to Combinatorial Algorithms and Boolean Functions
第4卷 第1册 尚未出版
第4卷 第2册 生成所有元组和排列 Volume 4, Fascicle 2: Generating All Tuples and Permutations
第4卷 第3册 生成所有组合和分划 Volume 4, Fascicle 3: Generating All Combinations and Partitions
第4卷.第4册 生成所有树 Volume 4,Fascicle 4: Generating All Trees History of Combinatorial Generation

各种图形以及其它库
图形库,著名的有两个:OpenGL和DirectX。
OpenGL(“Open Graphics Library”)是一个性能卓越的三维图形标准,是图形硬件的软件接口。他是在SGI等多家世界闻名的计算机公司的倡导下,以SGI的GL三维图形库为基础制定的一个通用共享的开放式三维图形标准,具有使用简便、效率高、便于移植、性能卓越等特点,独立于窗口系统和操作系统,以它为基础开发的应用程序可以十分方便地在各种平台间移植。目前包括Microsoft、SGI、IBM、DEC、SUN、HP等大公司都采用了OpenGL做为三维图形标准,许多软件厂商也纷纷以OpenGL为基础开发出自己的产品,其中比较著名的产品包括动画制作软件Soft Image和3D Studio MAX、仿真软件Open Inventor、VR软件World Tool Kit、CAM软件ProEngineer、GIS软ARC/INFO等等。包括迪斯尼梦工厂等好莱坞厂商的大批电脑特效程序都是使用的OpenGL库。
OpenGL有两大经典教材:
OpenGL体系结构审核委员会,Dave Shreiner, Mason Woo, Jackie Neider, Tom Davis 联合撰写的《
OpenGL Programming Guide: The Official Guide to Learning OpenGL》(OpenGL编程指南),此书因封面为红色,被大家爱称为“红宝书”。
Richard S Wright和Benjamin Lipchak的
《OpenGL SuperBible》(OpenGL超级宝典),是另一本合适的入门教材。
OpenGL结构评审委员会的
《OpenGL Reference Manual》(OpenGL 参考手册),就和他的名字一样,它是一本文档大全,和“红宝书”相对应,他被称为“蓝宝书” 。
按照前辈的经验,有红蓝两宝书足矣。不过,OpenGL社区的实力雄厚的很,好为人师的大牛也不少。有一位昵称NeHe的大牛,他在自己的网站上放了一整套完整的OpenGl教程,实例教学讲解清晰,而且会跟随OpenGL的发展在随时更新,更重要的是,除了C/C++的标准例程之外,他的例程还几乎涵盖世界上的所有语言,如果想用自己喜欢的独特语言,可以参考页面最下方的联接。
NeHe的教程在http://nehe.gamedev.net/。同时,Nate Robin的例子对你理解OpenGL很有帮助。http://www.gamedev.net/reference/articles/article839.asp。
OpenGL最权威的资料在他的官方网站 http://www.OpenGL.org的Documentation中,可以下载到官方教程和例子程序。

DirectX是微软提供的一种应用程序接口(Application Interface)。简单的说它是一个提高系统性能的辅助加速软件。"Direct"的意思是"直接的",而"X"则意味着"无限"。事实上它是一个.dll(动态连接库Dynamic link library)的文件集合。通过这些动态连接库文件,开发者们可以在不考虑设备差异的情况下访问硬件最底层。这项特性使程序员从无尽的硬件驱动程序中解脱了出来。DirectX同时封装了一些COM(Component Object Model)对象,这些 COM 对象为访问系统硬件提供了一个主要的接口。DirectX是一种游戏开发利器,Windows下的大量游戏在制作时都用到了它。DirectX包括很多组件,他们按功能划分为:DirectDraw,Direct3D,DirectMusic,DirectSound,DirectShow,DirectPlay,DirectInput,DirectSetup and AutoPlay等等。
在DirectX中最重要并且最具有代表性的是Direct3D和DirectDraw(在DirectX7.0之后被合并进了Direct3D),它的主要功能就是3D图形。Direct3D和OpenGL处于竞争关系,很难评论他们孰优孰劣。OpenGL专攻图形,而且适用众多平台。而DirectX可以在Win平台下获得多样的服务,而不止是图形。
如果你想学习如何使用DirectX,那么必须得掌握BASIC或Delphi或C++/C#等语言中的一种,纯C是不行的。同时,掌握Win32编程技术以及一些其他相关的知识也是必需的。
Frank D.Luna的
《DirectX 9.0 3D游戏开发编程基础 》可以作为你的入门书。DierctX合适的入门书其实很多,重点是要注意版本要跟上最新的DircetX才行。
微软的东西,最标准的教材就是
MSDN。想深入学习DirectX,就去翻阅MSDN好了。而且,那里也有不错的入门资料。
OpenGL和DirectX的最新进展往往是由显卡厂商作出的,经常去Nvidia和ATI的主页上去关注最新技术是个好选择。

其他库,比如用于构建窗口程序框架的GTK、QT、wxWidgets等,用于科学计算的Blitz、CGAL,网络通讯的ACE,加解密用的Crypto++,测试用的CppUnit,XML用的xml4c、XMLBooster、Xerces c++,当然也少不了即将加入标准库的Boost,这些库由于在不断的发展进化中,实体出版物相对较少,但他们自带的电子文档和相关主站上的资料通常足以满足需求。请记住,既然这些库的作者把他们发布给大家用,他当然要给齐资料让我们知道怎么用才行。

软件工程思想

当软件膨胀到一定程度,它就不是一个人能搞定的了。这个时候,就要像建筑上对待一个大型工程项目一样,通过有效的组织管理来进行软件生产。这种思想就叫软件工程。而实际上,即使是个人开发者,在初窥编程门径之后,也建议学习软件工程,从而培养起好的编程习惯便于将来的集体合作。所谓好习惯的养成是很难的而改掉坏习惯就更难,所以千万不要养成坏习惯。
林锐、韩永泉的
《高质量程序设计指南--C++/C语言》 会让你大吃一惊,原来你原先的编程习惯就有这么多的漏洞。
Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides的
《Design Patterns:Elements of Reusable Object-Oriented software》(设计模式:可复用面向对象软件的基础) ,这是软件复用的权威教材,不过似乎要有很久编程经验之后才能领会。
Andrei Alexandrescu 著 侯捷 译的
《Modern C++ Design Generic Programming and Design Patterns Applied 》(C++设计新思维——泛型编程与设计模式之应用) 是从实例上演示设计模式的。
Martin Fowler著 侯捷 译的
《Refactoring: Improving the Design of Existing Code》(重构:改善既有代码的设计) ,与巨著《设计模式》并称"软工双雄",全美销量超过100000册,亚马逊书店五星书。
Ian Sommerville的
《Software Engineering》(软件工程 )直接以软件工程为名的书,猜猜也知道有多强,此书已经再版8次。
Frederick P.Brooks的
《The Mythical Man-Month: The Essays on Software Engineering》(人月神话) 。出版于1975年的《人月神话》是软件开发方面的经典作品。在软件领域,很少能有像《人月神话》一样具有深远影响力并且畅销不衰的著作。Brooks博士为人们管理复杂项目提供了最具洞察力的见解,既有很多发人深省的观点,又有大量软件工程的实践。32年后的今天,他的思想仍然引领我们。他是和《计算机程序设计艺术》一样经典的著作。

找书的诀窍

     可能有一天你会踏入一个别的编程领域,比如人工智能、加解密和密码学、网络与通讯、嵌入式等等,我并没有在这里列出书单,又或者你打算自己找些书。有什么能快速找到好书的技巧么,除了在线上论坛新闻组等地方寻找别人的推荐评价,在老师和前辈师兄师姐那里咨询之外,还有一个极为简洁的方法,那就是去找著名大学的计算机教材。声名在外的麻省理工、加州伯克利和清华,他们的教授们的眼光绝对是你可以信任的。买书时参看出版社也是个好办法,国内的清华大学出版社、机械工业出版社、电子工业出版社、人民邮电出版社四家出好书的机会很高,不过有时翻译质量是个问题。国外的O'Reilly可以说是最专业的计算机图书出版商,他出的没有不是经典的。此外Addison Wesley、Microsoft Press、 Pearson几家也尽是出猛书的地方。这个经验可不止是适用于编程哦。

光看书似乎不解决问题,难道要做题
     当然要做题,而且做题也要循序渐进。
     首先是教材正文中的示例,然后是书后的练习题。
     第二步可以做国家等级考试二级三级的C语言题。在线上可以找到,大量二级题库。三级题推荐南开的三级100题。此外VCgood群的共享文件中也有一些这一难度的题目。
     正如前面讲过,当第二步的题目都做完后,语法已经不是问题,应该开始学习数据结构和算法。这个方面的练习题可以去各大OJ。OJ是什么,请看下一节。

OJ是什么
     OJ是OnlineJudge的缩写。OnlineJudge是一种在线裁判系统。她可以对程序原代码进行编译和执行,并通过预先设计的测试数据来检验程序原代码的正确性。
     首先,他是一个在线的题库,有很多习题,你可以任选其中之一来解答。然后,系统的编译器能够编译执行你所提交的代码。如果编译通过,针对每个题目,系统将使用自带的多组测试数据检验你的程序,如果程序都能得到正确的输出,那么你顺利地解决了这个问题。最后,系统还能对所有参与答题的用户进行统计和排名。
     OJ的题目大部分是关于算法的。题目的输入输出通常是命令行方式,而非图形界面。也就是说,要关注的不是平台的兼容性、文件的格式抑或窗口的布置这种无关紧要的细节,而是问题本身的逻辑实现。一个用户提交的程序在Online Judge系统下执行时将受到比较严格的限制,包括运行时间限制,内存使用限制和安全限制等。用户程序执行的结果将被Online Judge系统捕捉并保存,然后再转交给一个裁判程序。该裁判程序或者比较用户程序的输出数据和标准输出样例的差别,或者检验用户程序的输出数据是否满足一定的逻辑条件。最后系统返回给用户一个状态,通过、错误、超时、溢出或是无法编译。
     Online Judge系统来自ACM和IOI大赛。由美国计算机协会(ACM Association for Computing Machinery)发起和组织的ACM国际大学生程序设计竞赛(简称ACM/ICPC)是目前世界上规模最大的计算机学科赛事。IOI则是国际信息学奥林匹克竞赛,和数学奥林匹克竞赛一样著名。Online Judge系统是IOI或ACM的训练题库,同时也是ACM和IOI的评分系统。

哪里有可用的OJ
     以下几个OJ都很不错,请随意进入。也可以自行搜索,国内很多学校的OJ正在热火朝天的建设中,有的甚至直接作为了考试用系统。
         Vijos http://www.vijos.cn/
   内容丰富、分类清晰明了的中文在线评测题库。题量适中(目前大约400题左右),难度面向初学者和中学生,尤为重要的是,界面和题目都是中文的。

     USACO http://ace.delos.com/usacogate/
     全美计算机奥林匹克竞赛(USACO)的训练网站,特点是做完一关才能继续往下做,与通常的OJ不同的是测试数据可以看到,并且做对后可以看标准解答(包括分析),所以如果大家刚开始的时候在上面那些OJ上总WA却找不到原因的话,可以试着来这里做做,看看测试数据一般是从什么地方阴你的。此外,虽然都是英文题目,但在国内有人做了翻译,有全部题目的中文译本,搜索即可。
     这两个强烈推荐新手前往。

     浙江大学的Online Judge http://acm.zju.edu.cn/
     国内最早也是最有名气的OJ,有很多高手在上面做题。特点是数据比较刁钻,经常会有你想不到的边界数据,很能考验思维的全面性。

     北京大学的Online Judge http://acm.pku.edu.cn/
     建立较ZOJ晚一些,但题目加得很快,现在题数和ZOJ不相上下,特点是举行在线比赛比较多,有报告称数据比ZOJ上的要弱,有时候同样的题同样的程序,在ZOJ上WA(wrong answer),在POJ上就能AC(accomplished)
     这两个可以说是国内顶级水平了。

     西班牙的Universidad de Valladolid http://acm.uva.es/
     世界上最大最有名的OJ,题目巨多而且巨杂,数据也很刁钻,全世界的顶尖高手都在上面。据说如果你能在UVA上AC一千道题以上,就尽管向IBM、微软什么的发简历吧,绝对不会让你失望的。

     俄罗斯乌拉尔大学 http://acm.timus.ru/
     也是一个老牌的OJ,题目不多,但题题经典。
     有实力的朋友,尽量去国外的OJ为国争光吧。那上面中国大陆选手的排名可不怎么靠前哦。

  另外几个可以尝试,但不保证服务器总是开机的站
     myOJ http://myoj.kuye.cn/
     建站人员自称是专为中学生OI选手训练使用,由中学生和中学教师共同开发的,也是给中学生和中学教师使用的。优点是题目难度较低,而且题目都是中文版易于阅读。

     浙江大学宁波理工学院 http://acm.nit.net.cn/
     也是适合新手的OJ,题目难度由低到高不等。中文题不少。

     同济大学的OJ http://acm.tongji.edu.cn/ 大部分是中文题。
     南开大学的OJ http://acm.nankai.edu.cn 界面友好,部分中文题
     天津大学的OJ http://oi.tju.edu.cn/ 界面题目皆中文
     杭州电子科技大的 http://acm.hdu.edu.cn/
     武汉大学的 http://acm.whu.edu.cn/noah/
     这几所大学的题目难度相近,甚至有好多是相互借用的,难度等级要比北大和浙大的低一些。
     一个人孤单做题的滋味是很郁闷的,尤其是当你确实绞尽脑汁也搞不定的时候。幸好线上还是有很多同样在做题的朋友,他们通常会在论坛BBS之类的地方集中讨论解题心得,甚至有可用的答案。建议用OI (Olyimpiad in Informatives 信息学奥林匹克)为关键字搜索。请不要用答案代码直接提交哦。

哪里有代码示例可看
     这个可以自己google或baidu。
     如果你已经能够做一些OJ的题了,那么可以考虑看一些开源软件的代码。http://sourceforge.net/ 是全球最大的开源软件集中地,确定一个应用主题上去找就会有收获。不过说实话,从OJ到项目是很大的跨越,所以要找到适合自己的项目来看是不容易的。个人的建议是,找一些知名的又比较小规模的项目,然后找他的早期版本的代码,会比较清晰,比如 vim1.0/2.0 lua1.0 apache1.0这种。

你可能感兴趣的:(C++)