2010-5-18 1
Visual Basic程序设计
第八讲
补充内容,算法
2010-5-18 2




算法的概念
算法的特点
表示算法常用的三种方法
一、算法的概念
要利用计算机处理问题,需要编写出使计
算机按人们意愿工作的程序。而程序实质上就
是一组计算机指令。每一条指令使计算机执行
特定的操作。因此,每个学习计算机知识以及
希望利用计算机进行某项工作的人都应学习如
何进行程序设计。
为了有效地进行程序设计,应当至少具有
两方面的知识。即:
1,掌握一门高级语言的语法规则;
2,掌握解题的方法和步骤 ---算法。
有了正确有效的算法,可以利用任何一种
计算机高级语言编写程序。
2010-5-18 4
1、什么是算法
?为解决一个问题而采用的 方法和步骤称为算法 。
做任何事情都有一定方法和步骤,例如,打
太极拳有描述太极拳动作的图解,它是“太极拳
的算法”。解决某一问题的计算机算法,应该是
一系列的操作步骤。
?对同一个问题,可以有不同的算法,但算法有优
劣之分,有的算法步骤少,有的算法步骤多。 我
们希望得到方法正确,步骤少的算法。
?算法语言只是一 种工具,为实际问题 设计算法 才
是程序设计的核心。
?因此,为了有效地进行解题,不仅需要保证算法
正确,还要考虑算法的质量,选择合适的算法。
2010-5-18 5
2、算法的特点
?有穷性。 一个算法应包含有限的操作步骤,不能
出现死循环。
?确定性。 算法中的每一个操作步骤都应当是确定
的,而不应当是含糊不清的。
?可以没有输入, 也可以有多个输入。 执行算法有
时需要从外界得到信息,这时必须有输入语句。
?有一个或多个输出。 算法的目的是为了求解,
“解”一定要通过输出,才能看到结果。
?有效性。 算法中的每一个步骤都应当能有效的执
行。并得到确定的结果。
2010-5-18 6
?算法常用的几种表示方法
?用传统流程图表示算法
?用 N-S结构化流程图表示算法
?用伪代码表示算法
2010-5-18 7
二、算法常用的几种表示方法
1,用传统流程图表示算法
? 传统流程图常用的符号
– 起止框
– 输入输出框
– 判断框
– 处理框
– 流程线
– 连接点
– 注释框 -----
2010-5-18 8
1,用传统流程图表示算法
---传统流程图表示算法的三种结构
? 顺序结构
? 分支结构
Y
条件
入口
N
块 1
块 2
块 1
块 2
2010-5-18 9
1,用传统流程图表示算法
------传统流程图表示算法的几种结构
? 循环结构
– 当型循环
– 直到型循环
条件 N
Y

终端语句的下一语句

