怎样才能学好程序设计?

程序设计=数据结构+算法
服务器君一共花费了158.013 ms进行了5次数据库查询,努力地为您提供了这个页面。
试试阅读模式?希望听取您的建议

有许多网友都曾迷惑地问我:“怎么样才能学好程序设计?”。这不是一两句话能说清楚的,于是我就写了这篇文章,给广大爱好者一个能解惑的方法,无论你是什么样的“鸟”都应该能在这篇文章里找到一点干货。

什么是程序设计

话就从一个著名的公式说起:程序设计=数据结构+算法。

每当我写下这个公式的时候,心中总有一种新的感悟,可是就这个程序界尽人皆知的公式却难倒了一大批想和Bill·Gates一争高下的朋友,下面我为大家解剖这个公式:

程序设计”说白了就是大家所谓编程,先不管这个词中有什么深刻的内涵,先看看等式右面的这两个名词。 

按照官方的定义:

  • 数据结构即非数值计算的程序设计问题中的计算机的操作对象以及它们之间的关系和操作;
  • 算法是对特定问题求解步骤的一种描述,是对指令的有序序列。

官方的解释就是经典,可是我们看了却更糊涂了。别急,听我给大家解释。 

程序设计就像盖房子,数据结构就像砖、瓦,而算法就是设计图纸。你若想盖房子首先必须有原料(数据结构),但是这些原料不能自动地盖起了你想要的房子;你必须按照设计图纸(算法)上的说明一砖一瓦地去砌。这样你才能拥有你想要的房子。程序设计也一样,你使用的编译工具(如Jave /C/Basic/Pascal等)中有各种功能语句或基本结构(如Read/Write/Real/Boolean等),它们不会自动排列成你要的程序代码。你得按照程序规定的功能去编写,而程序的功能是实现就是算法的具体体现。所以通俗地说:你必须按照特定的规则,把特定的功能语句和基本结构按照特定的顺序排列起来,形成一个有特定功能的程序,这就是:程序设计=数据结构+算法。

数据结构是程序设计这座大厦的基础,没有基础,无论设计有多么高明,这座大厦不可能建造起来的。算法则是程序设计的思想,它的灵魂!没有灵魂的程序不能叫程序,只是一堆杂乱无章的符号而已。在程序设计中,数据结构就像物质,算法就是意识。这就像哲学上说的:意识是依赖与物质而存在的,物质是由于意识而发展。双方是相互依存、缺一不可的! 

数据结构内容不多仅仅有几个系统自带的基本结构(像顺序结构、分支结构、循环结构、函数过程)数据类型(整型、实型、布尔、字符等)和用户定义的高级点的数据结构(数组、集合、文件、指针(队列、栈、树、图等)······)就这么多。可是算法却不同了,它是多中多样的!它可以让你让数据以你想要的方式排列(当然要符合语法和功能要求^_^)。再打个比方,数据结构是人体的各种组织、器官,算法则是人的思想。你可以用你的思想去支配你身体的各个可以运动的器官随意运动。如果,你想去取一个苹果,你可以走过去,也可以跑过去,只要你想,你甚至可以爬过去。但是无论如何,你你的器官还你的器官(没有变),目的还是同一个目的(取苹果),而方式却是随心所欲!这就是算法的灵活性,不固定性。因此可以这样说:数据结构是死的,而算法是活的!现在明白许多了吧!

怎样学习程序设计

上面说了许多数据结构的在程序设计中重要性,所以努力学习好数据结构是学好程序设计的第一步,也是关键的一步。你初学起来一定会觉得难,枯燥(其实我当时也是这么想的 ^_^),什么标准文件、标准类型、标准函数、标准过程搞的你烦不胜烦。于是,就有许多初学者就厌倦了,停滞不前了,退缩了。你若是想编好程序的话就想:难道就这么一点点小困难就难倒我了吗?我还要挑战Bill·Gates呢?我一定能行,相信自己,一定会闯过这一关的!这样以来,你就具备了程序员最基本的素质——毅力。这一点是程序员必备的,否则在后面开发程序的漫长时间里,你会熬不住的。而且只有这样你才能静下心来学习。这一端时间没有什么捷径,只有多看书、多练习,把所有结构和类型的用法都找掌握牢固。最好呢,有一位老师指引,这样比自己在这条路是摸黑前进强多了,而且往往还事半功倍。切记!只要跨出了第一步,以后就容易多了,万事开头难嘛!一定要坚持,当你过了这一端时间以后,你就发现程序设计根本没有你想象的那样难。当你把所有的东东都学会时,程序设计的大门已经向你敞开了一扇,而另一扇就是······  

