算法与程序设计 周少品
算法及算法的特征 算法是对解题方法的精确而完整的描述,即解决 问题的方法和步骤。 算法的特征: 有穷性。一个算法必须保证它的执行步骤是有限的, 即它是能终止的。 确定性。算法中的每个步骤必须有确切的含义,不能有 二义性。 能行性。算法中的每一个步骤都能实际操作的,而且能 在有限的时间内完成。 有0个或多个输入。算法常需要对数据进行处理,因此 算法常常需要数据输入。如果初始数据已经存在,则不 再需要从外部输入数据。 有一个或多个输出。算法的目的是用来解决问题的,它 必须向人们提供最终的结果。
算法的表示 自然语言 有序地用简洁的自然语言(汉语、英语等语言)和 数学符号来描述算法。其特点是通俗易懂,但容易 出现歧义。 流程图 用一些图框、流程线以及文字说明来表示算法,直 观、形象、容易理解。 程序设计语言 用计算机语言来表示算法,如Visual Basic。
流程图中各种框图的名称及作用 符号名称 图形 功能 开始/结束框 表示算法的开始与结束 输入/输出框 表示算法的输入/输出操作 处理框 表示算法的各种处理操作 判断框 表示算法的条件判断操作
算法的三种基本模式 顺序结构:算法的每个指令按先后顺序依次执行。 不会出现If、For…Next、do While…Loop语句 指令1 指令2 顺序模式 指令1 指令2 条件 选择模式 Y N Y N 条件 指令 循环模式 顺序结构:算法的每个指令按先后顺序依次执行。 不会出现If、For…Next、do While…Loop语句 选择(分支)结构:判断条件是否成立,并选择某一条路径中的指令执行 肯定会出现IF语句,但不会出现For…Next、do While…Loop语句。 循环结构:首先判断条件是否成立,如果不成立则跳出循环体,如果条件 成立则执行循环体内的指令,然后再次判断条件是否成立,如果条件成立 则再次执行循环体内的指令,直至条件不成立跳出循环体为止。 肯定会For…Next或do While…Loop语句
面向对象程序设计的几个概念 对象:客观存在的事物或概念 属性:描述对象的状态 方法:对属性进行操作和处理的方法 窗体、文本框、标签、命令按钮等都是对象 它由若干属性和若干方法组成 属性:描述对象的状态 如name、Caption、Text等属性 方法:对属性进行操作和处理的方法 类:对相同性质的对象的一种抽象 一个对象是类的一个“实例” 事件:在对象上激发的一种动作。 程序被打开、单击鼠标、键盘上按下一个键等。 事件处理过程:对象上一个或多个方法的执行
Visual Basic 6.0界面 工程窗口 事件 过程 代码窗口 属性窗口 控件工具箱 VB常用的事件过程 事件名 说明 Command1_Click 单击按钮事件 Form_Load 加载窗体事件 Timer1_Timer 定时器事件 工程窗口 事件 过程 工程名 标签 Label 文本框 TextBox 代码窗口 窗体名 命令按钮 CommandButton 对象类型 窗体 对象名 属性窗口 列表框 ListBox 控件工具箱 属性名 属性值 常用控件的属性 属性名 说明 备注 Name 对象变量的名称 所有控件共有 Caption 对象显示的标题 Text 对象显示的文本内容 文本框特有 对象
对象名 对象类型 属性名 属性值
基本数据类型 数据类型 关键字 取值范围 数值型 Integer -32768~32767范围内的整数 Long (整型) -32768~32767范围内的整数 Long (长整型) -2147483648~2147483647范围内的整数 Single (单精度实数型) 有效数字约6~7位的实数 Double (双精度实数型) 有效数字约14~15位的实数 字符串型 String 一段文字或符号 逻辑型 Boolean 真(True)或假(False) 日期型 Date 日期和时间 数值型
常量与变量 常量和变量指的是数据的存储区。 在程序执行过程中,常量的值是不变的,变量 的值是可以改变的。 常量与变量的命名规则: 以字母开头 由字母、数字和下划线等字符组成 不能使用VB的保留字(即VB专用的关键字) 例如:合法变量名:A_1 ABC A A1 非法变量名:1A 1_A A#1 true
3 常量与变量的声明 E 常量声明语句 变量的声明 变量的赋值 Const 常量名 As 数据类型 = 值 Const 常量名 = 值 例如:Const A1 As String = “173cm” Const 常量名 = 值 例如:Const B1 = 173 变量的声明 Dim 变量名 As 数据类型 例如:Dim E As Long 变量的赋值 例如:E = 3 在程序代码中,字符串型变量的值需要用双引号进行表示。 例如A = True和B = "True" 变量A的数据类型为逻辑型 变量B为字符串型。 例如C = 123和D = "123“ 变量C的数据类型为数值型 变量D为字符串型。 E 3
常用函数(学考部分) 求x的算术平方根 36 1. Abs(-3.6) * Sqr(100)的值是____________________。 函数名 函数的功能 Val(x) 数字字符串x转换为数值 Str(x) 数值x转换为字符串 Int(x) 求不大于x的最大整数 Abs(x) 求x的绝对值 Sqr(x) 求x的算术平方根 Len(x) 计算字符串x的长度 Mid(x,n,k) 取字符串x中第n个字符起长度为k的子串 Rnd()或Rnd 产生一个大于等于0且小于1的随机数 36 1. Abs(-3.6) * Sqr(100)的值是____________________。 Int(Rnd * 6 + 1) 2. 随机产生一个1-6之间的整数的VB表达式是____________________ 。
常用函数(选考部分) e=2.71828 函数名 函数的功能 Fix(x) 截掉数值型数字的小数部分 Asc(x) 获得字符的ASCII码值 Chr(x) 将ASCII码值转换为字符 Exp(x) 求e的x次方(即ex) Log(x) 求以e为底的x的对数(即Logex) Sin(x) 求x的正弦值 Cos(x) 求x的余弦值 Tan(x) 求x的正切值 e=2.71828
自定义函数 注意:函数必须有返回值,且通过对函数名的赋值来完成。 赋值方法:函数名=表达式 闰年判断的VB程序 Private Sub Command1_Click() Dim yyyy As Integer yyyy = Val(Text1.Text) Label2.Caption = L (yyyy) End Sub Function L (y As Integer) As String If y Mod 4 = 0 And y Mod 100 <> 0 Or y Mod 400 = 0 Then L = "闰年,366天" Else L = "平年,365天" End If End Function 注意:函数必须有返回值,且通过对函数名的赋值来完成。 赋值方法:函数名=表达式
基本运算符 √ “School” √ 1.下列运算结果中,值最大的是 A.3\4 B.3/4 C.4 mod 3 D.3 mod 4 运算名称 运算符 优先级 示例 算术 乘幂 ^ 1 7 ^ 2计算结果为49 取负 - 2 -7表示负7 乘法 * 3 7 * 2计算结果为14 实数除法 / 7 / 2计算结果为3.5 整数除法 \ 4 7 \ 2计算结果为3 求余数 Mod 5 7 mod 2计算结果为1 加法 + 6 7 + 2计算结果为9 减法 7 - 2计算结果为5 字符连接 + 或 & "7“ + "2"计算结果"72" 关系 相等 = 7 7 = 2结果为False 不相等 <> 7 <> 2结果为True 小于 < 7 < 2结果为False 大于 > 7 > 2结果为True 小于等于 <= 7 <= 2结果为False 大于等于 >= 7 >= 2结果为True 逻辑 非 Not 8 Not(7 > 2) 结果为False 与 And 9 (7>2) and (7<2) 结果为False 或 Or 10 (7>2) or (7<2) 结果为True 1.下列运算结果中,值最大的是 A.3\4 B.3/4 C.4 mod 3 D.3 mod 4 √ 2.如下程序段运行后,变量s的值为 m = "sch" n = Mid("tools", 2, 3) s = m + n “School” 3.如果a=3,b=4,c=6,那么下 列表达式值为真的是 A.(a>b) And (b>c) B.(a>c) And (b>a) C.(a>b) Or (b>c) D.(a>c) Or (b>a) √
表达式 (-b + Sqr(b ^ 2 – 4 * a * c)) / (2 * a) 4 True 表达式由变量、常量、运算符、函数和圆括号等按一定 的规则组合而成的。 表达式的运算过程中,运算级别最高的先执行;同级别 自左向右顺序执行;遇到括号,先执行括号内的运算。 VB中只使用一种括号“()”,它可以多次嵌套,按由内 向外的顺序执行。 【练习】写出 −𝑏+ 𝑏 2 −4𝑎𝑐 2𝑎 的VB表达式 【练习】表达式3 + 27 \ 2 mod 3 * 2的值是______ 【练习】已知A = 5,B = 4,C = 3,则表达式 A>B And C<A Or Not C>B And A<C的值是____ (-b + Sqr(b ^ 2 – 4 * a * c)) / (2 * a) 4 True
赋值语句的格式 变量名 = 表达式 对象名.属性名=表达式 两条语句写在同一行用 : 分开 在语句后可以用 ‘开头进行注释 例1:a = 3 b = b + 1 d = (-b + Sqr(b ^ 2 – 4 * a * c)) / (2 * a) 例2:k = Text1.Text h = Text1.Text + Text2.Text 对象名.属性名=表达式 例:Text1.Text = d Label1.Caption = “确定” 两条语句写在同一行用 : 分开 在语句后可以用 ‘开头进行注释
54 54 8 3 有如下VB程序段: a = 12 : b = 54 : a = b : b = a 该程序段执行后,变量a、b的值分别是 x = 3 : y = 8 : x = x + y : y = x – y : x = x – y 该程序段执行后,变量x、y的值分别是 两个数的交换:z = x : x = y : y = z 开始 a←12 b←54 a←b b←a 输出a,b 结束 54 54 开始 x←3 y←8 x←x+y y←x-y x←x-y 输出x,y 结束 8 3
选择结构 (书本P76) If <条件> Then <语句块1> Else <语句块2> End if 条件? Y N If <条件> Then <语句块> End if 行IF语句:If <条件> Then <语句块> If <条件> Then <语句块1> Else <语句块2> End if 行If语句: 1.必须在一行上写完,不得换行 2.不能写End if 语句块1 语句块2 条件? Y N 行IF语句:If <条件> Then <语句块1> Else <语句块2> If <条件1> Then <语句块1> ElseIf <条件2> Then <语句块2> Else <语句块3> End if 语句块1 条件1? Y N 条件2? 语句块2 语句块3
已知三角形的三边长a、b、c,求三角形面积。 a = Val(Text1.Text) b = Val(Text2.Text) c = Val(Text3.Text) If a + b > c and a + c > b and b + c > a then p = (a + b + c) / 2 s = Sqr(p * (p - a) * (p - b) * (p - c)) Text4.Text = Str(s) End If a = Val(Text1.Text) b = Val(Text2.Text) c = Val(Text3.Text) If a + b > c and a + c > b and b + c > a then p = (a + b + c) / 2 s = Sqr(p * (p - a) * (p - b) * (p - c)) Text4.Text = Str(s) Else Text4.Text = “三角形不成立!” End If
Private Sub Command1_Click() a=Val(Text1.Text) If a mod 2=0 Then Text2.Text=“偶数” Else Text2.Text=“奇数” End If End sub 开始 输入数字a Y A mod 2 = 0 ? N A 为偶数 A 为奇数 结束 Private Sub Command1_Click() a=Val(Text1.Text) If a mod 2=0 Then Text2.Text=“偶数” Else Text2.Text=“奇数” End sub VB程序
某商场进行年末促销活动,买200元以上打9折,400 元以上8折,800元以上6 某商场进行年末促销活动,买200元以上打9折,400 元以上8折,800元以上6.5折。某女士买了一件价值 N元的皮衣,请帮她计算实际需要付多少钱! If Buy>=200 and Buy<400 Then Pay=Buy*0.9 ElseIf Buy>=400 and Buy<800 Then Pay=Buy*0.8 ElseIf Buy >= 800 then Pay=Buy*0.65 Else Pay=Buy End if
在列表框上显示1000个字母a List1.AddItem "a" … 1000个 开始 结束 List1.AddItem “a” 开始 C ← 1 Y C>1000? N List1.addItem “a” C ← C + 1 结束
For C = 1 to 1000 step 1 List1.addItem “a” Next C 循环变量 初值 终值 步长(增量) 开始 C>1000? C ← 1 结束 N Y List1.addItem “a” C ← C + 1 循环变量 初值 终值 步长(增量) For C = 1 to 1000 step 1 List1.addItem “a” Next C 循环变量
显示1至1000之间所有的奇数 For C = ① to ② step ③ ④ Next C List1.addItem C Next C 当Step的值为1时, 可以省略不写 For C = 1 to 1000 step 1 if C Mod 2 = 1 then List1.addItem C Next C 显示1至1000之间所有3的倍数 For C = 3 to 1000 step 3 List1.addItem C Next C For C = ① to ② step ③ ④ Next C For C = 1 to 1000 step 1 if C Mod 3 = 0 then List1.addItem C Next C
打印1至1000之间所有3的倍数 升序 For C = 1 to 1000 step 1 If C Mod 3 = 0 then List1.addItem C End If Next C 降序 For C = 1000 to 1 step -1 If C Mod 3 = 0 then List1.addItem C End If Next C
那么如何计算S=13+33+…+93呢? 思考:计算S=1+2+3+…+100的结果 S = 0 S = 0 程序 思路: S=0 i=1 S=S+1=1 i=2 S=S+2=3 i=3 S=S+3=6 i=4 S=S+4=10 …… …… i=100 S=S+100=5050 S = 0 For i = ① to ② Step ③ ④ Next i Text2.Text=Str(S) S = 0 For i = 1 to 100 Step 1 S = S + i Next i Text2.Text=Str(S) 那么如何计算S=13+33+…+93呢?
读程序写结果 k=0 For g=10 To 19 Step 3 k=k+1 Next g X=1 Text1.Text=Str(k) ① X=1 Y=1 For i=1 To 3 F=X+Y X=Y Y=F Next i Text1.Text=Str(F) ③ 4 x = 2 For y = 1 To 8 Step 3 x = x + y Next y Text1.Text=Str(x) ② ② 5 14
在屏幕上打印1000个a的字母序列 For C = 1 to 1000 step 1 List1.addItem “a” Next C 开始 C = 1 Y C>1000? C = 1 Do While C <= 1000 List1.addItem “a” C = C + 1 Loop N List1.addItem “a” Print “a” C = C + 1 结束
Do while 条件表达式 Loop [执行过程] 循环体 Loop [执行过程] 先计算条件表达式的值,如果值为True,则 执行一次循环体中的语句块,遇到Loop语句 后,再次计算条件表达式的值,若仍为True, 继续执行循环体中的语句块,如此不断重复, 直到条件表达式的值为False时,才终止Do 语句的执行。
T = 0 : n = 0 Do While T < 100 n = n + 1 T = T + n Loop 已知T=1+2+3+…+N,求T>100的最小值, 并输出N的值。 T = 0 : n = 0 Do While T < 100 n = n + 1 T = T + n Loop Label1.Caption = Str(T) Label2.Caption = Str(n)
读程序写结果 K = 0 : X=0 Do While K < 20 If K mod 5 = 0 Then X = X + K K=K+1 Loop Text1.Text=Str(X)
一张单据上有一个5位数的编码(25??6),其百位数和十位数处已经变得模糊不清,但是知道这个数是67的倍数,请找出所有符合条件的5位数。 For x = 25006 To 25996 step 10 If _____________ Then List1.AddItem Str(x) End If Next x 25??6 x Mod 67 = 0 For x = 0 to 99 z = _____________ If_____________Then List1.AddItem Str(z) End If Next i 枚举算法 25006 + x * 10 把问题所有的可能解一一地罗列出来,并对每一个可能解进行判断,以确定这个可能解是否是问题的真正解 z Mod 67 = 0
解析算法 练习:已知三角 形的三条边长a、 b、c分别为5,7, 8,求该三角形面 积。 Private Sub Command1_Click() Dim a,b,c,p,s As Single a=Val(Text1.Text) b=Val(Text2.Text) c=Val(Text3.Text) If a+b>c and b+c>a and a+c>b Then p=(a+b+c)/2 s=Sqr(p*(p-a)*(p-b)*(p-c)) Text4.Text=Str(s) Else Text4.Text=“三角形不成立!” End if End Sub 解析算法 用解析的方法找出表示问题的前提条件与所求结果之间关系的数学表达式,并通过表达式的计算来实现问题求解