C程序设计(谭浩强)——第五版和第三版对比
谭浩强,对大学生来说很熟悉的一个名字,大学习C语言基本上都是他的这本《C程序设计》作为教材。笔者上大学时学习的是第三版,现在流行的是第五版。当初学C语言的时候是一知半解,纯粹为了应付考试,后来工作主要是PHP、Python等高级语言为主。如果恰巧你是刚入学的大一新生,或者对编程感兴趣,那不妨我们一起来学习一下C语言,希望我这个互联网打拼10余载的老鸟能帮助一些新手完成编程第一课。
看一本书先看目录,了解这本书的篇幅结构和布局,不仅为我们的学习计划做铺垫,还能把我全局,学起来不会像无头苍蝇毫无目的,而是每一次学习都有比较明确的目标,大大增强我们学习的信心。
虽然这本书修订到了第五版,和我当初的第三版在章节和内容顺序上略有不同,但是总体基本一致。下面我们通过对比这些章节上的区别来了解这本书的布局和结构,为后面的学习打下基础。
整体来看,第五版比第三版少了四章,是知识点少了吗?下面看具体分析。
- 第五版将第3章、第4章合并为第三章,内容基本一致
- 第五版第6章“循环控制”改为“循环结构程序设计”为了和第五章命名保持一致
- 第五版第7章、第8章命名加长,可能为了更好地体现出“数组”和“函数”的作用,内容基本一致
- 第五版第9章“用户自己建立数据类型”对应第三版第11章“结构体与共同体”
- 第五版舍弃第三版第9章“预处理命令”这个章节
- 第五版舍弃第三版第12章“位运算”这个章节
可以看出,第五版舍弃了一些章节,看书本开头的介绍是把这些章节移入了《C程序设计辅导》中,因为有些知识点对于非计算机专业的同学来说难度较高,所以,谭浩强的目的还是为了让这本书有普适性,作为不同专业同学的入门书籍是他的初衷。
与其答“如何学好C语言”,不如答“如何学好编程”。基于我的经验来讲,学编程只是手段,解决问题才是目的。
解决问题的手段有很多种,可以用C语言,也能用C++、Java、PHP、Python等语言实现,不同编程语言组织形成的代码最终都会编译成二进制交给计算机去处理,这叫殊途同归。
学习编程就是学习使用一款电脑软件一样,只不过这款软件没有图形化的界面,它只是定义了一些规则,你在遵循它的规则之下去编写一些字符,这样就可以交给它去执行了。和普通软件相比,它肯定难以上手,而且规则较多,但是它没有图形界面,没有条条框框,更适合让我们自由地去发挥想象,也具有十足的潜力。
讲了这么多,学习编程到底如何进行呢?
学习编程语言本身。也就是学习它的规则,如数据类型、逻辑控制、数据结构、函数对象,这个整体思路在各编程语言是相通的。
学习思路,举一反三。编程只是手段,是为我们解决问题而服务的。如何控制利用好编程,即用什么来指导编程,这个就是我们的思路。如同做数学题,要有清晰的解题思路,才不会感觉无从下手;而且要学会举一反三,这个要求我们在解决好一个问题之后要思考、去总结,不断地精炼、提升我们的编程思路,最好是把一般性的业务抽象成纯粹的数学题(工作后会明白这句话的深刻含义)。
接下来,我会集中利用闲余的时间来学习《C程序设计(第五版)》,期限暂定一个月之内。正如文章开头所讲,正巧你也要学习C语言,那不妨我们一起学习交流、成长。
有任何想法和问题可以留言或者私信,见后即回。
《C程序设计》第五版
一起学《C程序设计》第一课——C语言概述和学习前的准备、意识
第一节课我们先了解C语言的一些基本常识和概念性;作为一个纯小白,首次接触编程需要做好一些心理准备,消除一些思想上的误区,避免一些弯路;然后准备好硬件设备(电脑)和软件(代码编辑器、编译器等),顺便体验敲一段代码和编译运行的快感。
注意,请认真学习完《C程序设计(第五版)》第一章后再阅读本文会有更大的收获。
计算机是由各种硬件组成,而让这些硬件工作靠的是程序。程序是一个总称,它由N多条的指令构成,每一条单独的指令去和硬件交互直至执行完所有的指令——执行完整个程序,最终输出结果。明白程序的基本概念后,是不是觉得写一个程序很简单?就是把一堆指令凑在一起,so easy?
但是计算机毕竟不是人,它只能识别它自己的语言——机器语言,就是二进制代码,由0和1组成,可长可短,随意组合。如果把我们日常的行为操作指令都转换成二进制,那可太费事了,所以经过人们的不断探索和迭代,更加高级的“指令”诞生了。所谓高级,指的是和我们人的行为习惯保持一致,不用把指令转换成二进制,就像现实世界人与人交流一样去编写“指令”——高级编程语言的代码,在机器执行这些高级代码之前通过编译器把它们编译成机器识别的二进制即可,这样大大提高了编程的效率和程序的可移植性。
C语言是高级语言吗
C语言是高级语言。我们通常讲的高级语言是相对于汇编语言来说,不直接和底层硬件打交道;但是C语言自身又可以去做底层硬件的开发,比如驱动程序、单片机系统开发,这又让C语言显得不那么高级。
时至今日,随着编程语言的不断发展,和人交互更加自然流畅的语言我们成为高级,但是他们大多数底层的实现还是靠C语言的,学好了C,你也可以开发出更高级的语言。
C语言有什么用处
C语言是偏后端的语言,不像前端那样学习很快就能看到网页、APP界面那样有成就感,看起来好像离我们挺远。
那C语言究竟能做什么呢?往大了说,可以开发操作系统,可以开发出其他高级语言,做硬件驱动开发;往小了说,可以做个GUI软件(有图形界面的软件),帮我们算一道数学题。
其实,作为现代编程语言的基础,学习C语言能更好的让我们了解计算机系统,也能更好地去学习更高级的编程语言。以C语言作为学习编程的入门语言,你肯定不会吃亏,会让你今后在编程上的学习受益终身。
C语言要背代码吗
任何编程语言的学习都不要背代码。学编程不是靠背,一些语法规则,控制结构在你熟练之后会得心应手,通篇背代码除了应付一下考试之外别无用处。甚至你也不用刻意去死记硬背一些常用的库和原生的函数等,编程是为了解决问题,不是纯粹为了编程而编程。
工作中,在做项目写代码的时候,没有人能打包票什么函数都能记得住,什么类库都能得心应手的使用;往往大部分时间花在技术调研,Google搜索和浏览一些技术社区上。既然不背代码那背什么呢?答案是记住编程思路,转换为己用。
C语言学习难吗
对于初学者来说,学习一个全新的技能尤其是虚拟世界触碰不到的都会有相当的困难。但是只要坚定信念,踏实学习,不要以应付考试为目的,带着兴趣去学,按照书本的学习路线进行下去不会有太大的障碍。过程中会牵扯一些计算机特有的概念和知识点,要多去了解和探索,知其然更要知其所以然,对未知领域有渴求和探索欲,“难”不在话下。
硬件
普通台式电脑或者笔记本都可以。Windows 系统或者 Mac 系统均可。
软件
去windows官网下载Visual Studio:https://visualstudio.microsoft.com/zh-hans/,它自带编译环境,不用我们手动再去配置,这个对初学者来说很友好,通常软件环境的搭建就会把一小部分人劝退了。
安装选择 Community 个人免费版即可,过程中勾选“使用C++的桌面开发”,更加详细的安装教程请自行网络搜索。
安装Visual Studio
勾选“使用C++的桌面开发”
PS:注意更改一下安装目录,软件体积较大,默认安装在系统盘。
Hello World
按照国际惯例我们写一个简单的输出“Hello World”程序。新建一个空白项目,然后在源文件里添加“新建项”,选择“C++文件(.cpp)”,起名helloWorld改后缀为.c,编辑helloWorld.c文件。
添加新建项
新建helloWorld.c文件
编写代码
运行输出
怎样,有趣好玩不?如果此刻激发了你对C语言、编程的兴趣,那就动手实操一下吧。
往期文章
一起学《C程序设计》第四课——if语句、switch语句及实战练习
if语句属于控制类型的语句,程序里的逻辑判断、控制语句执行的“走向”大多都由它来主导,在今后的学习和工作中,if语句会伴随左右,在程序代码里随处可见它的身影。
if语句
注意,请认真学习完《C程序设计(第五版)》第四章后再阅读本文会有更大的收获。
if可以单独出现,else if 和else必须跟着if的后面,不能单独出现,在使用过程通常遵循以下几点。
大括号不要省略
初学者会觉得省略一对大括号会让代码看起来简洁。
其实不然,在项目开发中,随着功能的不断迭代,代码也要迭代,之前一句话式的if语句可能要扩展功能,判断成立后要做不止一个操作,这就必须把大括号补回来,所以早写上早省心。
还有一点代码的可读性问题,在其他人(甚至时间很久后你自己)阅读你的代码的时候,这种一句话式的if语句一般都要脑补拆解出来条件表达式和执行语句,显得不是那么友好。早点形成好的编程习惯,会受益终身。
减少嵌套
遇到很多个条件判断的时候先理清楚这些条件直接的包含关系,尽可能的减少if语句嵌套的层级,因为多层级嵌套同样会使得代码可读性变差,并且后续的迭代和维护也会变得麻烦。初学者可能体会不到代码可读性和后续迭代维护等事宜,这个只能慢慢的去做项目积累经验了,在这里提出来自然是希望同学们少走弯路,好习惯早养成。
复杂的逻辑表达式
书本上为了讲解逻辑运算符以及逻辑表达式的运算优先级,总结出了它们的顺序规则。在实际的使用中我们通常遇不到复杂的逻辑表达式的判断,如果遇到很复杂的逻辑表达式,为了保证运算顺序能按照我们预想的步骤进行,这时候可以祭出“括号”大法,但是“括号”套“括号”这样臃肿的写法也不推荐,所以在进行逻辑表达式的构建之前,先把条件分类,比如五个条件分两类,分别计算这两类的逻辑值,再进行“与或非”的运算。
if语句是按条件来决定执行代码的,switch语句则更加直白——匹配执行。直接根据有限个匹配结果去逐一编写相应的执行语句,原理上来讲,switch语句完全可以被if语句取代,switch语句多用来“等值”的判断,if语句多用来逻辑值“真”和“假”的判断。
switch语句
光说不练假把式,要想掌握C语言基本的数据结构和语法规则,唯有动手实操这一条路,下面我们来看几道书本上的练习题目。
按照上一课讲的,第一步理清算法思路:先比较a和b得出它们两个之间最大的数,然后再去和c比较得出最大的数即是a,b,c它们三个之间的最大数,下面画出流程图:
求三个数中的最大数流程图
然后开始写代码,从上述流程图能看出最直观的做法就是用if语句。但是还记得三元运算符吗?我们用三元运算替代这种简单的if语句会使得程序简洁,下面附上代码片段:
两层三元运算符的嵌套代替了两层if-else语句的嵌套,当然我们也可以混合使用,比如外面是if-else语句,里面是三元运算,感兴趣的尝试一下吧~
从键盘输入一个小于1000的正数,要求输出它的平方根(如果平方根不是正数则输出它的正数部分)。要求在输入数据后先对其检查是否小于1000的正数。若不是,则要求重新输入。
这是一个简单的数学运算题,求平方根用 sqrt() 这个函数,有个前提是要在文件头包含 math.h 头文件:#include <math.h>;另一个点是小数转整数,还记得强制类型转换这个知识点吧,用 (int) 即可把数据转换成整型,我们先看第一个版本的代码:
注意到,代码里判断了两次错误的输出就会退出程序,如果没有 return 这个语句,程序会继续往下执行,那么上面做的if语句判断就没有任何作用了。
不妨拓展一下思维:如果要求输入数据出错后可以一直重试直到输入正确的数据为止呢?我们可以在if语句里继续嵌套第三次、第四次、第五次…的有限次判断,但是这样代码会显得很臃肿,并且达不到“一直验证输入数据直到正确”的要求,那接下来该如何是好呢?
无限制的if语句嵌套作用都是一样的,目的都是判断数据准确性。输错了继续输,输错了继续输,这不就是一个循环吗,一直到输入正确为止——while循环的特性。这里引申到下一章的知识点了,算是抛砖引玉吧,不妨来看一下用while语句改造后的代码:
给出一百分制成绩,要求输出成绩等级\’A\’、\’B\’、\’C\’、\’D\’、\’E\’。90分及以上为\’A\’,80~90分为\’B\’,70~79分为\’C\’,60~69分为\’D\’,60分以下为\’E\’。
这个题目很简单,最直观的就是用if语句做判断。这里介绍另外一种方式——switch语句。我们的switch语句主要做等值判断,但是题目给出的分数是范围,怎么进行关联呢?题目中的分段是按照10分为单位划分的,如果我们把分数除以10并取整是不是就把一个范围内的10个数字对应到它们的“十位数”了呢?比如70~79对应“7”,经过这样的转换再用switch语句就很简单了,看一下代码:
PS:这里的成绩数据也是有一个范围的,同学们不妨参考上一个程序的while循环检测数据也来改造一下这个程序吧~
另外,这个题目和书本第10题类似,分别用if语句和switch语句来编程,这里就不赘述了。
给一个不多于5位的正整数,要求:
1、求出它是几位数;
2、分别输出每一位数字;
3、按逆序输出各位数字,例如原数为321,应输出123。
此题目字数很少,咋一看很简单,其实有点难度。首先要解决的问题是如何算出一个数的各个位分别是什么?这似乎是一个纯数学问题,也是本题的核心算法所在。这里的基本算法是:
- 对10取余求出个位数
- 对100取余再除以10取整得到十位数
- 后面的百位数、千位数…以此类推
得到个位的数字后还要判断是几位数,我们从高位往下判断,比如:最高位第五位是0,那再去看第四位是不是0,不是0就肯定是4位数,否则继续向下看。
如果是从低位开始判断则会遇到最高位不是0,中间位是0的情形,比如10001,这种判断逻辑是有缺陷和漏洞的。下面参考一下代码:
这里我们还可以拓展一下:给出的数位数未知,怎么计算其长度和每位的数是多少呢?有兴趣的可以尝试一下~
这是一个经典的算法题——排序算法,是学习算法的入门课。算法排序有很多种方法,这里我们就用最经典的排序算法——冒泡排序。
PS:我这里是按从大到小的顺序来排的,怎么给它编程由小到大来排序呢(输出顺序还是a,b,,c,d)?
一般初学者学到这里会有以下几重困境:
- 数据结构和语法规则没熟练掌握
- 想不出有些题目的解题算法
- 算法转换为代码有难度
- 数学知识需要多补一补
首先,第1点和第3点需要多些代码、多练习,前期吃力,只要坚持下来,后面会越来越轻松;第2点和第3点,这个需要我们转换思维,第二课算法推荐的算法学习网站,也要多去练习,看看怎么把数学解题思维转换成程序的算法,除了看题做题别无他法。
大家千万不要打退堂鼓,因为这个书本毕竟是教学课程,理论性的东西偏多,也是为我们今后的学习打基础。在日后的工作过程中,我们面对的是不同行业的业务流程和业务逻辑,不会像纯数学题和算法题一样觉得枯燥(搞科研的除外),而是解决现实中的问题。
尽快找到适合自己学编程的方法才是当下最主要的,如果找到写代码的感觉,那就请飞起来吧。
有问题请私信交流,想要练习题源代码的也请私信。
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。