条件
终端语句的下一语句
N
Y
当型循环 直到型循环
2010-5-18 10
1,用传统流程图表示算法
例 1 用流程图表示求 5!的算法
解:该问题是求从 1到 5的连乘积,用变量
T来存放被乘数;用变量 I来存放乘数其值
从 1到 5,使用公式,T=T*I,用循环结构来设
计算法。变量 T既存放被乘数又存放乘积。
变量 T初值设为 1,变量 I初值为 2每循
环一 次,就把它乘到 T上,然后变量 I再增
加 1,直到变量 I的值大于 5,循环就结束。
此时变量 T的值就是所求的值。
流程图如图 4-1 (见下页)
2010-5-18 11
图 4-1
用变量 T存
放乘积,用
变量 I代表
第二个乘
数,I从 2变
到 5。
2010-5-18 12
1, 用传统流程图表示算法
例 2 用流程图表示判断 2000年 ~2500年是
否闰年的算法。
解:闰年的条件是:
?能被 4整除,但 不能被 100整除的年份都是
闰年;
?能被 100整除,又能被 400整除的年份是闰
年。
2010-5-18 13
? 由于要判断 2000~2500年哪年是否闰年,
所以该问题须用循环结构来设计。
? 用变量 Y表示年份,变量 Y的初值赋为
2000,然后判断是否满足闰年给出的条件。
满足条件的,打印是闰年,不满足条件的,
打印非闰年。
? 判断完后,变量 Y加 1,再继续判断,直
到变量 Y的值大于 2500。 流程图见图 4-2
(转下页)
2010-5-18 14
图 4-2
用变量 Y表示年份,变
量 Y的初值赋为 2000。
Y大于
2500
N
Y
2010-5-18 15
1、用传统流程图表示算法
例 3用传统流程图表示判断 N是否为素数的算法 。
解,所谓素数,是指除 1和它本身之外,不能被其它
任何整数整除的数。例如,13是一个素数。
判断某个数 N( N大于等于 3) 是否为素数的方
法是,将 N作为被除数,用 2 到 (N-1) 各个整数轮流
作除数,如果都不能被整除,则 N为素数。
实际上,N不必被 2到( N-1)的整数除,只需
被 2到 N/2间整数除即可,甚至只需被 2到 之间
的整数除即可。流程图见图 4-3
N
2010-5-18 16
图 4-3
判断 N是否为素
数。可用变量 I
去除 N,I从 2变
到,用变量
R来存放余数!
开始
输入 N
N/I的余数 =>R
R=0
打印 N
“不是素数”
I+1=>I
结束
2 =>I
打印 N
“是素数”
NI ?
Y
N
N
Y
N
2010-5-18 17
1,用 传统流程图表示算法
---传统流程图的弊端
? 可读性差。 由于算法中允许使用流程线
让程序转来转去,从而使流程图变得毫
无规律,读起来要化很大的精力。也使
人难以理解算法的逻辑。
? 算法的可靠性和可维护性差 。流程线的
使用使算法变成一团乱麻,毫无规律,
使其可靠性和可维护性差,因而因此流
程图中必须限制箭头的使用。
2010-5-18 18
1、用 传统流程图表示算法
---- 三种基本结构
? 顺序结构,
? 分支结构
B
P
出口出口
入口
A
Y NP
B
P
A
入口
Y N
A
入口
出口
B
2010-5-18 19
?循环结构
P P
A
A
入口
出口出口
入口
Y N
N Y
2010-5-18 20
1,用 传统流程图表示算法
---三种基本结构的特点
? 只有一个入口。
? 只有一个出口。
? 结构中每一部分都有机会被执行。
? 结构中不存在“死循环”。
2010-5-18 21
2,用 N-S结构流程图表示算法
? 流程符号:
?顺序结构
? 先执行 A框,
? 再执行 B框 。
?选择结构
?当条件 P成立时执行 A操作。
?当条件 P不成立时执行 B操作。
A
B
P
成立 不成立
A B
2010-5-18 22
?-循环结构
?当型循环,
?当 P1条件成立时,
反复执行 A操作
?当 P1条件不成立时,
不再执行 A操作
当 P1
A
A
直到 P2
?直到型循环:
?反复执行 A操作,
?直到 P2条件成
立时。退出循环。
2, 用 N-S结构流程图表示算法
2010-5-18 23
2,用 N-S结构流程图表示算法
--举例
例 1,将 50名学生中成
绩高于 80分的学生的
学号和成绩打印出来。
解,N-S结构化
流程图如图 4-4:
其中,
变量 i用来统计 学生
人数。
变量 Ni,Gi用来表示
学生的学号和分数。
图 4-4
2010-5-18 24
2,用 N- S结构流程图表示算法
-- 举例
例 2用 N-S图表示求
的算法。
解,本例是求多项式的和,用变量 sum存放累加
和,由于每项中的符号不一样,须用一个变量
sign来存放 符号; 用变量 term来存放某一项 。
用变量 deno来存放某一项的分母。算法开始,
将变量 sum和 sign赋值为 1,然后分别求 sign
和 deno得到某一项的值,接着加到和上,再
求另一项的值,再加到和上,直到 deno大于 100.
流程图如图 4-5所示:
1 0 0
1
99
1.,,,,,
3
1
2
11 ????
2010-5-18 25
图 4-5
用变量 sum
存放和,用
变量 deno存
放分母,用
Sign存放符
号用 term存
放每一项。
2010-5-18 26
2,用 N-S结构流程图表示算法
---- 举例
例 3 用 N- S结构化流程图表示判断 2000
年 ~2500年是否闰年的算法。
(见下页图 4- 6 )
2010-5-18 27
图 4- 6
设变量 Y
表示年,
其初值设
为 2000年
2010-5-18 28
为了使程序能符合结构化程序设计,
这里设计了一个开关 W,使初值为 0,若 N
能被某一个整数整除,则使 W值为 1,否则
W值不变。最后根据 W的值来确定 N是否
为素数,若 W值为 0,则 N为素数,否则 N
为非素数。
例 4用 N-S结构化流程图表示判断 N是
否为素数的算法 。 (见下页图 4- 7 )
2010-5-18 29
图 4-7
这里 设计
了一个开关 W,
使初值为 0,
若 N能被某一
个整数整除,
则使 W值为 1,
否则 W值不变。
2010-5-18 30
3,用伪代码表示算法
----什么是伪代码
伪代码是用介于自然语言和计算机
语言之间的文字和符号来描述算法。它
如同一篇文章一样,自下而上地写下来。
每一行(或几行)表示一个基本操作。
它不用图形符号,因此书写方便、格式
紧凑,易学好懂,便于修改,也便于向
计算机语言(即程序)过渡。
2010-5-18 31
3,用伪代码表示算法
-----伪代码表示算法的几种结构
? 分支选择结构
IF (条件 ) THEN
语句组 1
ELSE
语句组 2
END IF
? 循环结构
DO WHILE (条件 )
循环体
END DO
2010-5-18 32
3,用伪代码表示算法
----- 举例
例 1.用伪代码设计算法判断 N是否为素数。
解,判断某个数 N是否为素数的方法是,将 N作为被
除数,用 2 到 各个整数轮流作除数,如果
都不能被整除,则 N为素数。
为了使程序能符合结构化程序设计,这里设计
了一个开关 W,使初值为 0,若 N能被某一个整
数整除,则使 W值为 1,否则 W值不变。最后
根据 W的值来确定 N是否为素数,若 W值为 0,
则 N为素数,否则 N为非素数。
N
2010-5-18 33
3,用伪代码表示算法
----- 举例
解,用伪代码设计算法如下,
BEGIN(算法开始 )
input N
0=>W
2=>I
DO WHILE
N/I 余数 =>R
IF R=0 THEN 1=>W
ELSE I+1=>I (转下页 )
0?? WA NDNI
2010-5-18 34
END IF
END DO
IF W=0 THEN print N,,是素
数,
ELSE print N,“不是素数,
END IF
END (算法结束 )
2010-5-18 35
3 用伪代码表示算法
----- 举例
例 2 用伪代码设计算法用下面公式求 sin x 的值。
解,
该多项式可以写成下列形式:
)!14()!14(...!7!5!3s i n
1414753
?????????
??
n
x
n
xxxxxx nn
)!12(
.)1(...
!7!5!3
s i n
12
1
753
?
???????
?
?
n
xxxxxx nn
2010-5-18 36
该问题是求多项式的和。
?用 变量 SUM来存放和,初值赋为 X。
?用变量 S来存放符号,初值赋为 1。
?用变量 D来存放每一项的分母,初值赋为 1.
?用变量 T来存放每一项的分子,初值赋为 1。
?用变量 TERM来存放每一项。
?用变量 K控制内循环次数,初值赋为 1。
?用变量 i 控制外循环次数,初值赋为 2。
算法使用了双重循环,外层循环用来求
出每一项,并把它加到和上。内循环是分别
求出每一项的分子和分母。
2010-5-18 37
求第 I项的程序段为,i 从 2变化到 N
内循环是分别求出第 i 项的分子和分母。
WHILE K ? 2*i-1 DO
D=D*K D用来存放分母 (2*i -1)!
T=T*X T用来存放分子 (X)( 2*i -1)
K=K+1
END DO
用下列算法求第 i 项的值:
S=( -1) *S
TERM=S*T/D
把求出第 i 项加到和中
SUM=SUM+TERM
完整的算法如下页所示:
2010-5-18 38
2 => i
WHILE i ? N DO
D=1
T=1
K=1
WHILE K ? 2*i -1 DO
D=D*K
T=T*X
K=K+1
END DO
解,用伪代码设计算法如下,
法一, BEGIN (算法开始)
输入 N,X
X => SUM
1 => S
2010-5-18 39
S=(-1)*S
TERM=S*T/D
SUM=SUM+TERM
I=I+1
END DO
PRINT SUM
END (算法结束)
2010-5-18 40
法二,
BEGIN(算法开始)
输入 X,N
X=>SUM
X=>TERM
T=X**2
i =2
D=1
DO WHILE i <= 2*N-1
D=i *(i +1)
TERM=TREM*T/D
TERM=TERM*(-1)
SUM=SUM+TERM
i =i+2
END DO
PRINT SUM
END (算法结束)
当 I=2时,D=2*3
当 I=4时,D=4*5
当 I=6时,D=6*7
当 I=8时,D=8*9
2010-5-18 41
例:依次将十个数输入要求将其中最
大的数打印出来。
方法一:
Y
N
N
开始
MAX=X
I=2
X >MAX
MAX=X
I=I+1
I>10
结束
Y
1
1
输出 MAX
输入一个数 X
输入 X





2010-5-18 42
法二:用 N-S结构流程图表示
MAX=X,I=2
输入一个数 X
X>MAX
I=I+1
Y N
MAX=X
I>10
输出 MAX
输入一个数 X
2010-5-18 43
法三:用伪代码表示
BEGIN
输入一个数 X
MAX=X
I=2
DO UNTIL I>10
输入一个数 X
IF X>MAX THEN
MAX=X
END IF
I=I+1
END DO
PRINT MAX
END
2010-5-18 44
4,结构化程序设计方法
在前面我们介绍了结构化程序设计的
算法和三种基本结构,一个结构化程序就
是用高级语言表示的结构化算法。用三种
基本结构组成的程序必然是结构化的程序,
这种程序便于编写,便于阅读,便于修改
和维护。这就减少了程序出错的机会,提
高程序的可靠性,保证了程序的质量。
结构化程序设计强调程序设计的风格
和程序结构的规范化,即提倡清晰的结构。
2010-5-18 45
?结构化程序设计方法
?自顶向下;
?逐步细化;
?模块化设计;
?结构化编码 。
结构化程序设计好比写一篇文章,先
设想文章总的分成几个部分,然后考虑每
一部分都分成那几段,最后再考虑每段写
什么内容。
4,结构化程序设计方法
--怎样才能得到一个结构化的程序呢?