算法,这个是程序设计的重点,也是难点。许多菜鸟和老鸟的区别主要在对算法掌握的熟练程度上面。有许多朋友曾这样问我:“我数据结构上面的都学会了,也知道该怎么样用,可是我为什么还是在编程时,不知道该怎样用呢?其实,这就是缺少算法思想的一个具体表现。并不是学好了数据结构就会编程了。算法是灵活多变的,它不像数据结构那样有固定的形式。算法是不固定性就决定了它的特点,你不可能把所有的算法都学会,因为它是无穷尽的。但是你要是能把自己学的有限的算法融会贯通了,那你就了不起了。就好象你只学会了1、2、3这三个数,但是你可以组成12、23、32、123······所以算法这条路既长有短,既难又易。

学习好算法的方法不少,在此详细的给大家举几个例子。

首先,你要养成一个良好的程序设计风格和习惯。这也分许多种。其中最重要的是养成自上向下逐步求精的程序设计思想和方法。怎样才是自上向下逐步求精的程序设计呢。举个例子。有这样一个问题:已知三角形的两边及夹角,求第三边及面积。 

现在,当你看到这个问题是,你不要立即下手去编写,而是要思考一下怎样才能求解(算法),然后把它写下来以免忘记。于是就写了: 

一级算法: 

  1. 输入两边的长度a、b以及夹角A
  2. 计算第三边c和面积s                              
  3. 输出c以及s                             

当你写完之后,你若觉得第2步不太清晰,还不能写出代码,那就继续求精。        

二级求精: 

  • 将α的角度转换为弧度; 
  • c=sqrt(a*a+b*b-2*a*b*cos(α)); 
  • s=1/2*(a*b*sin(α)) 

哈哈,这样问题不就得到解决了吗?接着就可以轻松的编代码了。再仔细看看上面的步骤:先写出一级算法,如果觉得由此还是得不到源代码,或者是其中有一步还有很多步骤要写,那么就继续求精,直到你认为可以很清晰的写出代码为止。但是求精可以因人而异,像上面的题目,若是一个编过很多程序的大虾来说,可能不用什么求精,代码就可以直接写出来了;但要是一个菜鸟(像我一样)就可能要写到二级求精。 

这样说来,你可能认为这个求精是不是太慢,抑或根本就是在浪费时间。我大声告诉你:根本不是!这可是众多的编程先驱、编程达人们推荐的基本方法。你知道编程中,主要时间用在了哪里吗?不是编写代码,而是用在了求解算法和调试程序上了!而算法的求精就是缩短这些时间的最好的方法。它可以使你不用再很费力的苦思冥想到底该怎样构造算法,使这个过程更条理、更简明;它也很可能使你不用再为了一个小小BUG而调试半天,因为,它给出的算法已经趋于完美。其实,列一个小提纲(算法)就可以解决很多的问题,生活中不也是如此吗?!所以,第一,求精算法这个最重要的习惯一定要养成哦! 

还有一个好的习惯就是要做到:程序源代码的清晰度与可读性一定要高。 

这是为什么呢?在源代码中,每行代码前面的空格的有无与多少并不影响程序的运行,但是它影响人的阅读。你想,当你看到一片代码,格式杂乱无章,没有什么主次内外一定会头痛不已,绝对是看了第一遍就不想再看第二遍了。而且当你调试这样的代码时,也会被一个小错误弄的找不到北了。如果格式很清晰的话,这样的代码就非常易读,结构很清晰,begin..end都看的清清楚楚。我想这样的代码阅读和调试起来一定很顺手的。 

