VB第三章-结构化程序设计

Download Report

Transcript VB第三章-结构化程序设计

Visual Basic
程序设计
结构化程序设计和数组
•掌握IF语句结构及其应用
•掌握Select语句及其应用
•掌握循环结构及其应用
•掌握循环、分支结构的嵌套
•掌握数组的定义、应用
•掌握动态数组的定义、应用
三种常用的控制结构
顺序结构
操作1
循环结构
选择结构
成立
条件
不成立
条件
不成立
成立
操作1
操作2
操作2
操作
选择结构——IF语句
•单行IF…Then…语句
–格式:IF <条件> then <语句块>
–注意:
• 必须写在一个语句行上
• 语句块中可以包含若干以“:”分隔的语句
–例
If x Mod 2 = 0 Then Print "x是偶数“
If i <= j Then i = i + 1: j = j + 1
条件
不成立
成立
语句块
选择结构——IF语句
•单行IF…Then…Else…语句
–格式:IF <条件> then <语句块1> Else <语句块2>
成立
语句块1
条件
不成立
语句块2
–注意:
• 必须写在一个语句行上
• 语句块中可以包含若干以“:”分隔的语句
–例
If x Mod 2 = 0 Then Print "x是偶数" Else Print "x是奇数"
选择结构——IF语句
•块形式的IF…Then…End If语句
– 格式:
IF <条件> then
<语句块>
End IF
– 注意:
• Then后面不可以有语句,
否则被当做单行的IF语句,会产生错误。
– 例:输入x,y,按从大到小顺序输出
If x < y Then
t=x
x=y
y=t
End IF
Print x,y
条件
不成立
成立
语句块
选择结构——IF语句
•块形式的IF…Then…Else…End IF语句
–格式:
IF <条件> then
<语句块1>
Else
<语句块2>
End IF
–注意:
• Then和Else后面
不要跟上任何语句
成立
语句块1
条件
不成立
语句块2
–例:
If x Mod 2 = 0 Then
Print "x是偶数"
Else
Print "x是奇数“
End IF
选择结构——IF语句
•IF语句的应用原则
–只有语句块中的语句包含一个语句或较少的简单语句
时采用行结构的IF语句
if x<y then t=x:x=y:y=t
–建议采用块结构的IF语句,因为块结构的IF语句更加
容易阅读和理解
–块结构的IF语句在编码时要养成良好的缩进格式
–块结构的IF语句不要忘记End IF,可以采用先输入程
序框架,再编写框架代码的方法
选择结构——IF语句
•IF语句的嵌套
– 一个IF语句的“语句块”中可以包括另一个IF语句
If 条件1 Then
...
If 条件2 Then
...
Else
...
If 条件3 Then ... else ...
...
End If
...
Else
...
If 条件4 Then
...
End If
...
End If
选择结构——IF语句
•IF语句的嵌套
–例1:成绩等级的判定(3-1)
–例2:一元二次方程的求解(3-2)
选择结构——IF语句
•IF…Then…ElseIF…End If语句
– 格式
If 条件1 Then
语句块1
ElseIf 条件2 Then
语句块2
ElseIf 条件3 Then
语句块3
……
ElseIf 条件n Then
语句块n
[Else
语句块n+1]
End If
成立
条件1
不成立
成立
条件2
不成立
成立
条件3
不成立
成立
语句块1
语句块2
语句块3
语句块n
条件n
不成立
语句块n+1
选择结构——IF语句
•IF…Then…ElseIF…End If语句
–注意
• ElseIF不要误写为Else IF
• 最后的Else和语句块n+1可以省略
–例:改进的成绩等级的判定(3-3)
•复杂IF语句的阅读技巧
–设法明显标识出每一个IF语句
–在每一个IF和Else(或ElseIF)后标识出完整的条件
表达式
–不要过分相信自己的大脑
选择结构——IF语句
选择结构——Select case语句
•格式
Select case 测试表达式
Case 表达式1
语句块1
Case 表达式2
语句块2
……
Case 表达式n
语句块n
[Else
语句块n+1]
End Select
选择结构——Select case语句
计算测试表达式
是
否
匹配表达式1
是
否
匹配表达式2
是
否
匹配表达式3
是
语句块1
语句块2
语句块3
匹配表达式n
语句块n
否
语句块n+1
选择结构——Select case语句
•关于“匹配”的定义
– 匹配:相等或在制定区间内
– Case 后的表达式的形式
• 单个常量、变量、表达式:相等视为匹配
Case 10
Case “A”
• 用To表示的区间:测试表达式的值落在区间范围内视为匹配
Case 1 to 5
Case “A” to “Z”
• 使用IS、比较运算符和数值、字符串构成的表达式
– 在这种形式中,IS代表测试表达式
Case IS>10
Case is<>”A”
• 以上三种的组合,用“,”分隔
Case 1 to 5,10,12
Case “a” to “z”, “A” to “Z”
选择结构——Select case语句
•例:输入年份和月份,输出该月的天数(3-4)
•注意:
–在case后面的表达式中,测试表达式用IS表示,而不
能用测试表达式自身
select case n
…
case n>100 ×
正确写法case is >100
…
end select
选择结构——Select case语句
•注意:
– 如果有多个表达式满足匹配条件,仅仅匹配最前的一次(从流程
图中可以看出,匹配成功并执行相应语句块之后,程序就跳出
select case语句)
a = Val(InputBox("请输入a"))
a = Val(InputBox("请输入a"))
Select Case a
Select Case a
Case Is < 20
Case Is < 10
Print a * a
Print a
Case Is < 10
Case Is < 20
Print a /有执行机会吗
Print a * a
Else
Else
Print a * a * a
Print a * a * a
End Select
End Select
输入5后,两段程序有何差别
实际应用中,一般应该让case后的测试条件保持互斥。
循环结构——For语句
•格式
For 循环控制变量=初值 to 终值 [step 步长]
循环体(循环语句)
Next 循环控制变量
步长>0
循环控制变量=初值
循环控制变量<=终值
是
循环体
循环控制变量=
循环控制变量+步长
步长<0
否
循环控制变量=初值
循环控制变量>=终值
是
循环体
循环控制变量=
循环控制变量+步长
否
循环结构——For语句
•例1:计算1+2+3+……+99+100
Sum=0
For i=1 to 100 [step 1]
sum=sum+i
Next I
(累加程序的典型特征)
•注意
–当步长=1的时候,可以省略STEP
–要注意循环正常结束后循环控制变量的值
–循环体可能一次也不执行(P60)
循环结构——For语句
•Exit For语句
–提前结束循环,跳到Next后面的语句继续执行
–例:计算n,使得n是满足n!>1000的最小整数
fact = 1
For i = 1 To 20
fact = fact * i
If fact > 1000 Then Exit For
Next i
Print i
循环结构——For语句
•循环控制变量、终值和步长的问题
– 循环控制变量可以在循环体中改变
For i = 1 To 10
i=i+1
Print i;
Next i
以上程序输出:2 4 6 8 10
– 终值和步长如果是变量,也可以在程序中改变,但是不会影响循
环的次数
j = 10: k = 1
For i = 1 To j Step k
Print i;
j=j-1
k=k+1
Next i
Print
Print j, k
程序输出:
1 2 3 4 5 6 7 8 9 10
0
11
循环结构——While语句
•While语句格式
While 条件
循环体
Wend
不成立
•适用范围:循环次数无法预先确定
•例:计算n,使得n是满足n!>1000的最小整数
fact=1:i=1
while fact<=1000
i=i+1
fact=fact*i
wend
Print i
条件
成立
循环体
循环结构——Do/Loop语句
Do while 条件
Do until 条件
循环体
循环体
Loop
Loop
不成立
条件
成立
循环体
成立
Do
Do
循环体
Loop while 条件
条件
循环体
Loop Until 条件
循环体
循环体
不成立
循环体
成立
条件
不成立
不成立
条件
成立
循环结构
Sum = 0
For i = 1 To 100
Sum = Sum + i
Next i
Sum = 0: i = 1
While i <= 100
Sum = Sum + i
i=i+1
Wend
Sum = 0: i = 1
Do While i <= 100
Sum = Sum + i
i=i+1
Loop
Sum = 0: i = 1
Do Until i > 100
Sum = Sum + i
i=i+1
Loop
Sum = 0: i = 1
Do
Sum = Sum + i
i=i+1
Loop While i <= 100
Sum = 0: i = 1
Do
Sum = Sum + i
i=i+1
Loop Until i > 100
循环结构
•Exit Do语句
–提前结束do/Loop循环(与Exit For功能类似)
循环结构
•循环结构的其他问题
–For循环中循环控制变量的变化是自动的,While循环
和do/loop循环中循环控制变量的变化要自行控制。
–For循环可以转换为其他的循环格式,但是For循环更
简洁,因此能够事先确定循环次数时,应用For循环。
Sum = 0
For i = 1 To 100
Sum = Sum + i
Next i
Sum = 0: i = 1
While i <= 100
Sum = Sum + i
i=i+1
Wend
循环结构
•循环结构的其他问题
–循环开始之前,往往需要做一些变量的初始化(准备)
工作,如sum=0;fact=1;i=1之类;
–在while循环和Do/Loop循环中,循环的结束需自行控
制,因此在循环体中应该包含使循环趋于结束的语句
(比如i=i+1等),否则可能会陷入“死循环”
Sum = 0: i = 1
Do While i <= 100
Sum = Sum + i
i=i+1
Loop
循环结构
•循环结构的其他问题
–要注意循环体中语句的顺序可能导致不同的结果
Sum = 0: i = 1
Sum = 0: i = 1
Do While i <= 100
Do While i <= 100
Sum = Sum + i
i=i+1
i=i+1
Sum = Sum + i
Loop
Loop
Print Sum ,i
Print Sum,i
循环结构
•循环结构的其他问题
–Do/loop while(untile)循环和do whlie(until)/loop
循环可能因为循环初始条件的不同导致不同的结果。
Do/loop while(untile)循环的循环体至少将执行一次。
(先判断后执行和先执行后判断的差异)
Sum = 0: i = 200
Sum = 0: i = 200
Do While i <= 100
Do
Sum = Sum + i
i=i+1
i=i+1
Sum = Sum + i
Loop
Loop While i <= 100
Print Sum ,i
Print Sum ,i
程序结构实例
在以下实例中一定要注意对循环结构的验证,注意循环体语句
顺序,尤其验证循环的头、尾。
π
1 1 1
1
 1     ...... (  1 )n1
 ......直到最后一项的绝对值 106
