《C程序设计》第五版第3章标题为“最简单的程序设计——顺序程序设计”,为了让初学者读懂并且能编写一个简单的顺序程序,必然要引出C语言的基础数据结构和语法规则。通过之前跟第三版的章节对比分析来看,第五版的第3章综合了第三版的第3章和第4章,对于初学者来说内容偏多,但是这些都是最基础的东西,是C语言的敲门砖。
注意,请认真学习完《C程序设计(第五版)》第三章后再阅读本文会有更大的收获。
一起学《C程序设计》
用C语言实现算法
编程是为了解决问题,算法是编程的灵魂,实现算法的过程就是编程的过程。对于初学者来说,通常从下面几个步骤来进行编程练习会更容易理解和上手。
理清思路
除非特别简单比如“1+1=2”这类问题,我们几乎不用思考就能得出答案,而在面对其他复杂问题的时候,就需要我们理清思路,先整理出一套解题“算法”来。
对于记性特别好,可以把解题过程以及其中的细节全部在脑海里演练一遍而且不会出错的人,这样的基本算是天才;对于普通人来讲,以笔者的经验来看,把思路写在纸上,然后进行修改、验证、迭代、完善是最好的方法。
流程图
理清好思路,再用流程图来表述就是水到渠成的事情了。用流程图来表述不仅能让我们的算法更加直观,还可能帮助我们发现一些思路上的“小bug”。“思路框”用“逻辑线”串联起来的过程,也是它们相互印证、相互纠错的过程。
这里建议初学者要熟练使用基本的流程图(顺序、选择、循环结构),这个在日后的工作中也是很重要的。
伪代码
对着流程图基本上就能把伪代码写个七七八八了。初学者不要觉得在正式编程之前做这一步略显多余,这一步骤的主要目的是让你写伪代码的时候同时去思考正式代码的实现方式,在熟练之后可以省略这一步骤,因为在你画流程图甚至理清思路的时候就如同“条件反射”一般,去想到某个节点要用到什么函数、什么数据类型去编程了。
C语言编程
激动的时刻来临了,经历多层次对“算法”的表述和刻画,我们终于要用C语言来编写程序并使之与灵魂算法相互交融。接下来就是我们第三课的核心内容——基础的数据结构和语法规则,掌握了这些之后我们就可以编写简单的程序了。
常量和变量
常量,理解为“恒量”,不会变。比如数字“1”恒为“1”,字母“A”恒为“A”,加号“+”恒为“+”。
变量,理解为“可变量”,可以发生变化。虽然变量与常量相提并论,但是他们本质还是有区别的,变量指的是定义一个名称并指向一个内存地址,变量的变化实质上对应的这个内存地址里存储的数据发生了变化。
常量和变量的使用基本类似,常量用“#define常量名常量;”来声明;变量用“数据类型变量名;”来声明,或者“数据类型变量名赋值运算符值/表达式;”来直接赋值。
基本数据类型
整型
对于初学者来说,整型数据很好理解,但是long/short、signed/unsigned组合一下六种类型——无疑会让人心生畏惧;另外书上还讲了整型数据在内存中的存储形式,二进制、补码、取反这些全新概念确实有点“拦路虎”的架势。
笔者的建议是,整型数据的存储形式暂时不必深究,知道有这回事就可以了;这六种整型数据的数值范围不必死记硬背,去了解一下二进制数值转换以及存储长度自然就会推导出来了。
浮点型
建议和整型数据一样,有些概念性的东西不必深究,先知其然,等我们编程的经验越来越丰富,在做项目的过程中去知其所以然会更加的容易。
字符型
这里我们会接触到程序员一生都会打交道的两个概念:ASCII、转义字符。理解ASCII是初学者一个头疼的问题,不妨这样想:正常的整数和小数都有转换成二进制的方式了,那么正常使用的语言呢,把常用的拉丁字母和一些标点符号等规定成相应的数字,在计算机上交互也就更加便捷了。
运算符、表达式和语句
基础运算符
初学者需掌握赋值运算符(=)、算术运算符(加减乘除/取余/自增/自减)、比较运算符(大/小/等)、逻辑运算符(与/或/非)、条件(三元)运算符。
注意,三个及其以上的数据进行混合运算的时候要考虑到优先级的问题,比如乘除优先于加减。如何能保证数据按照我们既定的规则去运算呢?有一个保险的方法就是加上“括号”这个更高的优先级,这样就不会出问题了。
数据类型转换
参与运算的数据类型不一致时,则需要进行数据类型转换,转换过程由编译器完成。复杂的数值运算基本上都会向双精度数据类型转换保证计算的精确性。
表达式
表达式与语句几乎是一步之遥,结尾加一个“分号”即为表达式语句。初学者最开始接触也是用得最多的两种表达式:
算术表达式——数值、运算符组合而成。
赋值表达式——变量、赋值运算符、表达式组合而成。
语句
语句即指令,就是经过编译后让计算机执行的指令。可以单独以“分号”为结尾形成一条语句,也可以组合一起用“{}”包起来形成复合语句,可以说语句是程序里可以被执行的最小“单位”或“组合”。
C语言输入和输出
通常我们说的输入和输出指的是C语言标准库里的输入与输出,就是文件开头“#includestdio.h”提供的。
这里我们要掌握的是常用的几种输入和输出格式化字符的含义,比如%d、%f、%s,以及格式符加字符的用法。这种格式化输入输出在每种编程语言里都会用到,长时间不用容易忘记,所以也不用刻意去背记,工作中经常是现查现用。
书中有一道练习题比较有意思:把China译成密码,其实很简单,就是把每个字符的ASCII值加4然后再输出,我们用最直观的方法实现如下:
把China译成密码
PS:使用scanf_s()替代书中的scanf()这个输入函数。
总结
对于初学者来讲,这些内容属于理论知识,也是撬开C语言大门的基石,唯有多练习多运用才能熟练掌握,发现其中的乐趣。如果提不起兴趣,可能会是另一种极端:觉得书本晦涩难懂,上课昏昏欲睡,考试只能死记硬背。
此外,编程不仅仅是在编辑器里写代码,包含了项目创建、代码编写、代码编译连接、调试运行等整个过程。过去学编程需要自己搭环境去编译调试,有时候搞了一天就为了能弄个跑代码的环境,现在则方便轻松多了,visualstudio用起来很方便,自动配置好编译运行的环境,还生产详细的调试信息方便处追踪bug,所以我们有必要好好的学习使用它,正所谓工欲善其事必先利其器。
第二章习算法的时候,书上讲:程序=数据结构+算法,再从另外一个维度去思考:运行程序=输入+执行+输出,数据结构和算法都是为了得到“预期的输出”,把输入用合适的数据结构去承载,把执行的代码语句编写得更加契合算法,在一次次编程中去锻炼我们的思想和认知,由易到难,由简到繁,找到属于你自己的“编程之道”。
往期文章
一起学《C程序设计》第二课——算法
一起学《C程序设计》第一课——C语言概述和学习前的准备、意识
C程序设计(谭浩强)——第五版和第三版对比