还有就是在有些重要的代码块后加入注释,也可以提高程序的可读性。不说别人,就说我就深有体会:以前代码不加注释,当时对其结构很清楚,可是过了几个星期之后,再看代码简直就像看另外一个人写的一样,要费不少工夫才能弄懂,代码越多越如此。自己还很难理解自己的代码,更不用说别人了。因此费点力气加上注释还是值得的。 

还有的人喜欢用 goto语句跳来跳去,虽然增加了编写代码的灵活性,可是却严重破坏了程序的结构化,容易造成程序运行和大脑思维的逻辑混乱,很可能导致一些很不容易发现的错误。而且所有的goto都可以用其他的语句来代替。所以在这里建议大家少用goto。能不用就不用。以上是说了要提高代码的清晰度与可读性。 

上面用了不少字来介绍程序设计中良好习惯的作用与好处,这算是程序设计的一个基础,希望对大家能有所帮助。下面介绍其他促进编程水平的方法。 

其次,就是多加练习和多多与别人交流心得,研究和欣赏别人优秀的程序代码(上面说的清晰度与可读性的重要的一点就在这里体现了)。无论干任何事情,只有经常练习才能熟练的掌握与应用。它不仅能帮你提高对算法的认知程度,还可以使你更好的理解数据结构;而交流心得与欣赏别人的代码则是要你学习别人优秀的独特的见解与逻辑思维,许多‘老鸟’就是在研究优秀代码中慢慢成长起来的。但研究和欣赏并不是意味着让你‘全盘西化’;它是说既不要拘泥于自己一成不变的思考方式,也不要成为别人思想奔驰的高速路,而是让你取长补短,取其精华,去其糟粕,这才是我要说的。另外,在编译一个程序时,要多想几种不同的算法,反复比较,看看究竟哪个更适合这个程序。这样,不仅有助于提高你程序的运行效率,更重要的是有助于提高你对算法的认识和思维的广度。 

看完上面这么多,你会发现程序设计的这半扇门似乎并不是想象的那么容易打开;但是如果你能耐住寂寞与枯燥的考验,按部就班、循序渐进的练习,思考,不知不觉中你的水平已经提高了很多。 

除了上面说的求精算法和数据结构外,数学方法和逻辑思想对你的程序设计也会有一定的影响(这也属于算法)先说数学方法,它是指导你学习的一个重要的助手。比如你要实现一个看似很复杂的函数,而且你编写了一大堆代码,什么结构和类型都用上了,可是还是实现不了。这时候先别着急,也许在你做这个函数前就要静下心来,仔细思考,看看有什么数学上学习的特别公式能够实现这个问题吗?如果你真的灵感大发,把它挖了出来,恭喜你!(答对了!)我想这个时候你一定会高兴的手舞足蹈,这种感受,我想大家在做数学题OR其他难题时一定深有体会。 

这样说太空洞,不如举个例子:将8个‘车’放在8X8的国际象棋棋盘上,如果它们两两均不能互吃,那么称8个‘车’处于安全状态。问总共有多少种不同安全状态?对于这样的题一般的解法是用‘回溯法’,即先有顺序的固定一个棋子,然后将剩下的逐行试探,如果可以则摆放下一个,要是不行就把该棋子换一个位置,直到所有的方法都用(遍历)一遍。这样看来这个方法真的很麻烦,不因需要编写大量代码,而且还要用到‘递归’(编程的一个重要的算法)。使程序的效率大大降低。但是我们可以想想有没有更好的数学方法。肯定有!你看在第一行中,棋子可以在8个空格内随意摆放而不会受到攻击;而第二行,棋子则只有在7个空格内再挑选一个了;第三行就只有6个……依次类推第8行就只剩下一个空格了。所以这个方法一共有8X7X6X5X4X3X2X1即8!种解法,这不就是数学中的排列与组合的问题吗?若不进一步思考,盲目地逐个枚举方案,其笨拙是可想而知的了。所以在设计算法时,一定要仔细思考有没有更好的数学公式或思想与之相关联,这样往往会收到意想不到的好效果。 

