高中技术05 算法与程序设计(VB)

算法与程序设计(VB)
【教学目标】
1. 掌握算法的基本概念及面向对象编程思想
2. 熟练掌握并运用VB基础编程知识和基本算法知识
*请下载课程需要的软件,对照知识点和练习题进行上机操作练习。
【知识归纳】
1. 算法基本概念
(1) 特征:有穷性、确定性、可行性、有输出
(2) 形式:自然语言、流程图、计算机语言
(3) 结构:顺序、分支(选择)、循环
2. 常用算法:枚举、解析、排序(冒泡排序、选择排序)、查找(顺序查找、对分查找)
3. 面向对象编程
(1) 对象:拥有状态和方法,是对客观事物的抽象
(2) 类:对相同性质的对象的抽象,一个对象是类的一个示例
(3) 事件:发生在一个对象上的事情,通常指用户在对象上激发的动作
*VB工具箱中每种控件都是一个类。对象是窗体和控件生成的工具。每个对象都有自己的属性、方法,并且可以响应外部事件。
4. VB可视化编程(窗体文件名后缀是.frm):
(1) 常用控件:Label(标签)、TextBox(文本框)、CommandButton、(按钮控件)、Image(图像框)、ListBox(列表框)、Timer(时钟)
(2) 常用属性:Name(名称)、Font(字体)、Text(文本)、Caption(标题)、BackColor(背景色)、Width(宽度)、Height(高度)、Left(左边距)、Top(顶边距)、Visible(可视)
(3) 改变控件属性的方法:对象名.属性名
5. VB程序设计(工程文件名后缀是.vbp):
(1) 常用数据类型:Integer(整型)、Long(长整型)、Single(实数)、Double(实数)、String(字符串,带"")、Boolean(逻辑型)、Date(日期型,带# #)
(2) 常量:Const 常量名=数值
(3) 变量:Dim 变量名 As 数据类型
(4) 变量命名:①字母、数字、下划线组成②只能字母开头③不能使用关键字、保留字
(5) 基本运算
(6) 语法规则:
注释语句:以单引号(')开头的一串文字,对附近的程序段进行简要的说明
赋值语句:变量名=表达式 或 对象名.属性名=表达式
选择语句:行If、块If
循环语句:For循环、While循环、Do While循环
(7) 函数
① 常用函数:绝对值Abs(x)、取整(取不大于x的最大整数) Int(x)、
截取x的整数部分Fix(x)、算术平方根Sqr(x)、字符转ASCII码Asc(x)、
ASCII码转字符Chr(x)、取值Val(x)、转字符串Str(x)、字符串长度Len(x)、
截取字符串Mid(x,n,k)、求随机数Rnd()
② 自定义函数:
Function函数名(参数表) As 类型名
语句块
End Function
【知识梳理】
1. 算法:对解题方法的精确而完整的描述,即解决问题的方法和步骤。
(1) 特征:
① 有穷性:一个算法必须保证它的执行步骤是有限的,即它是能终止的。一般来说,“有穷性” 也指在有限的或者合理的时间范围内完成全部操作。
② 确定性:算法中的每个步骤必须有确切的含义,不能有两义性。
③ 可行性:算法中的每一个步骤都要是足够简单、能实际操作的,而且能在有限的时间内完成。
④ 有0个或多个输入。算法常需要对数据进行处理,因此算法常常需要数据输入。如果初始数据已经存在,则不再需要从外部输入数据。
⑤ 有一个或多个输出:算法的目的是用来解决问题的,它必须向人们提供最终的结果。
(2) 表示方法:
① 自然语言:用自然语言描述算法通俗易懂,但其缺点是叙述比较繁琐冗长,容易出现“歧义性”。
② 流程图:一种直观易用,图形描述算法的方法,也是目前使用最广泛的一种方法。

③ 计算机语言:计算机语言表示算法必须严格遵守所使用的程序设计语言语法规则。
(3) 结构:
① 顺序结构:在算法流程中,执行完一个处理步骤Step1后,顺序执行紧跟着的下一个步骤Step2, 一直这样下去直至完成任务。

顺序结构流程图
② 选择结构也叫分支结构,就是判断条件是否成立,并选择某一条路径中的指令执行。

选择结构流程图
③ 循环结构就是首先判断条件是否成立,如果不成立则跳出循环体,如果条件成立则执行循环体内的指令,然后再次判断条件是否成立,如果条件成立则再次执行循环体内的指令,直至条件不成立跳出循环体为止。

当型循环(While循环)结构流程图

直到型循环(Do While循环)结构流程图
【典型例题】
1.某算法部分流程图如图所示。执行这部分流程,依次输入12、-5、29、18、7,则输出值是

A.12
B.-5
C.29
D.7
2.某算法的流程图如下图所示,它主要表示的是算法中的( )。

A、选择结构
B、顺序结构
C、循环结构
D、流程结构
2. 面向对象编程(Object Oriented Programming,简称OOP)
(1) 对象:拥有状态和方法,是对客观事物的抽象
(2) 类:对相同性质的对象的抽象,一个对象是类的一个示例
(3) 事件:发生在一个对象上的事情,通常指用户在对象上激发的动作
*VB工具箱中每种控件都是一个类。对象是窗体和控件生成的工具。每个对象都有自己的属性、方法,并且可以响应外部事件。
3. VB可视化编程(窗体文件名后缀是.frm):
(1) 常用控件


(2) 常用属性

*改变控件属性的方法:对象名.属性名
4. VB程序设计(工程文件名后缀是.vbp):
(1) 常用数据类型:Integer(整型)、Long(长整型)、Single(实数)、Double(实数)、String(字符串,带"")、Boolean(逻辑型)、Date(日期型,带# #)
(2) 常量:Const 常量名=数值
(3) 变量:Dim 变量名 As 数据类型
(4) 变量命名:①字母、数字、下划线组成②只能字母开头③不能使用关键字、保留字
(5) 基本运算

(6) 语法规则:
注释语句:以单引号(')开头的一串文字,对附近的程序段进行简要的说明
赋值语句:变量名=表达式 或 对象名.属性名=表达式
选择语句:
行If:
If 条件表达式 Then 语句1 Else 语句2 或 If 条件表达式 Then 语句
块If:
If 条件表达式1 Then
语句1
ElseIf 条件表达式2 Then
语句2
……
ElseIf 条件表达式n Then
语句n
Else
语句0
End If
循环语句:
For循环:
For 循环变量 = 初值 To 终值 Step 步长
语句块
Next 循环变量
While循环:
While 条件表达式
语句块
Wend
Do While循环:
Do While 条件表达式
语句块
Loop
(7) 函数
Function 函数名(参数表) As 类型名
语句块
End Function
【典型例题】
1.有如下VB程序段:
a(1) = 1: a(2) = 1
b(1) = 1: b(2) = 2
For i = 3 To 5
a(i) = a(i - 1) + a(i - 2)
b(i) = b(i - 1) + a(i)
Next i
执行该程序段后,数组元素b(5)的值为
A.12
B.8
C.5
D.5
2.有如下程序段:
For i=1 To 2
For j=1 To 7-i
If a(j)>a(j+1) Then
t=a(j):a(j)=a(j+1):a(j+1)=t
End If
Next j
Next i
数组元素a(1)到a(7)的值依次为"44,24,33,67,77,58,12",经过该程序段“加工”后,数组元素a(1)到a(5)的值依次为
A.12,24,44,33,58
B.12,24,33,67,77
C.24,44,44,58,12
D.44,24,33,58,12
5. 常用算法
(1) 枚举算法:例举出问题可能的解,并在例举过程中检验是不是问题真正解的算法。
(2) 解析算法:利用解析方法找到表示问题的前提条件和结果之间关系的数学表达式,并通过表达式计算实现问题求解的算法。
(3) 排序算法
① 冒泡排序:重复的顺序访问数组,依次比较相邻两个数据,如果他们顺序错误就把他们交换过来,直到没有数据需要交换为止。

升序排序n个数据的数组d:
For i=1 To n-1 'n个数排序共需进行n-1趟
For j=n To i+1 Step-1 '每一趟从后往前,相邻两数两两比较
If d(j)<d(j-1) Then '若满足条件则进行互换
Temp=d(j):d(j)=d(j-1):d(j-1)=temp
End If
Next j
Next i
*若要降序排列,只需将语句"If d(j)<d(j-1) Then"改为"If d(j)>d(j-1) Then"即可。
② 选择排序:从数组中找到最小(或最大)的一个数,使他与第一个数交换位置,然后从剩下的数中找到最小(或最大)的一个数与数组中的第二个数交换位置,以此类推,直到所有数排成一个有序数组为止。示例代码如下:
升序排序n个数据的数组d:
For i=1 To n-1 'n个排序共进行n-1趟排序
k=i '第i趟排序时,首先用k记录i
For j=i+1 To n 'k位置上的数依次与j位置上的数进行比较
If d(k)>d(j) Then k=j '若找到比k位置上更小的数,则更新k的值
Next j
If k<>i Then '若i位置上的数不是最小数,则和k位置上的数进行互换
temp=d(i):d(i)=d(k):d(k)=temp
End If
Next i
*若要降序排列,只需将语句" If d(k)>d(j) Then k=j "改为" If d(k)>d(j) Then k=j "即可。
(4) 查找算法
① 顺序查找:从第一个数开始,顺序逐个与给定值进行比较,若某个数和给定值相等,则查找成功,否则查找失败。
在数组d中查找值key:
For循环:
For i=1 to n
If d(i)=key Then '找到,做相应处理
Next i '若i>n表示未找到
Do - While循环:
i=1
Do While i<=n
If d(i)=key Then '找到,做相应处理
i=i+1
Loop'若i>n表示未找到
② 对分查找:在有序数据序列中,首先把要查找的数据与数组中间的元素进行比较,如果相等,则查找成功并退出查找;否则,根据数组元素的有序性,确定在数组前半部分还是后半部分查找,确定了查找范围后重复进行以上比较,直到找到或未找到为止。
*注意:
i. 数据序列必须有序。
ii. "未找到"是指在指定范围内起点大于终点时仍未找到该数据。
【典型例题】
有一组正整数,要求供对其中的素数进行升序排序。排序后素数在前,非素数在后。排序示例如下。

Const n = 8
Dim a(1 To n) As Integer
Private Sub Command1_Click()
Dim i As Integer, j As Integer, k As Integer, t As Integer
Dim flag As Boolean
'读取一组正整数,存储在数组a中,代码略
For i = 1 To n - 1
k = 1
If IsPrime(a(k)) Then flag = True Else flag = False
For j = i + 1 To n
If IsPime(a(j)) Then
If a(j) < a(k) Then
k = j
flag = True
End If
End If
Next j
If k <> i Then
t = a(k): a(k) = a(i): a(i) = t
End If
If Not flag Then Exit For 'Exit For表示退出循环
Next i
'依次输出排序后的数据。代码略
End Sub
Function IsPrime(m As Integer) As Boolean
'本函数判断m是否是素数:是素数返回值为True,不是素数返回值为False
'代码略
End Function
【课堂练习】
1. Dim i As Integer, j As Integer, k As String, n As Integer
n=3
List1.Clear
For i=1 To n
k=""
For j=1 To i
k=k+"*"
Next j
List1.AddItem k
Next i
该程序运行中,在列表框List1中显示的是( )

2.某数组的6个元素依次为“27,32,57,78,80,90”。若对该函数组进行顺序查找,其平均查找次数为(1+2+3+4+5+6)/6=7/2;若对该数组进行对分查找,其平均查找次数为( )
A.7/2
B.7/3
C.5/2
D.2
3.用VB编写一个字符串分行程序,功能如下:单击“分行”按钮Command1,将文本框Text1中的英文文本在列表框List1中分行显示(分行时单词不得跨行,每行字符尽可能多但不超过40个),并在标签Label1中输出总行数,运行效果如图所示。分行算法如下:
(1)将文本框中的字符串保存到变量s中;
(2)当s中字符个数超过40时,循环执行下列①②③步,否则跳转到(3):
①如果第41个字符不是英文字母,则分行位置p=40;否则,向左逐个查找,直至找到第一个非英文字母,将其位置作为分行位置p;
②截取s的前p个字符,作为新增行显示在列表框List1中,同时总行数加1;
③将s中未分行部分重新赋值给变量s。
(3)将s作为新增行显示在列表框List1中,同时总行数加1。

实现上述功能的VB程序如下,请在画线处填入合适代码。
Private Sub Command1_Click( )
Dim s As String,c As String
Dim r As Integer,total As Integer,p As Integer
total=0
s=__(1)__
Do While Len(s)>40
r=41
c=Mid(s,r,1)
If Not((c>="a" And c<="z")Or(c>="A" And c<="Z")) Then
p=40
Else
'从第41个字符开始向左找到第1个非英文字母,并将其位置值赋给p
Do While(c>="a" And c<="z")Or(c>="A"And c<="Z")
r=__(2)__
c=Mid(s,r,1)
Loop
p=r
End If
List1.AddItem Mid(s,1,p)
total=total+1
s=__(3)__
Loop
List1.AddItem s
total=total + 1
Label1.Caption="共"+Str(total)+"行"
End Sub
4. 某种编码以4位二进制码为一组,每组前两位表示方向,后两位表示距离。编写一个程序,将编码翻译成方向和距离,距离值为每组编码后两位二进制码转换为十进制数的值。具体功能如下:在文本框Text1中输入连续多组编码,单击“翻译”按钮Command1,结果显示在列表框List1中。程序运行界面如图所示。

(1)要使程序运行时,文本框Text1的Width属性值为2018,可在Form_Load事件过程中添加语句 (单选,填字母:A. Width=2018 / B.Text1. Width = 2018 / C. Width. Text1=2018)。
(2)实现上述功能的VB程序如下,请在划线处填入合适的代码。
Private Sub Command1_Click()
Dim s As String, c As String, d As String
Dim n As Integer, bl As Integer, b2 As Integer, v As Integer, i As Integer
s = Text1.Text: n = Len(s): i = 1
Do While i <= n
c = Mid(s, i, 2)
If c = "00" Then
d = "东"
ElseIf c = "01" Then
d = "南"
ElseIf c = "10" Then
d = "西"
Else
d = "北"
End If
b1 = Val(Mid(s, i + 2, 1))
b2 = Val(Mid(s, i + 3, 1))
v=____①____
List1.AddItem d + " " + Str(v)
____②____
Loop
End Sub
(3)若文本框Text1中输入的内容为“1111”,单击“翻译”按钮,列表框List1中显示的内容是________。