回 帖 发 新 帖 刷新版面

主题:[转帖]C语言的学法

(一)
很多人对学习C语言感到无从下手,经常问我同一个问题:究竟怎样学习C语言?我是一个教师,已经开发了很多年的程序,和很多刚刚起步的人一样,学习的第一个计算机语言就是C语言。经过这些年的开发,我深深的体会到C语言对于一个程序设计人员多么的重要,如果不懂C语言,你想写底层程序这几乎听起来很可笑,不懂C语言,你想写出优秀高效的程序,这简直就是天方夜谭。为什么C语言如此重要呢?

第一:C语言语法结构很简洁精妙,写出的程序也很高效,很便于描述算法,大多数的程序员愿意使用C语言去描述算法本身,所以,如果你想在程序设计方面有所建树,就必须去学它。
第二:C语言能够让你深入系统底层,你知道的操作系统,哪一个不是C语言写的?所有的windows,Unix,Linux,Mac,os/2,没有一个里外的,如果你不懂C语言,怎么可能深入到这些操作系统当中去呢?更不要说你去写它们的内核程序了。
第三:很多新型的语言都是衍生自C语言,C++,Java,C#,J#,perl...哪个不是呢?掌握了C语言,可以说你就掌握了很多门语言,经过简单的学习,你就可以用这些新型的语言去开发了,这个再一次验证了C语言是程序设计的重要基础。还有啊,多说一点:即使现在招聘程序员,考试都是考C语言,你想加入it行业,那么就一定要掌握好C语言。

那么究竟怎样学习C语言呢?

1:工欲善其事,必先利其器
这里介绍几个学习C语言必备的东东:
   一个开发环境,例如turbo C 2.0,这个曾经占据了DOS时代开发程序的大半个江山。但是现在windows时代,用turbo C有感觉不方面,编辑程序起来很吃力,并且拖放,更没有函数变量自动感应功能,查询参考资料也不方便。建议使用Visual C++,这个东西虽然比较大块头,但是一旦安装好了,用起来很方便。
   一本学习教程,现在C语言教材多如牛毛,但推荐大家使用《C语言程序设计》谭浩强主编 第二版 清华大学出版社,此书编写的很适合初学者,并且内容也很精到。
   除此以外,现在有很多辅助学习的软件,毕竟现在是Window时代了,学习软件多如牛毛,不象我们当初学习,只有读书做题这么老套。我向大家推荐一个“集成学习环境(C语言)”,里边的知识点总结和例程讲解都非常好,还有题库测试环境,据说有好几千题,甚至还有一个windows下的trubo C,初学者甚至不用装其它的编译器,就可以练习编程了,非常适合初学者。还有一个“C语言学习系统”软件,不过感觉只是一个题库系统,如果你觉得题做的不够,不妨也可以试试。

2:葵花宝典
学习计算机语言最好的方法是什么?答曰:读程序。
    没错,读程序是学习C语言入门最快,也是最好的方法。如同我,现在学习新的J#,C#等其他语言,不再是抱着书本逐行啃,而是学习它们的例程。当然,对于没有学过任何计算机语言的初学者,最好还是先阅读教程,学习完每一章,都要认真体会这一章的所有概念,然后不放过这一章中提到的所有例程,然后仔细研读程序,直到每一行都理解了,然后找几个编程题目,最好是和例程类似的或一样的,自己试图写出这段已经读懂的程序,不要以为例程你已经读懂了,你就可以写出和它一样的程序,绝对不一定,不相信你就试一试吧,如果写不出来,也不要着急,回过头来再继续研究例程,想想自己为什么写不出来,然后再去写这段程序,反反复复,直到你手到擒来为止,祝贺你,你快入门了。

3:登峰造极
写程序的最高境界其实就是掌握各种解决问题的手段(数据结构)和解决问题的方法(算法)。
是不是写出底层程序就是程序设计高手呢?非也,写底层程序,无非是掌握了硬件的结构,况且硬件和硬件还不一样,要给一个芯片写驱动程序,无非就是掌握这块芯片的各种寄存器及其组合,然后写值读值,仅此而已。这不过是熟悉一些io函数罢了。那么怎样才算精通程序设计呢?怎样才能精通程序设计呢?举个例子:你面前有10个人,找出一个叫“张三”的人,你该怎么办?第一种方法:直接对这10个人问:“谁叫张三”。第2种方法:你挨个去问“你是不是张三?”,直到问到的这个人就是张三。第三种方法:你去挨个问一个人“你认不认识张三,指给我看”。不要小看这个问题,你说当然会选第一种方法,没错恭喜你答对了,因为这个方法最快,效率最高,但是在程序设计中找到解决问题的最优方法和你用的手段却是考验一个程序员程序设计水平的重要标志,而且是不容易达到的。刚才这个问题类似于数据结构和算法中的:Map数据结构,穷举查找和折半查找。所以掌握好数据结构和一些常用算法,是登峰造极的必然之路。最后给大家推荐严尉敏的《数据结构》清华大学出版社,希望每一个想成为程序设计高手的人研读此书。

=============================================================================                               (二)
             关于C语言的学习方法