说完数学,再说哲学。 

其实,哲学是所有学科是总和。她当然也包括程序设计这门新兴的学科了。(不要以为它们之间没有关系哦!) 

我这里说的是哲学的一小部分,那就是逻辑学。一个人若没有严格的逻辑思维,他/她的程序一定有不少虫子(bug)。然而对于这些虫子,他/她可能不知道;也很有可能知道了,但是就不知道哪里出错了。这就是因为他/她没有把问题出现的情况(包括出错的情况)考虑全面而造成的。虽然理论上所有的程序都有一定的漏洞(尤其是代码越多的程序越是如此),但是我们可以尽我们的全力把问题考虑全面,使错误发生的几率降低到最小,以确保程序的稳定性。咱们来看一个很有趣的反面例子:偶在很久以前编过一个小程序(老师布置的作业),其功能是输入你的生日,然后再输入某天的日期,最后计算出你到这一天一共活了多少天。我很快就完成了,用数据测试几次还不错,于是让老师来检查我的作业。他让我输入,我于是就输入了1989 1 28,然后回车,再输入1999 1 28,我太激动了把1999输入成了1899,而且我竟然没有发觉。于是偶自信的敲了回车。结果出来了,当时大家都笑翻了,此后,我有一段时间再也不敢让老师“欣赏”我作的题目…… 以上就是偶因为逻辑不严密造成的笑话,大家可不要学我啊!所以说,提高逻辑思维能力也是提高编程效率的很有效的方法。 

世界上所有的学科都有联系。当数学与逻辑学擦出‘爱情’的火花时,程序设计就有了雏形。其实还有其他的学科也会影响程序设计,比如英语,地球人都知道,现在绝大多数程序源代码是用英文编写的,而且很多开发工具、编译工具还有一些用来参考的小程序几乎都是英文界面。学好英语对代码的分析、对数据结构的了解以及对开发程序或软件的效率都有帮助。因此在学习程序设计这门课程时,可不要丢了其他啊! 

以上罗嗦了不少,无非就是向大家解释沃斯教授的那个公式。看不懂也不要紧,有的名词在以后的学习中慢慢就明白了。你看,玩游戏要有装备,我们搞程序设计当然也要有了: 

硬件部分: 

  1. 一台电脑。586以上就可以,不用太高,除非你设计大型软件,我想像我们这样的初学者用这样的电脑已经足够了,也就是说,你要你有电脑就能编程。当然,机子配置越高越好了。(必备) 
  2. 一本入门的好书。这本书不要求有内容多么高深,技术多么先进,书本有多么厚。只要它能带你入门,而且给你一个良好的编写习惯和正确的指导方向,就已经足够了!(必备) 
  3. 一到N本提高的书,你在看这些书之前应该能够自己流畅地编写入门书上的作业了,这些书应该是一些经典的作品,一般来说国外的写的比较好一些(我可不是重洋媚外啊),他们的书写的比较详细,讲解也比较透彻。你要是不在乎国内的书教材味比较浓,而且钱不是很多,你也可以买哦。无论所有的书一定要选那些评价很高的,毕竟群众的眼睛还是雪亮的嘛!(必备) 
  4. 一位好老师,其实老师和书本的作用是一样的,只是老师比书本的互动性更强,可以更好地回答你的问题并指导你走向正确的道路。所以有个好老师是能很快提高你的水平的,当然该老师也要和我上面说的第二点一样,要有良好的编写习惯和正确的指导方向哦!千万别找那些‘毁人不倦 ’的人哦.^o^(推荐)

