C语言学习心得及报告


如 何 学 习 C 语 言

学校:西安航空学院 系别:电气系 班级:过控 1409 姓名:兰敏 学号:1130306140913

前言
两个原因促使我写下这篇文章,第一就是作为过来人根据我自己的经验我知 道编程的初学者 一般都很兴 奋也都有种困惑,一方面对运行在计算机(注:不 特别指明都指个人微型计算机) 的五花八门如精彩的游戏程序,多姿多彩的网站 等等漂亮的视窗程序所着迷, 另一方面大部分的初学者(如计算机专业的低年级 学生)都是从简单命令行程序“Hello world! ”开始入手而且很长一段时间都无 法接触到日常经常使用的视窗程序,由此好奇者有之,迷惑者有之等等,更遗憾 的是也有少部分人因为困惑对编程逐渐失去兴趣。第二就是今天妹妹看 C 程序 设计语言的人读碰到一个例题没有看懂, 而作为计算机专业毕业的老哥自然义不 容辞地承担起了讲解的任务, 在噼里啪啦的大说之后,老妹终于弄懂了例题程序 的意思,但仍然不过瘾,竟然问起我如何学好 C 语言,弄得我心一惊,这里我 还是有点自知之明的, 因为我知道我并不是什么大师,甚至自己对计算机世界也 经常是一片茫然,不过看着她那“崇拜”的眼神,不说点什么似乎有点不大好, 只好硬着头皮把自己以前的一些理解讲了一番。所以既然知道有这个需要,尽管 自己见识浅薄, 也抱着“区区陋见假如能够对后学者能够有所帮助那是再好不过 了,即使有所偏颇当当笑话看看能有助于大家饭后生活也是美德一件”的心 情就写下了这篇文章。

简介
我是很乐意将计算机(程序设计)语言跟人类语言做类比的,在我看来学 习程序设计语言就想学习外语一样, 通过计算机语言与计算机交流就如同在使用

外语与老外交流一样。 通常学习语言比如英语有单词, 语法, 语义三个部分组成, 单词是构成语言的最基本的要素,语法告诉我们单词如何构成语句,语义则告诉 我们单词构成的语句的意思, 类似的程序设计语言中也是有[1] “单词” , “语法” , “语义”三部分组成,其中跟人类语言一样, “单词” “语法”是基础,而为达到 交流的目的“语义”是整个程序设计语言的重点。当然相对人类语言(以英语为 例)而言程序设计语言(以 C 语言为例)显然要有简单得多的组成,所以这里 我们要首先确立自己对学好程序设计语言的信心。下面试加以说明,其中可能有 些类比不太适当, 不过好像也差不多吧,你自己也可以试着举出更好的例子以使 自己更容易明白,我这里就抛砖引玉吧。 先从“单词”谈起,在英语中就是由 26 个英文字母以及 26 个英文字母构 成的单词组成,学习语言我们首先应该记忆的就是“单词” ,26 个英文字母 A, B,C,……然后就是令人头痛的英文单词,记忆的过程是痛苦的至少我学英语 时最恼火的地方就是反复记忆老是忘记的单词,类似的在 C 语言中我们可以作 这样的类比,C 语言的单词是由 26 个英文字母、数字(0,1,2……9) 、运算符 以及其他特殊符号组成,所以相比而言学习 C 语言是多么的幸福。 “语法” ,在英语中是如常见构词法、时态、常用句型、特殊用法、固定用法 等等(呵呵,不是语言专家如有兴趣可以参考英语语法书籍) ,仅拿构词法来说 动 词 后 面 加 er 就 变 成 名 词 ( work-worker ) ,名词后面加 y 就变成形容词 (wind-windy) 等十多种变换还要记忆些特殊变换, 复杂且繁琐, 假如算上时态、 句型等那就更复杂了。在 C 语言中也同样也存在有语法,比如标识符、常量、 表达式、数据定义、函数定义、变量初始化、语句构成、预处理命令等大致 8 种语法,如标识符[2]可由字母、数字以及下划线组成,且必须以字母或下划线

开头,区分大小写,另外在不同的编译器中字符数目有不同的规定,一般为 7 个字符。不过这里有些可能会被忽略的就是书写格式,在 C 语言中书写格式也 是需要被注意的,因为格式也可以当作 C 语言的语法项目,如语句是以分号‘; ’ 作为结束的标志的而不是以换行作为结束标志, 其实英语也有要求比如什么时候 该使用句号什么时候该使用逗号等等只不过我们日常要求并不注意, 而且也可以 看的懂所以不太较真。