本人偶然发现了这篇文章拿来和大家分享!

初学C语言的同学应该首先了解C语言关键的核心概念(结构化、三个执行流程、优先级、指针、文件、共用体、函数、作用域、重载等 ),只有弄明白了这些才能在今后的学习中游刃有余的把握C语言的精髓。这几个概念就像逻辑线一样,把整个C语言的体系贯穿起来,给人一种“结构化”的思想体系。下面我简要谈一下这几个核心概念。

     1、从宏观角度来看,结构化是C语言的编程思想基础,就是说C语言每一个功能模块就是一个结构,每一个结构实现一个运算或一个算法,这个结构就用大括号表示“{  }”,大括号里面的就是算法。尤其注意的是大括号的“}”括在那里,就决定在哪里结束算法功能。这些是初学者经常犯的错误,往往会把算法功能的结束点弄错。



    2、 三个执行流程就是顺序流程、条件流程、循环流程。三个流程都是计算机通用的执行流程,是必须了解的流程,每一个算法都基于这三个流程执行顺序。



    3、 优先级是对多个函数并列时候优先算法的特权,没有注意优先级的顺序就会把算法出错,这些优先级是必须记住的。



    4、 指针是C语言的重要特点,是对运算速度加快运算的重要精髓。它是对数据地址的操作,而不是对数据的操作。



    5、文件和共用体是很简单的概念,不用多说了。文件顾名思义和日常概念一样,学过数据软件的都对共用体了解不是太难。



    6、从微观角度来看,函数是C语言的驱动机制,所有的语句都由函数驱动来实现的。记住函数命令和相关的配置参数,就能好好的利用C的优势。注意的是,函数不能记错,不然你将得出错的结果。如果能学会调试,那就会更深一层了解函数功能的作用。



    7、作用域就像使用期限一样,说明从那里到那里所起的作用,在这之外的就不起作用了(过期的东西就不值钱一样)。把握好作用域的使用方式,就能明确函数的关系,不会在巨大的函数名里面迷失方向。



    8、重载就是为了方便用户,使用类似于调用的机制给用户减少写入时间的功能。就像查字典一样,你不懂一个字,就要去查字典(相当于调用别的工具来实现你要做的事),而查字典是你已经学会的东西,就可以做这件事了。



    学习C语言从大体上了解还不够,要把各种原理在脑海里模拟一遍,实现把计算机C的功能在人脑里运作,就能从宏观上把握C的步骤。
**************************************************************************
                                      (三)


好的文章大家共同分享
引言:
    最近看见一些朋友问如何才能学好C/C++,有的也发邮件来询问我.我现在也不能算个牛人,但我觉得自己学的还是比较对路.做为斑竹,也有义务与大家探讨这些问题,一是为了我们这个版,二更是为了大家能够少走弯路.
    我就结合自己的经历,来谈谈我对学习C/C++的看法.

我的历史:
1.  大一下,C语言必修,开始接触C,以后2年多都是用DOS下的TC.书嘛,课本:<C语言程序设计>(潭浩强)
2.  大3,忘了哪个学期,C++选修课,没怎么听,就学了些基本的语法.还是继续用C.
3.  大概是大学最后一年的样子,做一些课程的上机作业,用到一些数据结构,开始用C++的模板类.也可能觉得C++比较时髦,那个时候不管什么东西都故意写成类,所以就渐渐熟了.
4.  做毕业设计,才开始使用VC,主要是发现它的调试环境比TC好.
5.  毕业了,这个时候只会纯C/C++语言,连lib,dll,ocx,以及MFC,API,SDK什么的听都没听说过.我唯一的优点大概就是代码写的比一般人多,那是因为他们都不是自己写的缘故.
    整个大学4年,就2本C和C++的教材,学校发的.也没有找什么东西来做,除了帮一个读夜大的完成过一次作业,都是学校里各课程布置的作业.
    有的人说学校里教的没用.我不同意,至少我觉得自己学的都很有用,都是学校里开的课.我这个人比较懒,不喜欢找东西去学,但我保证做好自己分内的事,老师教什么,我就学什么,完成作业算数.我的导师说过一句话:如果人人都做好自己的事,那么这个社会就不需要雷锋.
6.  然后我就工作了,工资也不高,一般的软件公司.找工作的时候,我就把成绩单一贴,再把自己以前写的比较好的作业来个截图,就OK了.什么自荐信,我后来发现别人更本就不看!我没得过什么奖励,就参加过一次竞赛,来最低等奖学金都没有.有些课不感兴趣,也混个及格,但有些学的的确是不错,和软件相关的这些课分数都比较好.找工作主要还是看成绩的.也没考过什么认证,现在也没有.
    刚开始的时候,我连lib都不会写的,就会写代码,因为我是数学专业的,软件开发这方面没什么接触,以前都是做些算法,写个老长老长的main完事的那种.什么东西都要新学.
