提出
问题
1 问题中要有已知条件及实现要求的描述;
2 问题涉及到的数据的收集、分析、数据表示(描述)
3 问题需要完成的功能;
建立
数学模型
1 数学建模:通过数据收集、分析,确定变量及变量关系;
2 数值计算问题:建立表达式(公式、方程组)、矩阵;
3 非数值计算问题:重点在选择合适的数据结构(线性、层次、网状模型);
确定
数据结构
1 逻辑结构(线性、树形、图形、集合)
2 物理存储结构(顺序、链接、索引、散列)
3 运算(插入、删除、查询、更新、排序)
(数值计算使用的数据结构比较简单,“简单变量”加“数组”大致能满足需要。)
确定
输入输出
1 输入就是将自然语言或人类能够理解的其他表达方式描述的问题转换为数学模型中的数据;
2 输出就是将数学模型中表达的运算结果转换成自然语言或人类能够理解的其他表达方式。
3 键盘、扫描仪、磁盘文件→内存→屏幕、打印机、磁盘文件;
4 用户→图形用户界面或控制台→输入、处理、输出→图形用户界面→用户
确定
算法
1 算法=操作+控制结构
2 操作:逻辑运算、算术运算、数据比较、数据传送;
3 算法的控制结构:顺序、选择、循环;
1 算法按照思路:递推、递归、穷举、贪婪、分治、动态规划、迭代算法;
2 算法按照应用:基本算法、数据结构相关算法、几何、图论、规划、数值分析、加密/解密、排序、查找、并行、数论算法;
3 算法按确定性:确定性算法、非确定性算法;
选择
编程语言
1 语言设计人员设计的语言是为了解决特定的问题的目的而设计的(以用其编写的程序应用于特定领域);
2 语言设计人员设计的语言在以下方面有侧重点的取舍:编程简单、程序易读、执行效率高;
选择编程语言工具
并用编程语言
描述算法
1 选择合适的IDE;
2 选择适当的模板库或类库;
解释执行
或
编译后执行
数据表示(描述)→数据结构→数据输入→数据操作(操作符、函数、类方法)→数据输出
开发一个程序或一个系统首先都要了解需要哪些输入、输出数据,中间会产生哪些数据,此即数据内容。然后分析数据间的关系,形成数据模型,此即数据结构。接着考虑数据在程序或系统中如何传送和变换,此即数据流。
1 建模问题:主要是数值计算问题涉及到建模,如建立公式与方程组,而对于非数值计算问题,主要考虑的数据结构的问题;(数学模型(变量及逻辑关系)→抽象数据类型→数据结构)
2 数据结构(问题描述和数据处理的对象);
数据表示→数据结构(关系、存、取):数据与数据关系(表、树、图)的线性或链式存储;
3 确定输入、输出的数据(硬件、文件←→内存)及方式(控制台或图形界面的表单)
4 算法:输入到输出的操作与转换
5 程序语言的选择与对数据结构与算法的描述;
以上各个部分其实没有一个严格的先后顺序,都是相互影响,相互作用。
输入输出方式和算法步骤都是基于相应的数据结构设计的,相应的数据结构要能很方便地将原始问题转换成数据结构中的各个属性,也要能很方便地将数据结构中的结果以人们能够理解的方式输出。同时,也要为算法转换过程中各个步骤的演化提供便利的支持。使用线性表还是关联结构,使用树还是图,都是设计输入输出和算法步骤时就要考虑的问题。
面向过程:程序 = 数据结构 + 算法,以函数形成模块化;
面向对象:程序 = {对象}(对象 =(封装) 数据 + 操作),数据结构和算法体现在类或对象中;
OO=objects+classes+inheritance+communication with messages(事件触发)
a class defines both the type of data and the operations that can be applied to that data. Including both the data and functions into one unit, the class, is called encapsulation.
类同时定义了数据的类型和可作用于这些数据之上的操作。类把数据和函数包含在一起,成为一个整体。这个过程称为封装。
grouping together data with the code that processes it, and having some fancy ways of treating it as a unit. Many programming languages refer to this type of thing as a "class".
When you bundle together an abstract data type with its operations, it is termed "encapsulation". Non-OOP languages don't have adequate mechanisms for doing this. There is no way to tell a C compiler, "These three functions are the only valid operations on this particular struct type." There is no way to prevent a programmer from defining additional functions that access the struct in an unchecked or inconsistent manner.
Object-oriented programming languages that enforce data integrity by bundling together the user-defined data structures plus the user-defined functions that are allowed to operate on them. No other functions are allowed to access the data. This extends strong typing from built-in data types to user-defined data types. A class is just a user-type with all the operations on it. A class is often implemented as a struct of data, groupd together with pointers-to-functions that operate on that data. The compiler imposes strong typing-ensuring that these functions are only invoked for objects of the class, and that no other functions are invoked for the objects.
程序任务 | 面向过程 | 面向对象(Object-Oriented) |
任务(或问题)需要处理的数据 | 定义数据结构 | 定义类(对象)的属性(数据) |
对定义的数据需要进行哪些操作 | 描述算法 | 对类的属性需要进行的操作定义为类的方法 |
数据与数据处理的结合性 | 较松散 | 较紧密 |
对数据的组织 | 数组、结构体等 | 限定到有共同属性的对象(类) |
对数据的操作的组织 | 函数 | 类方法 |
解决问题的思想 | 过程步骤分解 | 任务对象分解 |
逻辑结构:数据元素之间的逻辑关系:(一对一的线性关系,一对多的树形关系,多对多的图形关系)
存储结构:是逻辑结构在存储器中的表现形式:(线性存储、链式存储、哈希存储(key map address space));
数据运算(数据结构的算法(小算法)):每种逻辑结构都可以归纳一个运算的集合,包括检索、插入、删除、更新、排序;
数据结构的分类:数组 (Array)、栈 (Stack)、 队列 (Queue)、链表 (Linked List)、树 (Tree)、堆 (Heap)、图(graph)、集合(set)、哈希表(hash)与映射(map)
算法按照应用分:基本算法、数据结构相关算法(小算法)、数论与代数算法、几何算法、图论算法、动态规划与数值算法、数值分析算法、加密/解密算法、排序算法、查找算法、并行算法、检索算法、随机化算法;
算法按思路分:递推(Recurrence)算法、递归(recursion)算法、穷举(Enumeration)算法、贪婪算法(Greedy)、分治(Divide and Conquer)算法、动态规划(Dynamic Programming)算法、迭代(iterated)算法、回溯法(Backtracking)、分枝界限(Branch and Bound Algorithm)算法、概率( probabilistic)算法。
算法都遵循特定的方法和模式,就算法的模式而言,处理各种求最优解问题时,人们常用贪婪法、动态规划法等算法模式,处理迷宫类问题时,穷举式的枚举和回溯是常用的模式。
就算法的实现方式而言,如果算法需要频繁地查表操作,那么数据结构的设计通常会选择有序表来实现;反过来,当设计的算法用到了树和图这样的数据结构时,含有递归结构的方法就常常伴随它们左右。
算法 = 操作 + 控制结构
算法 | 操作 | 操作符:针对特定数据类型的数据处理 |
算术运算:加减乘除等运算 | ||
逻辑运算:或、且、非等运算 | ||
关系运算:大于、小于、等于、不等于等运算 | ||
数据传输:输入、输出、赋值等运算 | ||
控制结构 | 顺序(sequence)、选择(selection)及循环(repetition) |
面向过程的模块化思想:函数:功能、输入(局部变量与参数及全局变量)、输出(函数带出值的四种方法),输入的数据的操作与转换形成输出(函数内算法);
一个函数包装一段代码并给予命名,引进参数将其通用化。
函数的内部观点:关心函数的定义,1 采用什么计算方法;2 采用什么实现结构;3 实际参数如何使用;4 怎样得到所需要的返回值;
函数的外部观点:关心函数的使用,1 实现了什么功能;2 名字是什么;3 要求几个参数,各参数的意义和作用;4 返回什么值;
面向对象的封装:对象的属性,类方法(处理对象的属性,事件触发);
数据类型 变量
类 对象
基于值的变量(变量→值)与基于指针或引用地址的变量(变量→地址→值);
组合数据类型的访问:基于基准元素的地址:
1 用整数索引,如数组或列表;
2 结构体的指针域;
3 用key索引value,如字典、哈希表。(key map address sapce)
1 避免冗余:自定义函数和类、继承、泛型、模板
2 不重复造轮子:利用内置函数、模板库函数、模板类;
数据模型、数据表示、数据结构、数据处理;
数据结构、数据输入、数据转换(模型或算法)、数据输出;
数据结构的算法(小算法):对数据元素有如“增、查、删、改”等的运算并能保持原有的映射才能对数据进行进一步的利用。
Encapsulation: Grouping together related types, Data, and Functions
方法和函数是一回事,只是它是调用在一个值上。例如,如果一个列表值存储在spam 中,你可以在这个列表上调用index()列表方法,就像spam.index('hello')一样。方法部分跟在这个值后面,以一个句点分隔。
每种数据类型都有它自己的一组方法。例如,列表数据类型有一些有用的方法,用来查找、添加、删除或操作列表中的值。
data and operations that manipulate the data;
(基本数据类型 ← 运算符)→ 表达式
(函数内部局部变量、函数参数、全局变量) ← 函数
类的数据成员 ← 类方法(类实例名称.类成员,前缀相当于是对后缀的限定)
为计算机编写程序,编程者需要从实际问题出发,从高层开始设计程序,然后逐步分解程序功能。分解到一定细节程度后,就可以用编程语言的已有结构直接描述了。与之相对应,编程语言也需要为程序的分层构造提供支持。
1 需要一组基本操作,作为复杂计算活动的基础。机器和汇编语言里的基本操作就是各种基本指令,高级语言也提供了一组基本操作。 (基本类型+操作符)
2 需要一套描述计算的流程如何进行的组合机制。机器的汇编语言里的基本机制是顺序执行,以及完成有条件转换或无条件转换的专门指令。高级语言也提供一套用于组合简单计算,构造出任意复杂的计算描述的结构。(选择和循环等控制结构)
3 为了支持复杂开发,高级语言提供了抽象机制,能够把一些复杂的功能包装成为一个整体,用于支持程序的分层次构造。(函数和类封装)
在设计一处程序时,经常需要根据问题的情况,将其划分为顺序的一系列小计算片段(顺序计算模式),每个片段看作一个抽象的操作。对每个较小片段,又可能需要按某种模式进一步分解,采用if、for、while结构进一步分解。这样分解下去,直至计算中的条件和操作都能用高级语言的基本功能描述。为避免冗余,需要使用函数或类封装的抽象机制,让众多的代码显得结构清晰。
(一些复杂的程序或软件一开始也可能只是一个简单的版本,然后功能逐渐增加,版本逐步更新换代。)指令代码和数据同等存储到内存,随机访问。
内存属于存储层次中较中间的位置:向内有缓存、寄存器;往外有外存储器,如硬磁盘、U盘等;
1 基本类型,C语言需要在变量前声明;
2 复合数据类型,如结构体,先定义结构体,对元素的访问是,先声明结构体变量struct 结构体名,再通过结构体变量名、点号.去访问结构体成员;
3 类,先定义类,对类成员的访问是,先声明类实例,再通过实例名、点号.去访问类成员;
Each one of these data types has a unique range of allowable values and a set of allowable operations and functions. For example, the float data type has a range of positive and negative values which are different from the range of numbers that can be held with an int data type. An allowable operation on both the int and float data types is the square root function sqrt(). A string function such as length() is not applicable to either float or int and is consequently not allowed.
每一种数据类型都有一个唯一的允许聚会范围及一组允许的操作和函数。例如,浮点型所允许的正负取值范围与整型所允许的取值范围就是不同的。平方根函数sqrt()既适用于整型数据,也适用于浮点型数据。像length()这样的字符串处理函数就不能应用于整型或浮点型数据。
编程语言里的变量是最基本抽象机制,用于给对象命名。算出一个所需要的值,可能要做很多工作,如果不给它命名,用过就丢了,再次使用就必须重新计算,至少要花费一些代价,程序也会变得更长。把计算出的值(对象)赋给变量,就为其建立了一个抽象。后面再需要这个值就不必重新计算,只需要写出相应的变量名,就可以方便地使用了。这是建立抽象的第一层意义:一次计算,可以任意多次使用;
函数定义能够建立起一般计算过程的抽象,写一次代码,任意多次重复使用,包括对不同的数据做同样计算;基于一段代码定义一个具有计算功能的实体并给予命名,就是定义函数抽象。函数调用也并不是简单重复,因为可以替代不同的参数。
从字面量到常量,就如同从算术到代数,函数及其参数的引入,更是通用化的进一步抽象。
类是一种更高层次的抽象,数据与数据操作的结合也更加紧密。
Basic Type = Value set + Operation set
Data Structure = ①Data Elements + ②Data Logic Relation + ③Data Operation;
①可以是1个简单的基本数据类型,也可以是基本数据类型+一个或多个指针域;
Linear & Non-Linea Structure - Sequential & Non-Sequential Storage;
如果②是线性关系:对于③进行特殊定义就有栈、队列等数据结构;对于①进行特殊限制就有字符串等数据结构;对于①的数量和类型进行限定就是数组、广义表等数据结构;
如果②是非线性的层次关系,则是树这种数据结构;
如果②是非线性的网状关系,则是图这种数据结构;