总结
综上所述我们要学好一门程序设计语言首先就要像学习英语一样先熟记至少 要熟悉这门语言的“单词”和“语法”然后才能谈得上使用,俗话说“万丈高楼 平地起” ,学好 C 语言的必要前提就是先打下坚实的 C 语言基础,所以潭先生的 书作为一本很好的教材,我建议是不能丢的,而且还要反复看,至少刚开始我学 习的时候上机机会不多, 就是反复看懂看明白这本书,有些东西该记的还是要记 尤其是一些重要的语法比如标识符、数据类型、语句的特点、函数的占式结构, 指针的意义等等。

最后始终记住这点在没有实践之前,先打下坚实的理论基础吧,毕竟理论是 实践的先行, 理论可以更好的指导实践。 即使再低点的要求至少要先熟悉理论吧, 毕竟“摸着石头过河”感觉还是盲目以及痛苦的 “语义”即语句的意思、含义。同人类语言一样,程序设计语言最重要的目 的还是“交流” ,所以写一段没有任何作用的代码就如同说一句没有任何意思的 话是没有意义的, 在这一点上两者是共同的,至于在其他某些方面两者也有惊人 的相似之处,试举一例吧,比如说可以有不同的表达表示同一个意思,如微型计 算机同个人计算机就是同一个意思,在 C 语言中比如要让变量 i 自增 1,可以有 i=i+1 或者 i+=1 等等。 不过与人类语言相比, 程序设计语言毕竟是与计算机交流, 交流对象计算机与人类的不同也决定了程序设计语言与人类语言还是有所区别, 甚至可以说是存在巨大的“鸿沟” ,这也就是学习程序设计语言的重点。

与人类相区别,计算机最大的不同之处在于没有“自己”的“思维” ,没有 像人类那样丰富的感情, 所以在交流过程中对于人类的跳跃性的思维,对于人类 的“幽默”无法理解也没有丝毫的兴趣。比如说对与同样一句话“Do it” ,在不 同的场景不同的说话语气, 对 10 个人来说就会有 10 种不同的回答,有的人可能 会认为这是合理的要求, 有的人可能会认为这可能是个玩笑而不与理睬,有的人 则可能认为语气要求有些过分而感到非常愤怒……, 但对所有的计算机来说则是 严格执行。不过也正是由于计算机“机械” “笨着”的可爱而深得人们的喜爱并 被广泛使用, 因为对我们来说,计算机就像一个忠实的士兵一样在执行我们的命 令并且作为指挥者, 当然我们希望计算机在合适的时间干切当的事情。而要达到 这个目的,很凑巧有点类似于社会的“权利与义务”法则一样,我们也有自己的 义务那就是下达明确而又正确的“命令” 。

首先明确,即我们要在与计算机交流时“语义”必须明确,否则计算机将无 所适从,因此作为交流工具的程序设计语言的“语义”也必须是能够明确无二义 的。 当然程序设计语言的设计者已经注意到这一点, 在设计时就回避了这个问题, 所以我们——程序设计语言的使用者——程序员也就无须过多关注这点, 也就是 说使用何种程序设计语言(C,Basic,Pascal 等)并不是我们要关注的重点。 其次正确,包括正确的输入以及正确的逻辑。由于计算机 “忠实”得有点“盲 目”以至于对事情的对错毫无判断力,就像一把枪一样,在警察手里它就是正义 的化身, 而在土匪手里就成了恶魔的代言人, 因此要时刻记住计算机是没有错的, “错误” 掌握在我们自己手里,这也就决定了我们在编程时是不是应该投入更多 的精力来纠正我们自己所犯下的错误上面来?除此之外, 我们智慧的结晶——程 序,在我们的上帝——顾客,在程序的使用者看来就像个黑匣子,他们只管输入 哪怕是错误的输入却同样期待能得到正确的结果, 而对于上帝我们除了祈祷和期 望之外还能有什么选择?因此对于输入的不可预期的程序源数据, 我们是不是也 应该花更多的时间进行处理呢?

先小结下,由于我们在编程时需要对于输入的不可预期的程序源数据以及

提高我们自己的逻辑正确性花费更多的时间, 因此这也就是我们编程训练所应该 关注的重点,而不是关注于何种实际的程序设计语言。

