)
许多学校和专业都需要大一学习C语言这是一门学习如何编程的入门课。但不少初学者会觉得C语言不好学感到无从下手。其实只要同学们掌握一些方法多读多练、克服心理上畏难情绪C语言是完全可以学好的并且灵活应用的。希望本文可以对初学C语言的同学有一定的帮助。1.C语言的前生往事在编程语言界从最开始的机器语言到编汇语言再到高级语言一直在不断地发展中并一直有新语言不断地代替旧语言。但有一个语言的地位是没法被撼动的那便是C语言。1972年D.M.Ritchie 在B语言的基础上最终设计出了一种新的语言他取了BCPL的第二个字母作为这种语言的名字这就是C语言。1973年初C语言的主体完成。Thompson和Ritchie迫不及待地开始用它完全重写了UNIX直到今天各种版本的UNIX内核和周边工具仍然使用C语言作为最主要的开发语言。在开发中他们还考虑把UNIX移植到其他类型的计算机上使用。C语言强大的移植性在此显现。机器语言和汇编语言都不具有移植性为x86开发的程序不可能在Alpha、SPARC和ARM等机器上运行。而C语言程序则可以使用在任意架构的处理器上只要那种架构的处理器具有对应的C语言编译器和库然后将C源代码编译、连接成目标二进制文件之后即可运行。因此学C语言时要先写代码、再编译连接然后才能运行。1977年Dennis M.Ritchie发表了不依赖于具体机器系统的C语言编译文本《可移植的C语言编译程序》。这就是C语言具有良好的底层性的原因例如灵活的指针方法使得C语言也是后面单片机等课程的基础。1989年ANSI发布了第一个完整的C语言标准——ANSIX3.159—1989简称C89也称ANSI C。这就是C语言的前世往事这么久以来C语言的地位从来没有被撼动过作为最底层的基础开发语言它显得尤为重要。2.学习C语言掌握算法将在未来工作生活中具有优势思维能力C语言作为大一的必修课主要并不仅是让大家了解一门编程语言而是为了培养大家的算法思维。这是一种与现代社会共存的信息素养是未来社会生存的必备技能。算法与人生看上去没有什么联系其实不然。算法是由若干条指令组成的有穷序列。例如烤面包的步骤包括加入20克白砂糖放入180度的烤箱里烤30分钟…这就是烤面包的算法。而人生亦是由若干条指令去吃饭、去睡觉、去工作等组成的有穷列掌握好人生算法思维就能掌握好自己的人生规划与执行。以排序算法为例你们在课程中会学到最大值或最小值排序这个最大值或最小值可以人为设定也可以是函数给出那么在工作生活中会有什么样的应用呢事实上每年一到要找工作的时候我就能收到很多人给我发来的问题该怎么选择他们的offer呢去腾讯还是去百度去外企还是去国内的企业去创业还是去考研去大城市还是回老家……。为什么大家难以选择因为写不好人生的函数找不到自己需求的主要参数不知道该求利益的最大值还是该求损失的最小值。而真正懂算法的人是应该知道怎么做选择的如果主参数是未来发展那应该会选择天地广阔的大企业如腾讯如果看中薪酬那应该会选择高薪单位如果期望的目标函数是人脉熟、工作轻松、离家近应该会选择回老家……你不可能要所有的东西所以你只能要你最重要的东西你要知道什么东西最重要你就需要对你心内的那些欲望和抱负有清楚的认识不然你就会在纠结中度过。这就需要排序算法的思维。所以选择中你首先最需要参考的就是“冒泡排序”——这种算法的思路就是每次只冒泡出一个最大的数。因此你有必要问问你自己面对那些影响你选择的因子如果你只能要一个的话你会要哪个而剩下的都可以放弃。于是当你把最大的数一个一个冒泡出来的时候并用这个决策因子来过滤选项的时候你就能比较容易地知道你应该选什么了。这个算法告诉我们人的杂念越少就越容易做出选择。接着你可能茫然到了怎么比较两个决策因子的大小比如你分不清楚工资业务前景吗业务前景能力提升吗所以你完全没有办法进行冒泡法。那你你不妨参考一个“快速排序”的思路——这个算法告诉我们我们一开始并不需要找到最大的数我们只需要把你价值观中的某个标准拿出来然后把可以满足这个价值的放到右边不能的放到左边去。比如你的标准是工资大于5000元业务前景长于3年的公司你可以用这个标准来过滤你的选项。然后你可以再调整这个标准再继续递归下去。这个算法告诉我们我们的选择标准越清晰我们就越容易做出选择。下一步你还可以使用贪心算法、剪枝算法等不断地优化自己的工作取舍。人生中其它的工作与生活选择无不同理可得。因此编程教育并不是定向培养一批批“码农”是为了培养一种冷静的、科学的、逻辑化的思维来训练大家未来做事的能力。算法就是人生人生便是算法。3.学习C语言几个关键点3.1 绘制流程图先说结论程序流程图是非常非常重要的。1图比代码更清晰2基于图的沟通协作会使工作更顺畅。所以学习编程的第一步每个问题的解决先为它画个流程图哪怕它是让你简单地写一句“HelloWorld”。对于编程初学者来说很多人都以为程序设计就是单纯的敲代码接到任务摸起键盘就是一顿敲结果敲着敲着就很容易把自己给绕进坑里。画流程图主要就是梳理需求与解决思路否则就算后面代码实现了基本功能自己看着都费劲。没有一个清晰的思路代码注定是冗余。聪明的程序员则会在编写复杂的程序之前先画一个程序流程图这样一来不仅能理清程序思路也便于自己更好的发现问题。同时我们写编码不只是写给自己看的而是要和其他成员进行沟通协作的。社会的本质就是人与人的交流与协作。在协同工作之前大家基于流程图进行讨论这样别人一眼就可以知道我要做什么自己也加快了工作效率。既方便别人看懂你的代码也方便日后自己看懂自己曾经的代码。一定要画好流程图它是由一些图形框和流程线组成的其中图形框表示各种操作的类型图形框中的文字和符号表示操作的内容流程线表示操作的先后次序。流程图可以非常清楚地表达程序的基本结构顺序结构、分支结构、循环结构。程序的灵魂是算法而流程图是一种很好的算法表示方法它的特点是结构清晰、直观且容易学习和掌握。3.2 掌握基本知识点以英语为例掌握英语需要掌握单词、语法、好词好句、别人好文章的篇章结构等要通过精读与泛读来提升英语能力等等这些方法在C语言学习中也是必备的。第一行代码表示把标准的输入输出头文件包含在这个程序中。第二行代码是C程序的主函数,每个C程序中必须有且仅有一个main()函数然后是函数的一对“{}”。定义变量的意思好比买一块地有了这块地就可以在上面盖房、种庄稼之类的。但是为了便于统一管理比如城市已经规划好了你在郊区买的地就只能种庄稼,在市中心买的就只能盖房这就是变量类型的含义了。如“int a,b,c;”这行代码的作用其实是要了一块内存然后在这块内存里存东西。如果需要存整数这种东西就用int这个关键字来声明(相当于用这块地干什么)。那么变量a,b,c是什么呢你买了一块地总要知道这块地在哪是吧不然就白买了变量就是这样一个作用。我们需要把数据存在计算机中什么样的数就定义什么样的类型需要存几个数就定义几个变量。输入数据有两种方法。第一种从键盘输入,就需要用到scanf()这个函数;第二种是直接赋值。处理数据是对于初学者来说最难的一部分,也就是把我们刚才分析过程转换成语句。这里程序流程图可以很好地表达出处理问题和分析的思路。特别是在选择和循环中会有多种嵌套和复合的结构不画图思路肯定会绕成毛线。输出数据是每一个程序应该包含的部分。在C程序中的输出通常是从显示屏上输出最后的结果,最常使用的是printf()这个函数。掌握了以上思路你会发现计算机简直是工科中的文科。3.3 注意细节与注释据说C语言是一门非常容易劝退学生的课程原因是老师一讲就懂、自己上手一做就错有些题目好不容易逻辑上通了上机练习时总报错别人的代码复制粘贴时尚能运行自己辛辛苦苦打字一遍却运行报错……常见错误往往有语法错、逻辑错和运行错但更多的是粗心错即很多问题是不注意细节造成的。例如有些同学确实很认真地把代码打了一遍结果不注意大小写、不注意英文半角与中文全角的区别例如;和是不同的A和a也是不同的结果造成了报错。还有就是C语言的变量一定要先定义才能使用输入输出的数据的类型与所用格式说明符要一致注意int型数据的数值范围不要溢出输入变量时不要忘记使用地址符语句后面漏分号……以上这些靠平时自己注意积累同时要养成写注释的好习惯不可偷懒。还有一个简单的小窍门就是你犯过的错大部分人也犯过所以报错时直接百度就可知道问题所在了但一定注意留下笔记下次不再错。这就使得计算机更像工科中的文科了。3.4 注意练习与模块化积累算法思维中的核心思想就是要把一个大而复杂的东西通过分割简化为若干个小问题然后逐个解决即模块化思维。如图当孩子们搭轮船积木时候就会学会将轮船分为船身桅杆等各个模块先通过一步步的搭建好各个模块最后在组装成完整的轮船。编程学习过程中也是类似的你需要考虑将“代码”合理地安排在整个程序中让程序能够有序去执行这个过程对大家学会分析事物的逻辑性有极大的帮助。换而言之就是编程的本质是分析问题找到解决问题的方法再以相应的编程语言写出代码。当我们把大问题分解为基本问题时这些基本问题就有成熟的算法来表达了这就好比我们学习写作文段落的时候都有一些经典的好词好句可以直接拿来用使文章添彩的道理一样的。因此掌握一些简单常用算法即模块化积累是非常必要的程序实现的功能虽然千变万化但最基本的那些算法并不是特别多掌握这些基本算法后我们就可以根据不同的问题灵活应用了。例如百钱买百鸡的问题。即用100元钱买100只鸡公鸡5元一只母鸡3元一只小鸡1元三只。这种问题用数学方法可以列出三元一次方程进行求解而用计算机则可用穷举法。当我们能熟练地掌握了这类简单算法后就能实现一些比较复杂的编程问题了。而这种思维方法的培养就可以通过多做题、多读程序、多练习来培养。事实上解决以上问题的算法不止一种通过学习别人好的思维方法你还可以多一种思考的维度这更是算法思维的意义。3.5 一开始就培养良好的编程习惯培养良好的编程习惯要从第一行代码开始这也是学好C语言的重要因素。例如编写程序时用缩进的方式、写注释、程序写到一定的阶段时要做一下测试等。这些工作可以帮我们在调试程序时有很大的帮助。程序代码实现后错误是难免的所以也要锻炼自己的调试查错能力而良好的编程习惯可以使我们在调试时减小工作量和提高调试效率也有助于形成自己的编程风格。4. 光学习C语言就够了吗答案显然是不够的。C语言只是基础如果下决心以后要做底层开发那么学好C之后还要学好数据结构和算法如果以后要做上层应用开发那么还要学好数据库、网页编程、多种编程语言……。所以C语言只是基础因此开在大一。下图分别展示了互联网业的职位举例与技能需求而这些岗位大量是提供给非计算机专业毕业生的。所以上大学后要学会对自己负责而不是对老师负责学会对自己的未来负责而不是对现在的作业负责学会对知识负责而不是对培养方案负责。未来的社会需要大学生们拥有学科核心素养而不仅仅是一张文凭这些核心素养需要你们学会自己教育自己学会面向未来的“社会化学习”。今天的学习正在变得越来越无边界越来越“社会化”变成一个高度开放多元的系统。写了这么多也不知道大家会不会多读几遍。想到一个故事讲一位叫木村秋则的日本果农坚持二十年种植无农药无化肥苹果的故事。这当然不是一本有关农林的技术书籍准确地说这是一本励志书。因为很多人读完之后都想哭。是的既然选择当老师那么这一生就至少做几次教育的傻瓜吧。吴彦文