1
第二章 算法主讲 福州大学数学与计算机学院 韩晓芸
E-mail:hxy@fjtv.net
第二章 算法
2
第二章 算法第一节 程序的灵魂 -----算法第二节 算法的概念第三节 简单算法举例第四节 算法的特性第五节 算法的表示方法第六节 结构化程序设计方法第二章 算法
3
第一节 程序的灵魂 ----算法程序应包括 对数据的描述 和 对数据处理的描述
1,对数据的描述,即 数据结构 。 数据结构是计算机学科的核心课程之一,在 C语言中,系统提供的数据结构,以数据类型的形式出现
2,对数据处理的描述,即 计算机算法 。 算法是为解决一个问题而采取的 方法和步骤,是程序的灵魂。为此,著名计算机科学家 沃思
( Nikiklaus Wirth)提出一个公式:
数据结构 + 算法 = 程序第二章 算法
4
第一节 程序的灵魂 ----算法
3.实际上,还应 采用结构化程序设计方法 进行设计,并 用某一种计算机语言表示 。可以表示如下:
程序 =算法 +数据结构 +程序设计方法
+语言工具和环境第二章 算法
5
第二节 算法的概念
算法是为解决一个问题采取的 方法和步骤 。
计算机算法分类
– 数值算法
求方程的根
求函数的定积分
– 非数值算法
图书检索
人事管理第二章 算法
6
第三节 简单算法举例例 2.1 求 1*2*3*4*5
今设 p为被乘数,i为乘数 。用自然语言表示算法如下:
S1,使 p=1
S2,使 i=2
S3,使 p*i,乘积仍放在变量 p中,可表示为
p*i→p
S4,使 i的值加 1,即 i+1→i
S5,如果 i不大于 5,返回重新执行步骤 S3以及其后的步骤 S4和步骤 S5;否则,算法结束。
最后得到的 p的值就是 5!的值。
第二章 算法
7
第三节 简单算法举例如果题目改为 求 1*3*5*7*9*11:算法只须稍做如下改动即可:
S1,使 p=1
S2,使 i=3
S3,使 p*i,乘积仍放在变量 p中,可表示为
p*i→p
S4,使 i的值加 1,即 i+2→i
S5,如果 i不大于 11,返回重新执行步骤 S3以及其后的步骤 S4和步骤 S5;否则算法结束。
第二章 算法
8
第三节 简单算法举例例 2.2 有 50个学生,要求将他们之中成绩在 80分以上者打印出来。用 N表示学生学号,N1 代表第一个学生的学号,Ni代表第 i个学生的学号 。
用 G代表学生成绩,Gi代表第 i个学生的成绩 。
算法可表示如下:
S1,使 i=1
S2,如果 gi≥80,则打印 ni和 gi,否则不打印。
S3,i+1→i
S4,如果 i≤50,返回 S2,继续执行,否则,算法结束。
第二章 算法
9
第三节 简单算法举例例 2.3 判定 2000—2500年中的每一年是否闰年,
并将结果输出。
闰年的条件是:
① 能被 4整除,但不能被 100整除。 如 1996年,
2004年;
② 能被 100整除,又能被 400整除。 如 1600年,
2000年。
不符合这两个条件的年份就不是闰年。
第二章 算法
10
第三节 简单算法举例算法可表示如下:
S1,2000→y
S2,若 y不能被 4整除,输出 y“不是闰年”。 转
S5
S3,若 y能被 4整除,不能被 100整除,则输出
y“是闰年”。然后 转 S5
S4,若 y能被 100整除,又能被 400整除,则输出
y“是闰年”,否则输出 y“不是闰年”。
S5,y+1→y
S6,当 y≤2500时,转 S2继续执行,否则,算法结束。
第二章 算法
11
第三节 简单算法举例例 2.4 求 1-1/2+1/3-1/4+……+1/99 -1/100
用自然语言表示算法如下:
S1,sign=1
S2,sum=1
S3,deno=2
S4,sign=(-1)*sign
S5,term=sign*(1/deno)
S6,sum=sum+term
S7,deno=deno+1
S8,若 deno≤100 返回 S4;否则算法结束。
第二章 算法
12
第三节 简单算法举例例 2.5 对一个大于或等于 3的正整数,判断它是不是一个素数。
用自然语言表示算法如下:
S1,输入 n的值
S2,i=2
S3,n被 i除,得余数 r
S4,如果 r=0,表示 n能被 i整除,则 打印 n“不是素数”,算法结束 ;否则执行 S5
S5,i+1→i
S6,如果 i≤n-1,返回 S3; 否则打印 n“是素数”。
算法结束。
第二章 算法
13
第四节 算法的特性
有穷性
– 算法要包含有限的步骤
确定性
– 每一步必须明确
有零个或多个输入
– 需要从外界获取必要的信息
有一个或多个输出
– 需要把求得得解进行输出
有效性
– 每一步都能有效地执行第二章 算法
14
第五节 算法的表示方法
设计算法
3.1 自然语言(前面就是用自然语言表示的)
3.2 传统流程图
3.3 改进的流程图
3.4 N-S图(盒图)
3.5 PAD图(问题分析图)
3.6 伪代码
实现算法
3.7 计算机语言第二章 算法
15
3.2 传统流程图
优点:
– 描绘直观,
容易掌握
缺点:
– 对流程线没有严格控制起 止 框输 入 输 出 框判 断 框处 理 框流 程 线连 接 点注 释 框第二章 算法
16
3.2 传统流程图将例 2.1求 5!的算法用传统流程图表示如下:
开 始
i > 5
1 → t
2 → i
i + 1 → i
t * i → t
结 束
Y
N
开 始
i > 5
1 → t
2 → i
i + 1 → i
t * i → t
结 束
Y
N
打 印 t
第二章 算法
17
3.2 传统流程图将例 2.2的算法用传统流程图表示如下:
开 始
i > 5 0
1 → i
i + 1 → i
结 束
Y
N
g
i
≥ 8 0
打 印 n
i,
g
i
Y N
第二章 算法
18
3.2 传统流程图将例 2.3的算法用传统流程图表示如下:
开 始
y > 2 5 0 0
2 0 0 0 → y
y + 1 → y
结 束
Y
N
y 不 能 被 4 整 除打 印 y,是闰 年,
Y
N
y 不 能 被 1 0 0 整 除
Y
打 印 y,不是 闰 年,
y 不 能 被 4 0 0 整除
N
N Y
打 印 y,不是 闰 年,
打 印 y,是闰 年,
第二章 算法
19
3.2 传统流程图将例 2.4的算法用传统流程图表示如下:
开 始
d e n o > 1 0 0
1 → s u m
2 → d e n o
S i g n * ( 1 / d e n o ) → t e r m
( - 1 ) * s i g n → s i g n
结 束
Y
N
d e n o + 1 → d e n o
s u m + t e r m → s u m
1 → s i g n
第二章 算法
20
3.2 传统流程图将例 2.5的算法用传统流程图表示如下:
开 始
i > √ n
输 入 n
i + 1 → i
结 束
Y
N
r = 0
打 印
n,不 是素 数,
Y
N
打 印 n,是素 数,
n / i 的 余 数 → r
2 → i
第二章 算法
21
3.3 改进的流程图顺序 选择 (分支 )
A
B A B
p
真 假
p
A
真循环
p
A
假假真A B
p
G
第二章 算法
22
3.3 改进的流程图将例 2.5的算法用改进的流程图可表示如右:
开 始
i ≤ √ n 且 w = 0
输 入 n
i + 1 → i
结 束
Y
N
r = 0
1 → w
Y
N
打 印 n,是素 数,
n / i 的 余 数 → r
0 → w
2 → i
w = 0
打 印 n,不是 素 数,
NY
第二章 算法
23
3.4 N-S图(盒图)
I.Nassi和 B.Shneiderman提出
– 取消流程线,不能任意转移控制
– 使用 N-S符号设计出来的程序必然是结构化程序
– 容易表示嵌套关系
– 容易确定局部和全局数据的作用域第二章 算法
24
A
B
C
条件T F
A B
循环条件循环体循环条件循环体条件
Case1
部分值 1 值 2 …… 值 n
Case2
部分
Casen
部分
A
N-S的基本符号第二章 算法
25
3.4 N-S图(盒图)
将例 2.1的求 5!算法用 N-S流程图表示如下:
1→t
2→i
t*i→t
i+1→i
直到 i> 5
打印 t
第二章 算法
26
3.4 N-S图(盒图)
将例 2.2的算法用 N-S流程图表示如下:
1→i
gi≥80
打印 ni,gi
i+1→i
直到 i> 50
是 否第二章 算法
27
3.4 N-S图(盒图)
将例 2.3的算法用 N-S流程图表示如下:
2000→y
y/4的余数为 0
打印
y“非闰年”
y+1→y
直到 y> 2500
是 否
y/100的余数不为 0
是 否打印
y“是闰年”
y/400的余数为 0是 否打印
y“是闰年”
打印
y“非闰年”
第二章 算法
28
3.4 N-S图(盒图)
将例 2.4的算法用 N-S流程图表示如下:
1→sum
2→deno
sign*1/deno→term
直到 deno> 100
打印 sum
1→sign
deno+1→deno
sum+term→sum
(-1)*sign→sign
第二章 算法
29
3.4 N-S图(盒图)
将例 2.5的算法用 N-S流程图表示如下:
输入 n
0→w
r=0
直到 i> √n或 w≠0
W=0
2→i
i+1→i1→w
n/i的余数 → r
是 否是 否输出 n“是素数” 输出 n“不是素数”
第二章 算法
30
3.5 PAD图(问题分析图)
用二维树型结构表示
– 使用 PAD符号设计出来的程序必然是结构化程序
– 描绘的结构非常清晰
– 用 PAD图表现程序逻辑,易读、易懂、易记
– 支持自顶向下,逐步求精方法的使用(用
def增加细节)
第二章 算法
31
P1
P2
P1
P2
C
L1
L2
Ln
P1
P2
Pn
……
WHILE C P
UNTIL C P
PAD图基本符号第二章 算法
32
3.6 PDL(过程设计语言 —伪码)
用结构化程序设计语言的语法控制框架,
在内部却可灵活使用自然语言来表示各种操作
– 比流程图更灵活,可以使用普通的正文编辑程序进行修改
– 可以作为注释直接插在源程序中,提高文档质量
– 有自动处理程序存在,可自动生成程序代码
– 缺点:不如图形工具直观第二章 算法
33
3.6 PDL(过程设计语言 —伪码)
BEGIN
input m,n
if m<n exchange m and n
m%n r
while r ≠0
{ n m
r n
m%n r}
print n
END
开始输入 m,n
m<n?
m,n交换求 m除以 n的余数
r≠0
打印 nn赋给 m,r赋给 n,求 m除以 n的余数结束第二章 算法
34
3.7 计算机语言
BEGIN
input m,n
if m<n exchange m and n
m%n r
while r ≠0
{ n m
r n
m%n r}
print n
END
main()
{int m,n,r,t;
scanf(“%d,%d”,&m,&n);
if(m<n) {t=m;m=n;n=t;}
r=m%n;
while(r!=0)
{m=n;n=r;r=m%n;}
printf(“n=%d”,n);
}
第二章 算法
35
第六节 结构化程序设计方法
原理,用三种基本控制结构,通过组合和嵌套可实现任何 单入口、单出口 的程序。
方法:
– 自顶向下
– 逐步细化
– 模块化
– 结构化编码第二章 算法
36
第六节 结构化程序设计方法例:将 1到 1000之间的素数打印出来。
前面已讨论过判别素数的方法,现在采用,挨拉托色尼筛法,来求素数表。
用筛选法求素数表输入 1到 1000
各数把所有非素数去掉打印全部素数第二章 算法
37
第六节 结构化程序设计方法例:将 1到 1000之间的素数打印出来。
现在采用,挨拉托色尼筛法,来求素数表。
输入 1到 1000
把所有非素数去掉打印全部素数
A{
B{
C{
A:
输入 n
1→i
当 i≤n
i→x i
i+1→i
第二章 算法
38
第六节 结构化程序设计方法例:将 1到 1000之间的素数打印出来。
现在采用,挨拉托色尼筛法,来求素数表。
B1{
B2{
B3{
B:
将 x1去掉 (使 x1 =0)
2→i
当 i< √n的整数部分如 xi未去掉,则将 xi+1到 xn间是 xi倍数的数全部去掉
i+1→i
} D
第二章 算法
39
第六节 结构化程序设计方法例:将 1到 1000之间的素数打印出来。
现在采用,挨拉托色尼筛法,来求素数表。
D,E:
i+1→j
当 j≤n
能被 xi 整除的 xj
去掉
j+1→j
xi=0是 否将 xi+1到 xn间是 xi倍数的数全部去掉 } E } F
第二章 算法
40
第六节 结构化程序设计方法例:将 1到 1000之间的素数打印出来。
现在采用,挨拉托色尼筛法,来求素数表。
F:
xj =0是 否
xj能被 xi 整除是 否使 xj =0
第二章 算法
41
第六节 结构化程序设计方法例:将 1到 1000之间的素数打印出来。
现在采用,挨拉托色尼筛法,来求素数表。
C,G:
1→i
当 i≤n
把未挖掉的 xi
打印出来
i+1→i
是 否打印 xi} G
xi=0
第二章 算法
42
练习题作业分别用传统流程图和 NS盒图求解以下问题,
1,求 1+2+3+……+100 。
2,依次将 10个数输入,将其中最大的数打印出来。
3,输入 3个数,a,b,c,要求按从大到小顺序打印出来。
4,判断一个数 n能否同时被 3和 5整除。
5,求两个数 m和 n的最大公约数。
6,将 100~200之间的素数打印出来。
第二章 算法
43
下课了。。。
追求休息一会儿。。。