关于复习的几点建议:
计算机计算的技术原理是什么?读程序、写程序。
导论如何复习?看crash course吧,想想为什么!
凡事要了解背后的原理。。。WHAT是最简单的,还是需要学会问问WHY,然后HOW去做
- 计算机为什么能计算、如何做计算?
- 计算机诞生过程中的硬件技术发展,为什么?
- 计算机软件技术的发展,比如:操作系统中关注什么样的问题,为什么?
- 输入字符串是任意一个四则运算表达式,比如:\(13 + (4 - (32 + 8)) \times 7 + 23 / (8 -2)\),你会算吧?不要到网上查任何资料,你也可以编写代码求解字符串所代表的表达式的值。试试看吧。
- 学会Abstraction
- 现代计算机的体系结构,von Neumann结构
- 数据结构+算法=程序、
- 计算的效率如何?算法的复杂度、问题的复杂度。
- 测试用例(可以用来了解你的程序的intention)、调试。
具体而言
- 进制转换,计算机采用二进制,了解进制的原理,表示方式,以及实际转换操作。
- Feynman的名言:What I cannot create, I do not understand.
- 所谓明白概念其实只能应付考试而已。自如操作、计算才能叫掌握了概念。
- 为什么要用2的补码做计算?如何做2的补码运算?
- 程序通常是在计算机上运行的,但是程序是人写的,写的对不对,你得自己先运行一遍看看结果是否和你的预期一致?所以,这也是最基本的要求。
- 格式化输入输出。
- 最后当然是写程序啦。遇到各种问题,你得知道如何求解?这首先是需要给问题建模,划定解空间,缩小解空间,找出解的描述,转换成C语言的代码。多学点数学吧。
- 程序设计涉及:数据结构设计、算法设计、测试用例设计、。。。最后才是代码级的技巧。。。
计算模型
- 递归函数
- 用递归函数来描述问题及其解。
- 有限状态自动机
- 计算是状态的改变。问题求解中某些状态非常特别,或者求解过程始终围绕着某些状态展开。
- 不同状态下、针对不同输入、迁移到下一个状态、并作出适当的动作。
最基本的问题有哪些:
- 公式计算,很简单。
- 但是,计算机计算是有限制的,这些需要自己进行精心的设计,才能避免计算出错:
- 整数计算会有溢出问题,
- 浮点数计算会有精度问题,
- 避免不同类型的混合运算
- 应该摒弃C语言中的奇葩表达式
- 强制类型转换时一定要注意,不要造成数据精度损失,甚至丢失高位有效数字,想想Ariane 5
- 但是,计算机计算是有限制的,这些需要自己进行精心的设计,才能避免计算出错:
- 解空间搜索,线性搜索,或排序空间的二分搜索。
- 搜索时,需要利用某种条件来判断,是否是可能的解。
- 一类典型问题:如何进行排序?
- bubble sort、insertion sort, selection sort, merge sort(不要求)。
- 稳定的排序:键值相等时,不改变其顺序。
- 原则上,问题求解和程序设计不直接相关,这个过程最后要形成一个算法,才能转换成C语言程序。
最基本的算法结构有哪些:
- 算法控制的三种结构,顺序、分支、循环。需要注意的是学会正确表达条件表达式,if -else if,条件尽量是互斥的。循环结构需要避免死循环。
- 各种等价结构之间如何做转换?
- 条件表达式,关系表达式,用来表示某种状况,原先大家应该会用数学来表达,如\(10 \ge x \ge 0\),现在需要转换成C语言的。分支和循环结构中会用到,条件可以用来判断是否是解,如:偶数,a % 2 == 0。有时候,需要一段程序来判断条件,如:\(p\)是否为素数,用迭代方式完成\(2\sim p-1\)是否整除\(p\)。
- 不必太在意C语言语法,IDE很容易纠正。
- 函数原型和函数实现,需要注意的是参数表的写法,类型和形式参数都写上。
- 函数参数传递时,需要注意,实际参数copy给形式参数,传地址时,会有特别的效果。注意正确写法。
- 许多大问题,可以分拆成小问题,把小问题的解组合成大问题的解。
- 递归函数是一类很有用的工具,必须学会。设计递归函数时,需要注意,先把最简单的不需要递归求解的小问题的解先写出来,以免导致无限递归。递推关系正确,就很容易写出递归函数。
- 特别看看专门写的递归描述一贴。
最基本的数据结构有哪些:
- 基本类型:整数、浮点数等。不同类型的整数浮点数能表达的数范围和精度不一样,需要根据具体问题来设计。
- 指针,是一个逻辑概念,实现方式就是:地址变量。虽然有点特殊,本质上是间接引用。需要注意的是,指针操作要特别小心,否则会导致程序崩溃。
- 指针不要乱指。
- 构造类型:数组,同类型数据打包。支持数学中向量计算。需要注意的是,数组名是一个地址,不能直接赋值。
- 使用时,下标不能越界。
- 数组作为实际参数调用函数时,传的是地址
- 字符串,是字符数组,但是,注意,需要给字符串的尾巴留一个空间。
- 字符的处理,不要用编码值,要用字符的字面值,即:'a','0','Z',等。
- 构造类型:结构体,不同类型数据打包。支持数学中一般集合的笛卡尔乘积相关的计算。需要注意的是,结构体变量是当作普通变量对待的,可以赋值。
- 作为实际参数调用函数时,传的副本。如果需要,可以选择传结构体的地址。
测试用例设计:
- 特别要注意:应用程序所处理的特殊或边界情况。
程序风格,绝对是很值钱的!!!