为了加深印象,下面我们举个实际的例子来说明这点。先看题目要求“输 入一行字符串(全字母或空格) ,统计其中的单词数量,单词之间用空格分开” , 应该说这是个简单的题目,有些人可能一看到这个题目很快就给出了自己的答 案。 如有些人会想单词是以空格分开的,我们统计其中空格的数量再加上最后一 个单词不就是单词的个数吗,因此便很快给出如下答案。
/*Program1*/ #include<stdio.h> main() { char string[81]; int i,num = 0; char c; gets(string); for(i = 0;(c=string[i])!='\0';i++) if(c == ' ') num++; printf("There are %d words in the line.\n",num+1); } 编译运行,然后输入“I am a student” ,得出正确答案“There are 4 words in the line.”在 输入几个类似的测试用例,都得出正确答案,最后确信无误便自信满满的交出自己的答卷。 应该说正确的输入情况下, 这个程序毫无疑问是能够正确运行的, 但这种正确性是非常脆弱 的,你不能指望用户和你一样聪明并且不犯错误,何况即使是神仙那也有打盹的时候。假如 用户输入“ I am a student” , “ I am a student” ,“ I am a student ”……这种情况 下, 你是不是应该重新修正你的思路呢?现在我这样考虑一个单词应该是字母后面紧接着一 个空格或者结束符号,所以重新写下如下程序。 /* Program 2*/ #include<stdio.h> main() { char string[81]; int i,num = 0; char c; gets(string); for(i = 0;(c = string[i])!='\0';i++) if(c != ' ' &&(string[i+1] ==' '|| string[i+1]== '\0')) num++; printf("There are %d words in the line.\n",num);

} 运行一遍,发现结果是正确的,单词之间不管你是有几个空格,不管是两个也好,三 个也好都能够正确运行, 但是回过头来我们看下这个程序是不是还有些可以改进的地方呢? 我们再看如下一个程序 /* Program 3[3]*/ #include<stdio.h> main() { char string[81]; int i,num = 0,word = 0;/*word 标志位*/ char c; gets(string); for(i = 0;(c = string[i])!='\0';i++) if(c == ' ') word = 0; else if(word == 0) { word = 1; num++; } printf("There are %d words in the line.\n",num); } 输入测试用例也能够完全正确, 看看源程序, 其中增加了一个标志位便把所有的情况给 考虑进去了,相比前一个程序,程序 2 就是直白的描述了解题的思路,而程序 3 看起来好像 不好理解但似乎更能满足我们作为“天才程序员”的欲望,这也就是编程时使用的一些小技 巧。

总体比较三个程序,可以说类似程序 1 的错误——逻辑错误是我们程序员 比较容易犯的, 也是在编程调试过程中最费时间的,至于语法错误编译器可以很 快的给我们找出错误的地方程序 2 逻辑正确但相比程序 1 思路要更难想到, 程序 3 思路不但正确而且还在编程的过程中使用了一些编程技巧,所有这些开阔的逻 辑思路(解决问题) ,快速的调试方法及过程(发现错误) ,累积的编程技巧(让 程序让“好看” )都需要我们在编程实践中去获得,这是宝贵的经验也我们作为 程序员最珍贵的地方,而且最重要的这些经验是属于我们自己的,独一无二的。 综合上面的叙述,我们把编程看成程序设计语言的“单词” “语法” “明确 的语义” “正确的语义”四个部分,可以看出前面三个部分是几乎所有的程序设 计语言自身所具有的, “单词” “语法”不同的程序设计语言有所不同,但如果你

仔细观察所有的程序设计语言, 可以分成几类, 而且有很多地方也有相通的地方, 有点像一通百通的味道, 这也就是为什么很多有经验的程序员可以在很短的时间 就能熟悉其他语言的原因。至于“明确的语义”这是所有的程序设计语言都应该 具备的,只是表述的方法由于程序设计的“单词” “语法”不同表述不同而已, 但让计算机明白该做什么这点是相同的。最后“正确的语义”包括开阔的,正确 的逻辑思路以及发现并纠正错误的能力则是属于我们自己的, 这也是我们区别于 其他人的地方, 这些都需要在经常性的编程实践中去积累去开阔,所以是我们所 应该关注的重中之重。

跟许多前辈一样,我是建议初学编程者先熟练掌握一门语言的,至于怎么学习, 我想书本是纲领, 我们首先要熟悉一门语言的粗枝大叶,在编程的过程中不至于 老是去翻书查找一门语言的基本语法,比如说函数的传递方式,函数调用的一些 特点,这样不仅非常浪费时间而且一直困扰于语法中使得自己有种身缘“庐山” 中的那种非常迷茫的感觉。就向施工一样,建造一个茅屋可能没有图纸,抱着边 建边看的态度兴许能完成(事实上你自己脑海里至少也有个大致的样子) ,但要 建造一座大厦,没有图纸,困难可想而知。当然光有图纸还是不够的,我们可能 在施工的过程中发现一些问题, 这样我们在慢慢修改原来的方案或者原先有些地 方描述不清楚通过具体施工确认我们的想法。因此编程实践同样不可少,编程实 践不仅可以“让语义正确”即开阔编程思路,发现错误(调试) ,累计编程技巧, 而且可以在编程过程中熟悉这门语言,熟悉这门语言的细节部分,但也请记住这 些细节虽然重要, 但也仅仅是细节。 当然光看书, 光有理论那也是不行的, 有 “纲 领”而没有“章程” ,有“纲领”而没有实施那同样也是没用的,毕竟实践是检 验真理的唯一标准,实践过程中给理论修枝剪叶。

