一个程序应要有两方面信息:
(1)对数据的描述。数据类型和数据组织形式。就是数据结构(data structure)。
(2)对操作的描述。计算机执行的步骤,就是算法(alogrithm)。
简单理解就是烹饪需要食材和烹饪方法,蔬菜是数据,包括调料,烹饪方法是算法,用来加工菜肴。
著名计算机科学家沃思(Nikiklaus Wirth)提出
算法+数据结构=程序
编程除了数据结构和算法,其实还需要一种用于实现程序的计算机语言,以及程序设计方法。
2.1 什么是算法
算法,不要简单理解为计算的方法,它是为解决一个问题(或是一类问题)而采取的方法和步骤,就称为算法。比如打副本的方法,就可以理解为算法,又或是钢琴乐谱,按照乐谱就能弹奏特定的曲目。
算法是有比较的,例如100求和,有人从1开始逐个加到100,也有人(1+99)+(2+98)...+(49+51)+50+100计算,还有其他方法。 我们通常倾向采用简答且高效地算法。
计算机算法分为两大类别:数值运算算法和非数值运算算法。
数值运算:求解方程,函数定积分等
非数值运算:姓名排序、图书检索、人员管理等更为广泛的事务管理领域
随着技术发展,解决问题有很多现成的算法可以使用,但是学习者要掌握如何使用。
2.2 简单的算法举例
判断一个数是不是素数。素数,除了1和自身之外,不能被其他任何数整除。
判断n是否为素质,只要考虑n是否能被2~n-1整除即可。那么算法可以表示为:
S1:输入n的值 //S一般表示为step步骤的意思
S2:i=2(i作为除数)
S3:n被i除,得余数r
S4:如果r=0,表示n能被i整除,输出n“不是素数”,算法结束;否则执行S5
S5:i=i+1
S6:如果i<=n-1("<="表示小于等于),返回S3;否则输出n的值和“是素数”,程序结束。
2.3 算法的特性
(1)有穷性。算法包含有限的操作步骤。
(2)确定性。算法每一个步骤都应当是确定的。不能有二义性。
(3)有零个或多个输入。执行算法需要从外界取得必要的信息。
(4)有一个或多个输出。算法的目的是为了求解,没有结果是没有意义的。
(5)有效性。算法的每个步骤应该有效地执行,并得到确定的结果。
2.4 怎样表示一个算法
表示算法常用方法:自然语言、传统流程图、结构化流程图和伪代码。
2.4.1 用自然语言表示算法
自然语言表述容易出现歧义,有很多需要准确描述的细节,导致过于繁琐,一般不采用。
2.4.2 用流程图表示算法
直观易于理解,ANSI标准规定了常用流程图符号。菱形框表示判断,椭圆表示起止点,长方框表示处理,箭头表示流程线。
2.4.3 三种基本结构和改进的流程图
1.三种基本结构
(1)顺序结构
按个步骤执行
(2)选择结构。又称分支结构
需要进行条件判断,满足则执行对应条件。类似函数定义域和值域。
(3)循环结构。又称重复结构。
避免死循环,需要有循环跳出条件。
2.4.4 伪代码表示算法
伪代码(pseudo code)是用介于自然语言和计算机语言之间的文字和符号来描述算法。跟接近计算机代码,也便于阅读和修改。
i = 1;
t = 2;
n = i + t
输出n
2.4.6 用计算机语言表示算法
求两数(1和2)之和
#include<stdio.h>
int main()
{
int i,t;
i = 1;
t = 2;
n = i + t
printf("%d\n",n);
return 0;
}
2.5 结构化程序设计方法
把复杂问题分解为容易处理的单元。
结构化程序设计方法
(1)自顶向下;
(2)逐步细化;
(3)模块化设计;
(4)结构化编码。
类似写文章,确定大纲后,分块编写,逐步细化。由抽象逐步到具体化。划分子模块,通常里面用函数实现,要注意模块的独立性,一个模块完成一个任务,这就是一种分而治之的思想。任务分解后子任务逐个完成。设计好一个结构化算法之后,还要善于进行结构化编码(coding),即使用计算机语言表示。
学习语言是掌握掌握工具,最终是服务于我们要实现的算法,所以关键在如何设计算法。