7.  但我学的很快,认为是因为我的基础比较好,现在什么MFC,API,SDK,ADO之类的都懂一些了,而且觉得是掌握了OO,是公司里的一个牛人教我的.我从和他半年多的交流中,逐渐领悟了OO的奥义,C++真是博大精深啊!可惜那个人后来走了.
8.  这么多废话,其实很简单:
    2年C
    一年C++,3年只懂语言
    1年工作,学会其它的东东
    瞧我水吧,和我比你是不是要优越多了呢?
    
    到今天我对自己的总体评价还是满意的.我知道,可能我还不如一些在校的学生,但我和自己比,在我从事的事业上,还是对路的.
    有一句话,要送给大家:勤以致学,学以致用.我认为自己有一个最突出的优点,就是:认真!这是现在很多人都缺少的,我做什么事都认真,包括打游戏,要么就干脆不做,要做就要做到最好.或许你的技术和知识都很有限,但只要你把你所掌握的东西发挥到极限,那也不能算比别人差.因为你和别人的差距,只是别人比你多知道一些而已,而这些你迟早都会知道的.
    有的人问,应该学写什么,有的人答,看你做些什么.我想不是,你没有选择任务的权利,除非你自己是老板.我对自己的评价是:劳动力,合格的劳动力,可以完成任何事的劳动力.我遇到的很多事都是自己不懂的,但我知道通过什么途径可以学习,在多长的时间内就可以完成,所以遇到新问题,我一点也不恐惧.
    而且,在学生的时候,我就把自己当作一名程序员,而且是一名真正的程序员!什么才是真正的程序员?我就是,我拥有一个程序员的骄傲,我认为自己写的程序是最完美的,如果不是,那至少是尽我所知的所有手段的最佳结果.知识的匮乏可以用时间类弥补,但一个人的品格却要贯穿始终.因为知道的少而水平烂,那你总有一天可以知道的多而水平高,如果是因为不用心而水平烂,那你一辈子烂到底!
    另外,基础知识很重要,语言知识工具而已.在工作中,我发现学校里的许多课程都是很有用的:数据结构,操作系统,算法,代数,运筹学,信息论,软件工程.我是学数学的,数学课程学的比较多,我也是赚了这个的便宜,我的研究方向是数字图象处理,所以我的专业知识都比一般人好.有的人开发工具用的挺麻溜的,但是算法几乎不懂,那永远掌握不了核心的技术,一辈子打字员.就象降龙十八掌,洪七公说打出去十分,体内就要留二十分.我认为开发工具就是掌法,基础知识就是内功啊!
    有的人总在问,学什么好,学什么有用,先学什么,后学什么.我想说:好不好,有没有用,你用用就知道.不会因为你学会了一样东西而死掉了的.

最后是我总结的一些经验:
1.自己编程
2.看书可以通过考试,但成不了程序员.
3.基础知识比语言重要.
4.少抱怨教育体制,多学些本事.
5.不要为了钱和工作学习.
6.不要因为感时髦而学习编程.
7.认真,负责,自信,谨慎:
    认真:学习和写代码的过程要认真,编程是要全身心投入的.
    负责:要对自己写的代码负责,要终身维护自己的代码,因为那是你的孩子.
    自信:相信自己的能够写出好的代码,相信自己的代码是最好的.
    谨慎:思考问题和编码要谨慎,不要想当然,每一行都要细细揣摩.

后来补充的话:
不要说自己的老师水!他再水,总比你厉害吧.
有些人总是自我感觉太好,觉得别人都不配教他.
所谓的自学,以为是抛开学院体制,杀出了一条血路,好不英勇.
熟不知,很多人因为没有象你一样的学习条件,而不得不去走自学的道路.
以为自己看了几本课外书就了不起,如果别人可以通过看同样的书达到和你一样的水平.
那么只能说你太水了.
程序员的素质不是从几本书中可以得到的.需要长年的实践积累.
知道本杰恩是如何回答多久才可以学会C++,这个问题的吗?至少两年!


    


     

回复列表 (共21个回复)

沙发

@wanyy1228:
谢谢您的告诫,本来想半年学会vc++,看来没指望了,慢慢啃书吧。

板凳

呵呵
祝你成功!

3 楼

文章写的真好,做编程就需要多一些毅力,少一些浮躁!

还想问斑竹一个问题,因为作者是数学系的学生,所以有得天独厚的优势!但如果不是计算机专业,也不是数学系的学生,编程应该如果去入手呢?

4 楼

我是一名初学者。这篇文章对我启发很大,真的很谢谢
能告诉我一些我要的关于编程的书籍吗
我想用。非常感谢

5 楼

闻君一席话,胜读十年书。
谢谢!

6 楼

引用 "闻君一席话,胜读十年书。":
这是 两耳不闻窗外事,一心只读圣贤书

为君子者也,还需
风声雨声读书声——声声入耳
家事国事天下事——事事关心

(多有冒犯!)

7 楼

我也是一名初学者,马上就要过二级了,但我不是学数学专业的,我想问问,像我这样该怎样学才能过二级呢

8 楼

能不能有我的;回话呀
我就在过二级了呀
帮帮我!!!!
各位大侠

9 楼

谢谢!

10 楼

妈妈的我还是没入门 啊
在不知道如何入门
里面的指令是怎么控制的呢?

我来回复

您尚未登录,请登录后再回复。点此登录或注册