总得来说熟悉一门程序设计语言的语法是编程实践的先行, 而编程实践是可 以更好促进对程序设计语言基本语法知识的理解和熟悉, 而积累的宝贵的编程经 验则我们自己最珍贵的地方, 最独一无二的地方, 是所有程序设计语言所没有的。 写到这里, 我想现在应该是回答第一个问题的时候了,有人说我学了 这么长时

间的 C 语言还是没编过一个漂亮花哨的程序,编出来的都是丑陋的而且看起来

没什么价值的程序, 一点自豪感都没有便丧失了对编程的兴趣,为什么前面我一 直强调一门语言丰富的编程经验是你最珍贵的地方呢?原因就在于编程不仅仅 是把我们的想法把我们的思路用程序设计语言写下来就够了, 要得到实际运用还 需要与计算机的其他知识如网络,低层硬件,图形图像,开发环境等,甚至还有 其他学科知识比如自动控制, 通讯等相结合,而这些知识需要我们在以后的学习 过程中学习,比如一些后续课程,数据结构与算法,操作系统,数据库,计算机 网络, 软件工程等等,如果有兴趣你也可以在以后的课程中专门学习视窗程序的 编程, 或者也可以学习自己做个网站, 那会就真的是有自豪感并且货真价实的了。 当然那会可能你会有另外的想法比如说做嵌入式程序员,网络程序员,甚至去搞 算法研究等等了。不管你选择做什么,书本知识都是大家所共有的,是全人类的 财富, 而自身的知识, 尤其是经验却实实在在是你自己的, 最后我还想强调一遍, 这是我们最珍贵的地方。

所以在此之前, 我知道打基础是痛苦而且没有多少成就感的过程,但是在化 蛹成蝶之前, 我们还是要继续我们做而且认真的做我们的毛毛虫,因为我们知道 我们会有变成美丽蝴蝶的那一天。

我的心得体会
通过一学期对 C 语言的学习,我感觉学习 C 语言是有一定难度却又是非常 有趣的科目。也是很有帮助的,特别是对将要面对的计算机二级考试。 这段时间的学习我知道了 C 语言的基本特点有以下几点: 1.语言简洁,使用灵活方便。 2.运算符丰富,表达能力强。 3.数计类型丰富。 4.目标程序质量高,具有面向硬件系统的特点。 5.具有结构化的控制语句和模块化的程序结构。 6.具有编译预处理功能。 7.程序设计自由度大,可移植性好。 经过第一阶段对语法的学习,我觉得实例阶段应该是一个过渡阶段吧, 通过前一阶段对语法的学习之后,可能有很多概念我们都比较模糊,或者说

很多东西太抽象了,这就为我们第二个阶段的学习做好了实例化的准备,可 以这样说吧, 第一个阶段就我们为我们的学习一样东西而构建的一个类,里 面讲了我们应该在这里面要做什么?第二阶,也就是本阶段,我们就应该去 把前一段的东西具体化(实例化先前创建的类),那怎么个具体化呢,呵呵! 说白了, 去练习一些小例子, 从网上下载的电子书上有很多这方面的例子的, 如果有自己去书店买书的话,里面也应该提供了不少,里面的例子,我是每 次都打了一遍,也许有的人不会亲自去用手打一遍,什么 copy 等,当然这 样也行, 但我个人认为, 对于初学者来说, 最好还是自己动力打一遍比较好, 毕竟这些东西对我们来说,都比较陌生,如果每个字都自己打完的话,有些 代码你不想记住也难了,在这里,我们得弄懂练习的每一个例子,如果能把 一些例子稍稍修改,弄懂里面精髓的东西,让自己知道为什么这样做,那么 是最好不过的了,我平时练习时,这一步是少不了的,都习惯了,所以也就 成了条件反射,想不这样都不行。最后,我们就应该汇一下总,把前面做过 的例子里所用的技术理一下,再做一个比较大的例子,尽量把到目前为止所 懂的知识全部应用到里面去, 只是尽量, 当然有些东西是不能集成到一起的, 也是是代码之间的排斥性。 这是个人的一点学习心得,希望能更好的运用到学习中去。C 语言是一 门很有用的、 对于我们的就业很实际的语言,学习好 C 语言是一项必须而实 际的任务。我们必须要好好掌握。


相关文档

更多相关文档

C语言学习心得报告
C 语言学习心得报告回复
C语言学习心得
C++语言学习心得
c语言学习心得技巧
c语言学习心得.doc
第四章C语言学习心得
一二章C语言学习心得
上嵌浅谈C语言学习心得
单片机C语言学习心得
C语言程序学习心得体会
c语言学习心得
自己的C语言心得体会论文
C语言学习心得
C语言学习心得
电脑版