4
3 5 7
2n  1
要点1:通项的构造方法、通项和循环控制变量之间的关系的发现;
1.根据下面的公式计算π :
要点2:正负项交替出现的一般方法
x 2 x3 x 4
2.计算s  1  x 


 ......直到最后一项的绝对值 106 , x由用户输入
2! 3! 4!
要点:根据前一通项构造后一通项的方法
3.计算sum=a+aa+aaa+…+(n个a),n和a由用户输入
4.穷举法列出所有水仙花数
5.数字颠倒,如将整数1234颠倒为4321并输出
6.辗转相除法求两个整数的最大公约数
7.素数的判断
8.找出小于10000的所有素数,并10个一行输出
9.验证哥德巴赫猜想:所有大于4的偶数均可表示为两个素数之和
程序结构实例
10.输出九九乘法表
11.字符形状输出
12.百钱买百鸡问题
13.迭代法解决猴子吃桃问题
3
2
14.二分迭代法求一元方程的根 x  x  1  0
3
2
x

x
1  0
15.牛顿迭代法求一元方程的根
2
2
4

x
dx
0
16.矩形面积法求积分
17.猜数字游戏
18.字符串的加密和解密
数组及其应用
引例:
– 输入三个数a,b,c,从大到小排序输出
•
•
•
•
比较a,b,如果a<b,交换a,b
比较a,c,如果a<c,交换a,c
比较b,c,如果b<c,交换b,c
输出a,b,c
– 输入100个数x1,x2,x3…,x100,从大到小排序输出
•
•
•
•
•
•
•
•
•
•
比较x1,x2,如果x1<x2,交换x1,x2
比较x1,x3,如果x1<x3,交换x1,x3
……
比较x1,x100,如果x1<x100,交换x1,x100
比较x2,x3,如果x2<x3,交换x2,x3
……
比较x2,x100,如果x2<x100,交换x2,x100
……
比较x99,x100,如果x99<x100,交换x99,x100
输出x1,x2,……x100
For i=2 to 100
if x1<xi then
t=x1
x1=xi
xi=t
endif
Next i
数组及其应用
•数组:数组是变量的扩展,一个数组可以存
储多个值,通过数组名和下标对这些值进行存
取。(顾名思义:一组数据)
•一维数组的声明
–Dim 数组名(下标下界 to 下标上界) as 数据类
型
–Dim 数组名(下标上界) as 数据类型
•例:
–Dim a(1 to 10) as integer
–Dim m(5) as string
数组及其应用
•说明
–数组名:代表整个数组,命名规则与变量相同
–下标的下界和上界决定了数组的元素个数(上界
-下界+1)
• 省略下界,则下标的下界取决于Option Base语句
–Option Base {1|0}
–该语句一般在通用的声明位置,如果没有该语句,默认为0
–数组是内存里连续的存储空间,大小取决于数组
元素类型和元素个数
数组及其应用
•一维数组元素的引用
–数组名(下标表达式)
Dim a(1 to 10) as integer
a(1)=1+2
y=a(2)
x=a(1+2)
–使用循环操作数组(3-5)
数组及其应用
•一维数组元素的引用
–实例:
• 用数组实现斐波那契数列(3-6)
• 找出一个数组中的最大值、最小值、平均值,并输出
所有小于平均值的数据(3-7)
–要注意下标的溢出问题
Dim a(1 to 10) as integer
……
a(11)=……
数组及其应用
•二维数组:有两组下标的数组
– 声明:dim 数组名(下标1,下标2)
– 例:
• Dim a(4,5) as integer
• Dim (-5 to 5 ,0 to 10) as single
– 二维数组可以理解为二维表格
dim a(1 to 4,1 to 5) as integer
a(1,1)
a(1,2)
a(1,3)
a(1,4)
a(1,5)
a(2,1)
a(2,2)
a(2,3)
a(2,4)
a(2,5)
a(3,1)
a(3,2)
a(3,3)
a(3,4)
a(3,5)
a(4,1)
a(4,2)
a(4,3)
a(4,4)
a(4,5)
– 使用循环语句操作二维数组(3-8、3-9)
数组及其应用
•多维数组
Dim a(1 to 3,1 to 3,1 to 4) as single
数组及其应用
•动态数组
–数组声明中的下标不能出现变量
–当编程之前无法预料数组的大小时,可以使用动态数组
–动态数组的大小和维数可以在程序运行中改变
数组及其应用
•动态数组
–定义
Dim 动态数组名() as 数据类型
• 注意
–括号是空的
–仅仅定义了数组名称和数据类型,初始状态下没有数据元素,没
有对数组进行重新定义之前不可用
–动态数组重定义
Redim 动态数组名(下标)
• 注意
–Redim语句中不再指明数据类型
–一个动态数组可以多次重定义
数组及其应用
Dim a() as integer
Redim a(7)
……
Redim a(2 to 6)
……
Redim a(2,3)
a(0)
0
a(7)
0
0
0
a(2)
0
0
a(6)
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
a(0,0)
a(2,3)
0
0
0
数组及其应用
•Preserve关键字
–如果不加上Preserve关键字,Redim语句会清除重定义
之前数组中的所有数据,而以默认值填充。
原动态数组a(4)
a(0)
1
Redim a(5)
2
3
4
5
a(0)
0
Redim a(2)
a(4)
a(5)
0
a(0)
0
0
a(2)
0
0
0
0
0
数组及其应用
•Preserve关键字
原动态数组a(4)
a(0)
1
Redim Preserve a(5)
2
3
4
5
a(0)
1
Redim Preserve a(2)
a(4)
a(5)
2
a(0)
1
3
a(2)
2
3
4
5
0
数组及其应用
•动态数组实例
–求若干学生成绩的平均值,人数由用户输入(3-10)
数组实例
1.互不相等的随机数的生成算法
2.排序算法
选择排序及其优化
冒泡排序及其优化
3.数组中元素的插入
4.数组的插入排序算法
5.数组中元素的删除
6.数据查找
顺序查找法
折半查找法
数组实例
7.回文判断
8.矩阵的转置
9.矩阵的乘法运算(P72例3-24)
10.矩阵鞍点的查找(所在行最小,同时是所在列最大的元素)
附:某些特殊矩阵元素的特征描述(上三角、下三角、对角线元素等)
11.杨辉三角
12.海盗船上的生存问题
感谢您的关注