关于C++考试的分析
C++考试采用机考,可粗略地分为两类题,一类是程序运行题,另一类是概念考察题。程序运行题就是那些可以通过敲代码来验证结果的题,如判断语句正误、结果运行题等,这类题在机考中非常容易,只要打开VS2010验证一下,就可以知道结果的正确与否。第二类概念题就是考察概念的题,有些可以通过代码验证,有些就很难,解答这些题就要求对书本上的概念有着深刻认识。深入思考过,抑或是在做题的过程中遇到过都对解决这种题有着很大的帮助。从短期复习效果来看,敲代码的能力很难得到提高(考试也不要求有很强的编程能力),对概念的复习、理解以及刷完练习题才是最有效的。
编程的共性问题
以下是我的一些个人见解,或许能帮助大家更好地理解编程,如果对编程不感兴趣,可以直接跳过本段。
首先就是确定编程是什么
无论是C、C++、Java还是python,它们都是语言,如同汉语与英语一样,一种语言需要有自己的语素,有自己的语法。英语是以单词为基本单位,搭配逗号、句号、引号等标点符号,以复杂的语法为线来表达。编程语言也一样,无论什么编程语言,标识符、保留字、运算符、数据类型都是最基本的单位,定义也大同小异。比如说标识符由字母、数字、下划线组成,不能出现空格等。这个地方也掺杂着一些语法,或者说基本规则更合适些,比如说保留字不能拿来命名、运算的先后顺序、不同数据类型的字节大小等。编程的语法就是些基本的条条框框,程序体的划分、函数的定义方式等等。编程的内核是算法,算法是程序的动力之源,好的算法可以节约时间、得到更优结果(现阶段看不出差别)。在了解了这些后,我们就可以对变量命名、赋值,并进行简单的运算,解决一些简单的问题。
对于新手来说,上面这个环节是极不友好的,因为会接触到一大堆奇奇怪怪的东西又不知道是做什么的,为什么要定义标识符、那么多保留字一个都不认识、数据为什么要分那么细等等都会让新接触的人迷迷糊糊、望而却步。但这些是编程语言最底层的东西,随着学习的深入,会逐渐明朗。
程序的结构
知晓了这些并不够,编程的第二个要点就是程序的结构,使用的最多的是循环、选择和判断。这三者几乎能应对所有的情况了。
循环使用的最多的是for和while,这两者的区别在于for是遍历,走完整个循环才会停下来,所以在使用for时要给出for循环的范围,从哪里开始,以什么样的步长前进,在哪里结束。While就没有这样的复杂,while是对结果进行判断,满足就继续循环,不满足就跳出,因此死循环通常都是由while产生的。在这一部分也会提到两个保留字:break和continue(有些语言还有pass),两者的区别在于break直接结束循环而continue只跳过本次循环。
选择与判断有些相似,switch语句和if语句是代表。两者的共同性在于对条件与结果一一对应、不同的条件有不同的结果。不同之处在于选择可以有多个选项,而判断只有两个,是或否,但if语句也可通过if嵌套和else if来实现选择的功能。
在有了这三种结构后,程序可以做更复杂的事情了,但我们依旧不满意,在解决一个复杂的问题时,交替使用这三种结构是难免的,大部分语言并不像raptor一样有图形编程界面,过多的嵌套会使程序的逻辑关系看起来不明朗,难以把握,而且对于一些需要重复使用的功能,反反复复地敲代码也显得很繁琐,函数就应运而生了。在数学里,函数的基本要义是定义域、值域和对应关系,同样的,在程序语言里,函数的要义有输入值,返回值和函数体。关于函数的功能,可以将函数视为一个黑箱,不去关心内部如何运行,就像是往女巫的罐子里面加点东西,捣鼓捣鼓,就出来了一个新的东西,加的东西就是输入值,新的东西就是返回值。为什么要创造函数这种东西,如前所述,函数可以使程序的主体部分的逻辑关系显地更加明朗,更利于程序的开发;其次就是函数让代码的移植性更强,将函数封装在包内利于函数的跨用户使用,如C++的.h文件。内置函数也是通过这种方式来实现的。
函数里最容易迷惑人的就是传参问题,这与指针与引用相关,后面再说。
数组
数组是编程语言的另一有力抓手,与函数的功能相似,对于一连串数据进行操作,为每个数据都指定一个变量名太繁琐,操作难度太大,其次数组也是循环的好搭档,而二维数组更是可以直接与矩阵联动,实现更复杂的功能。数组自身的定义又决定了数组只能储存同一种类型的数据,要是想储存不同种类的数据,就要用到结构体struct。
以上都可以称之为面向过程的编程,因为以上的编程风格都是跟着过程走,过程结束,程序结束,整个程序描述的都是这个过程。而接下来要说的是抽象得多的面向对象的编程。
对象
对象?哪里有对象?这里的对象是指一个具体的物体或集合,我们用类来称呼,而面向对象的编程就是对类进行操作实现一系列的功能。为什么说它抽象主要是因为单单靠几行代码,就能描述一个物体,很令人费解。比如说书本中举的长方形类的例子,单单靠定义了长宽就说我们有了一个长方形,甚至可以通过继承来产生正方形类,但这个长方形在哪,是什么,我们并不明确。
对于更复杂的物体,一只猫、一只狗,我们可能会在类内定义猫的颜色,猫的大小、猫的雌雄等等,也可以在类内定义一些函数描述猫的行为,如猫会叫,猫会吃东西,猫会爬树等,靠在屏幕上打印一个“喵”代表猫叫了一下,这样可能不够真实,如果插入一段猫叫的音频,调用函数时播放就显得真实得多。如果再深入一点,还可以在类内定义函数间的调用关系,猫饿了会想吃东西,如果一直吃不到东西猫就会叫,猫吃饱了就不叫。通过更多的特征、更多的行为、一系列的触发机制,这个猫就会更加真实。
通过上面这个例子我们可以发现,面向对象的本质是对对象的一些特征进行描述,并用抽象的方式将其表现出来。像长方形的特征就是长和宽,当然也可以用其它特征来描述。目前,大多数程序都是面向对象编程。大家所做的课设也是面向对象的一个应用,如果大家想对面向对象编程更加熟悉的话,可以去尝试用类去实现下象棋的小程序。关于类的其它一些性质比如说继承与派生,子类和父类,在理解类的本质的基础上并不难理解。
输入输出流
编程和其它文件的联动,也就是输入输出流。编程语言支持从键盘输入以及将结果打印在屏幕上,很直观方便。但如果我需要对程序处理完的结果使用其它软件进行后续处理,打印在屏幕上不是一个好选择,同样的,如果我想把其它文件里的内容用写的程序处理,一个个输入也显得很蠢,所以为了与其它的文件联动,我们使用输入输出流。大家在课设中数据的储存与读取,就是应用了这一块的内容。
最后,希望大家在学完编程后还能用上它。最简单的做大物实验时,可以编程计算结果,在后续课程中,用编程计算线性代数、计算方法作业的正确性、把材料力学重复使用的公式写成函数,绝对可以提高你的效率(拿来验证结果可以,做题就不行了,考试并不让带可编程的计算器),编程是一种思维方式,绝不是一门课程那么简单。
C++的独特点
- C++以分号作为语句结束标志。
- 无论顺序如何C++总是从main()函数开始运行。
- C++使用大括号区分程序段。
- 自增和自减是C++的有特色,这里的运算顺序如果不大清楚,考试时运行一下看看吧。
- 以上几条都是最基本的,如果这些还不清楚,考试可能有点悬了。
- 数组里的弯弯绕应该就是它是用0当作起始吧,以及数组在使用前要先定义长度。
- 函数的声明就像是上课占座,当编译器检测到这一行时,你(函数体)并没有来,但它看到了你的书(声明),它就知道这里有人了(这个函数定义了),它就会去寻找新的座位(检测下一行)。不是个好比喻。。。函数的声明考试必考。
- 函数的实参和形参问题,本质上是接下来要说的指针,书上参数的调用那张图解释的也很清楚。
- C++的精华是指针。在计算思维导论里曾经指出过,在计算机内部是按字节来储存内容的,指针就是指向这些储存单元的抓手,明确了指针的指向,就能获取它指向储存单元里的内容。如果想更好地理解指针,回顾一下计算机的储存方式会有所帮助。数组的指针就是数组名,细心的同学可能会注意到在讲到函数调用数组时,就把前一章里说的形参和实参抛开了,函数调用数组会改变原数组,这里就是由于数组名是指针的原因。
- 类这一块需要多看,拷贝构造函数、拷贝析构函数的调用顺序是必考的,私有成员、公有成员的访问也会出现在概念题里,父类和子类也需要多多注意。
- 文件的打开与读写我们考了一个编程题,大家也注意一下,这一块有几个内置函数和算子,大家要注意一下。
- 关于宏定义,也是必考的,通常都是a+b不带括号,你们懂我什么意思的。
- 书上出现过的一些算法要会,交换两个数、排序算法、二分法等等,极有可能作为原题出现在编程题里。
- 关于编程题,题目不难,但要注意题目的要求,在找bug时如果不习惯使用断点,就隔几行输出一下,总能找到错的。
- 最后一个笑话给大家:世界上有10种人,一种是懂二进制的,另一种是不懂的。