软件部分: 

  1. 一个趁手的编译器,要编好程序,顺手的工具是必不可少的。要是一开始你想要简单易用的工具,建议使用VB、TC(Turbo C)、TP(Turbo Pascal)等等。你若是喜欢功能强大的IDE(]Integrated Development Environment]集成开发环境)那么就推荐使用VB.NET、BCB(Borland C++ Builder)、Borland Delphi、Eclipse(Java)…… (必备) 
  2. 一个良好的心态。学习编程心态要放低,虽然你可能梦想要打倒微软帝国,可是你不要以为自己真的就有实力把Bill PK掉,一定要从最简单的开始做起,不要眼高手低,荒于练习。否则你可能给他打工他都不要哦!(必备) 
  3. 一颗坚定的信念。搞程序设计有时是很累人的(要不然大家都成软件工程师了,BILL的饭碗不就砸了),在某一个关键点是你要付出超乎想象的汗水和不计其数的脑细胞。这就叫“衣带渐宽终不悔,为伊消的人憔悴!”要保持一种吃苦耐劳的打不垮精神,革命才能成功啊!同志们。(必备)

其实总而言之呢,无论是新手还是大虾,要的就是勤学苦练,只有这样,你才能走上通向程序设计金殿的成功之路。 

到了这里你会发现,这就是程序设计,就这么简单、有趣,而有充满的艰辛与苦涩。设计一个艰难的程序,就像母亲分娩一样,一定会有巨大的痛楚。但当你为你早已调试了N^N次的代码加上最后一笔时,一个崭新的生命就诞生了!Eureka!它带着羞涩而好奇的神态向这个世界发出第一句“Hello,World!”的问候时。你那种感觉就像是上帝面对自己亲手造出来的生命,你以往所有的不快都会烟消云散。你会发现程序设计,这项伟大的工程,教予你的不仅仅是一种技术,更是对生命的热爱,对人生的执着,对完美梦想的追求!

后记 

有人说,学习是无聊的,但有亿万芸芸学子不懈地投入其中。 

有人说,科学是艰难的,但仍有大批科学家为之奋斗终生。 

也有人说,编程是枯燥的,可是我要站起来最全世界说:“我爱她,就像爱我的生命!”

本文地址:http://www.nowamagic.net/librarys/veda/detail/2174,欢迎访问原出处。

不打个分吗?

转载随意,但请带上本文地址:

http://www.nowamagic.net/librarys/veda/detail/2174

如果你认为这篇文章值得更多人阅读,欢迎使用下面的分享功能。
小提示:您可以按快捷键 Ctrl + D,或点此 加入收藏

大家都在看

阅读一百本计算机著作吧,少年

很多人觉得自己技术进步很慢,学习效率低,我觉得一个重要原因是看的书少了。多少是多呢?起码得看3、4、5、6米吧。给个具体的数量,那就100本书吧。很多人知识结构不好而且不系统,因为在特定领域有一个足够量的知识量+足够良好的知识结构,系统化以后就足以应对大量未曾遇到过的问题。

奉劝自学者:构建特定领域的知识结构体系的路径中再也没有比学习该专业的专业课程更好的了。如果我的知识结构体系足以囊括面试官的大部分甚至吞并他的知识结构体系的话,读到他言语中的一个词我们就已经知道他要表达什么,我们可以让他坐“上位”毕竟他是面试官,但是在知识结构体系以及心理上我们就居高临下。

所以,阅读一百本计算机著作吧,少年!

《算法导论(原书第2版)》 科曼(Cormen T.H.) (作者), 等 (作者, 译者), 潘金贵 (译者)

《算法导论(原书第2版)》一书深入浅出,全面地介绍了计算机算法。对每一个算法的分析既易于理解又十分有趣,并保持了数学严谨性。本书的设计目标全面,适用于多种用途。涵盖的内容有:算法在计算中的作用,概率分析和随机算法的介绍。本书专门讨论了线性规划,介绍了动态规划的两个应用,随机化和线性规划技术的近似算法等,还有有关递归求解、快速排序中用到的划分方法与期望线性时间顺序统计算法,以及对贪心算法元素的讨论。本书还介绍了对强连通子图算法正确性的证明,对哈密顿回路和子集求和问题的NP完全性的证明等内容。全书提供了900多个练习题和思考题以及叙述较为详细的实例研究。

更多计算机宝库...