null第四章第四章VB算法基础及基本语句主要内容主要内容三种程序结构(顺序,分支,循环)
赋值语句
条件分支语句(共五种)笔记、作业、实验null求两个自然数的最大公约数的算法
(欧几里德算法)
S1.输入两个自然数M、N
S2. 求M除以N的余数R
S3.使M=N,即用N代换M
S4.使N=R,即用R代换N
S5.若R≠0,则重复执行S2、S3、S4(循环),否则转S6
S6.输出M ,M即为M和N的最大公约数null基本算法结构图顺序分支循环null4.2.1 赋值语句1、形式
Var=<表达式>
如:s=“This is a flower”
Number%=72
Text.font.size=12
Y=(a+b)/2
作用: 将表达式的值赋值给变量名。
一般用于给变量赋值或对控件设定属性值。null2.不同数据类型数据的赋值
当表达式的类型与变量的类型不一致时,强制转换成左边的精度,如
iA% = 10 / 3 iA中的结果为3
注意:虽然赋值号与关系运算符等于号都用“=”表示,VB系统会根据所处的位置自动判断是何种意义的符号。
注意点:P59-604.2.2 InputBox函数4.2.2 InputBox函数InputBox 函数
作用:
用来接受用户通过键盘输入的数据。
形式:
V=InputBox(Prompt[,Title][,Default] [,x,y][,helpfile,context])
其中:提示: 提示信息;标题: 对话框标题;缺省:输入区缺省值
函数返回字符类型。
举例:下页
nullPrivate Sub Form_Click()
PassWord = InputBox("输入你的口令:", "程序示例")
If PassWord = "123456" Then
Print "OK!"
Else
Print "Error!"
End If
End Sub函数返回值4.2.3 MsgBox函数4.2.3 MsgBox函数作用:
MsgBox函数用于向用户发布提示信息,并要求用户作出必要的响应。
形式是:
MsgBox(Prompt[,button][,title] [,helpfile,context])P72nullbutton:
这是一个由4个数值常量组成的式子,形式为
c1+c2+c3+c4,null Print MsgBox("非法数据!", vbOKOnly + 48 + 0, "提示信息") Print MsgBox(“请输入X值!”,16+ vbOKOnly, ”ex4_6")MsgBox函数根据用户选择单击的按钮而返回不同的值:MsgBox函数根据用户选择单击的按钮而返回不同的值:参见P63 表4-3。顺序结构顺序结构4.3分支结构和分支结构语句4.3分支结构和分支结构语句结构示意图null1、IF 条件 THEN 一条语句
2、if 条件 THEN
语句组(多条语句)
end if
3、if 条件 then
语句组1
else
语句组2
end if4、if 条件1 then
语句组1
elseif 条件2 then
语句组2
elseif 条件3 then
语句组3
……
[else
语句组n]
end ifnull
1. If…Then语句(单分支结构)
If <表达式> Then
语句块
End If
或 If <表达式> Then <语句> 例:已知两个数x和y,比较它们的大小,
使得x大于y.
If x
Then
<语句块1>
Else
<语句块2>
End If
If <表达式> Then <语句1> Else <语句2>
计算分段函数:单分支结构实现: y=cos(x)-x^3+3*x
If x<>0 Then y=sin(x)+sqr (x*x+1) 双分支结构实现: If x<>0 Then
y=sin(x)+sqr (x*x+1)
Else
y=cos(x)-x^3+3*x
End Ifnull3. If…Then…ElseIf语句(多分支结构)
形式:
If <表达式1> Then
<语句块1>
ElseIf <表达式2>Then
<语句块2>
…
[Else
语句块 n+1 ]
End IfnullPrivate Sub Command1_Click()
Dim x As Integer
x = Val(Text1.Text)
If x < 1 Then
Text2.Text = “小于1的数”
ElseIf x <= 10 Then
Text2.Text = “1到10之间”
Else
Text2.Text =”大于10的数”
End If
End Subnull例已知变量strC中存放了一个字符,判断该字符是字母字符、数字字符还是其他字符。
用多分支结构实现:
不管有几个分支,依次判断,当某条件满足,执行相应的语句,其余分支不再执行;若条件都不满足,且有Else子句,则执行该语句块,否则什么也不执行。.
ElseIf不能写成 Else If。If Ucase(strC) >="A" And Ucase (strC) <="Z" Then
Print strC + "是字母字符"
ElseIf strC >="0" And strC <="9" Then Print strC + "是数字字符"
Else
Print strC + "其他字符"
End Ifnull4.If语句的嵌套
If语句的嵌套是指If或Else后面的语句块中又包含If语句。
形式如下:
If <表达式1> Then
If <表达式11> Then
…
End If
…
End If 例:已知x,y,z三个数,使得x>y>z
用一个IF语句和一个嵌套的IF语句实现 If x20;Is<="P"等。
测试项还可以是这三中形式的组合,如
4, 7 To 9, Is > 30null表达式列表1……语句块1……语句块n+1……表达式列表2表达式列表n语句块2语句块nTTTFFFnullPrivate Sub Command1_Click()
Dim x As Integer
x = Val(text1.Text)
Select Case x
Case Is < 1
Text2.text = "这是小于1的数"
Case 1 To 10
Text2.Text = "这是1到10之间的数"
Case Else
Text2.Text = "这是大于10的数"
End Select
End Subnull例变量strC中存放了一个字符,判断该字符类型。
在前面例中用多分支结构实现:
If Ucase(strC) >="A" And Ucase (strC) <="Z" Then Print strC + "是字母字符"
ElseIf strC >="0" And strC <="9" Then
Print strC + "是数字字符"
Else
Print strC + "其他字符"
End If
用Select Case语句实现:
Select Case strC
Case "a" To "z","A" To "Z"
Print strC + "是字母字符"
Case "0" To "9"
Print strC + "是数字字符"
Case Else
Print strC + "其他字符"
End Selectnull Dim x As Single, y As Single
x = Val(Text1.Text)
If x >= 0 Then
y = 1 + x
Else
y = 1 - 2 * x
EndIf
Text2.Text = y输入x,计算y的值。其中
1+x (x≥0)
Y =
1-2x (x<0)思考题:null1、学校对学习成绩优良的学生进行奖励,获奖的条件如下:
(1)所考5门课的成绩都在88分以上。
(2)前3门(主课)的成绩都在95分以上,其他两门(非主课)的成绩都在80分以上。
输入某学生5门课的成绩s1、s2、s3、s4、s5,判断他是否能够获奖。null2、利用输入框函数输入3个不同的数,选出其中最大的数。null 3、铁路托运行李,从甲地到乙地,规定每张客票托运费计算方法是行李重量不超过50kg时,0.25元/kg,超过50kg而不超过100kg时,其超过部分按0.35元/kg收费,超过100kg时,其超过部分按0.45元/kg收费。编写程序,输入行李重量,计算并输出托运的费用。 设行李重量为w kg,应付运费为x 元,则运费公式为:
0.25*w (w<=50)
X= 0.25*50+0.35*(w-50) (50100)null 4、某百货公司为了促销,采用购物打折扣的优惠办法:每位顾客一次购物
(1)在1000元以上者,按九五折优惠;
(2)在2000元以上者,按九折优惠;
(3)在3000元以上者,按八五折优惠;
(4)在5000元以上者,按八折优惠;
编写程序,输入购物款数,计算并输出优惠价。null 5、已知两个变量x和y,比较它们的大小,使得x中的值大于y,下面那个方法能实现?
If x 0 And y >0 Then
Print "在第一象限"
ElseIf x < 0 And y > 0 Then
Print "在第二象限"
ElseIf x < 0 And y < 0 Then
Print "在第三象限"
ElseIf x > 0 And y <0 Then
Print "在第四象限"
End If 方法二
Select Case x,y
Case x > 0 And y > 0
Print "在第一象限"
Case x < 0 And y > 0
Print "在第二象限"
Case x < 0 And y < 0
Print "在第三象限"
Case x > 0 And y <0
Print "在第四象限"
End Select哪个能实现,哪个不能实现?方法二代码错误:
1. Select Case 后不能出现多个变量;
2. Case后不能出现变量及有关运算符。null习题:1.下面程序运行后输出的结果是_____
X=Int(Rnd)+3
If x^2>8 then y=x^2+1
If x^2=9 then y= x^2-2
If x^2<8 then y=x^3
Print ynull2.下面的程序段是检查输入的算术表达式中圆括号是否配对,并显示相应的结果。本程序在文本框输入表达式,边输入,边统计,以输入回车符作为表达式输入结束,然后显示结果。nullDim count1%
Private Sub Text1_KeyPress(KeyAscii As Integer)
If __1__=“(” Then
count1=count1+1
ElseIf__2__=“)” Then
__3__
End If
If KeyAscii=13 Then
If __4__ Then
Print “左右括号配对”
ElseIf __5__ Then
Print “左括号多于右括号”;count1;”个”
Else
Print “右括号多于左括号”;-count1;”个”
End If
End If
End Sub四、循环结构及循环语句四、循环结构及循环语句1、DO-LOOP语句及其对应的四种循环结构
注意:
先判后做
先做后判
保证:不多做一次,不少做一次!P68—P69nullnull Do While 条件 Do
... ...
[Exit Do] [Exit Do]
... ...
Loop Loop While 条件条件为TRUE——循环;
条件为FALSE——退出循环nullDo Do Until 条件
... ...
[Exit Do] [Exit Do]
... …
Loop Until 条件 Loop 条件为FALSE——循环;
条件为TRUE——退出循环null 在Do语句和Loop语句之间的语句即为循环体语句。 Exit Do语句时,就会直接退出本层循环,转而执行Loop语句的下一条语句。
此语句最常用的形式是与If-Then语句相结合,即:
If e Then Exit Donull求两个自然数的最大公约数的算法
(欧几里德算法)
S1.输入两个自然数M、N
S2. 求M除以N的余数R
S3.使M=N,即用N代换M
S4.使N=R,即用R代换N
S5.若R≠0,则重复执行S2、S3、S4(循环),否则转S6
S6.输出M ,M即为M和N的最大公约数nullnullPrivate Sub Command1_Click()
Dim m as long, n as long, r As Long
m = Val(Text1.Text) ‘取数据M
n = Val(Text2.Text) ‘取数据N
If m <> Int(m) or m < 1 or n <> Int(n) or n < 1 Then
Text3.Text = "数据错误!"
Else
If m < n Then t = m: m = n: n = t
Do ‘求最大公约数
r = m Mod n
m = n
n = r
Loop Until r = 0
Text3.Text = CStr(m) ‘输出最大公约数
End If
End Sub判断数据是否合法nullr=1
Do until r=0
r = m Mod n
m = n
n = r
Loop 求最大公约数Do
r = m Mod n
m = n
n = r
Loop Until r = 0r=1
Do while r< >0
r = m Mod n
m = n
n = r
Loop Do
r = m Mod n
m = n
n = r
Loop while r< >0 1234while r< >0while r< >0null例: 我国有13亿人口,按人口年增长0.8%计算,多少年后我国人口超过26亿。
Private Sub Command1_Click()
x = 13
n = 0
Do While x < 26
x = x * 1.008
n = n + 1
Loop
Print n, x
End Sub
2、计数型循环语句2、计数型循环语句一般形式是:
For v = e1 To e2 [Step e3]
...
[Exit For]
...
Next v
v是循环控制变量,应为整型或单精度型;循环体e1、e2和e3是控制循环的参数。e1、e2和e3是控制循环的参数。e1为初值、e2为终值、e3为步长。
当e3=1时,step e3部分可以省略。nullFor-Next循环结构语句的执行方式计算e1、e2和e3的值(如果e1、e2、e3为算术表达式);
给v赋初值;
进行判别:判别v是否超过e2,超过则退出循环,执行Next下一语句;
执行Next语句,系统执行下述操作:
v增加一个步长,即执行v=v+e3,转而执行判别操作。
For-Next循环的正常循环次数用下式计算:
Int((e2-e1)/e3)+1nullFor-Next 示例1、用For 语句写程序,在一行上输出60个 “ * ” 号……
For i = 1 To 60
Print "*";
Next I
……
nullPrivate Sub Form_Click()
For i = 1 To 10 Step 2
Print i;
Next i
Print "i="; i
End Sub注意:
Print I 与 Print I;
的区别!null例 计算1~100的奇数和,程序段如下:
Dim i %, s%
S=0
For i = 1 To 100 step 2
s = s + i
Next i
nullFor-Next 示例1、求N! (N为自然数)由阶乘定义可知:N!=1*2*3* ······*(N-2)*(N-1)*N =(N-1)!*Nk = 1
For i = 1 To n
k = k * i
Next i
k = 1
For i = n To 1 step-1
k = k * i
Next i
nullFor-Next 示例 控制变量的“初值”、“终值”和 “步长” 在进入For循环时,就被系统 “记住”了,并不会因为循环体内对它的修改而影响循环执行的次数。例如:
……
x = 2: y = 8: z = 3
For a = x To y Step z
x = 1: y = 11: z = 2
Print a;
Next a
……输出结果是:2 5 8循环体内虽然对x,y,z
重新赋值,但程序仍
按原来设定的初值、
终值和步长去运行nullFor I=1 to 10 step 2
print I;
next iI=1
do
print I;
I=I+2
loop until I>10分析:
两段程序的功能一样?
两种语句的特点?
那种较为合适?null例: 改变循环控制变量对循环的影响。
Private Sub Command1_Click()
j = 0
For i = 1 To 20 Step 2
i = i + 3
j = j + 1
Print "第"; j; "次循环i="; i
Next i
Print "退出循环后i="; i
End Sub
正常情况:i=1,3,5,7,9,11,13,15,17,19
现在:i=4,9,14,19 在循环体内对循环控制变量可多次引用;但最好不要对其赋值,否则影响原来的循环控制规律。nullA=1:b=0
Do while a<=5
b=b+a*a
a=a+1
Loop
Print a,bDim ch as string,I as integer
Ch=“DEF”
For I=1 to len(ch)
ch=mid(ch,2*I-1,1) & left(ch,len(ch))
print ch
Next i关于循环嵌套关于循环嵌套一个循环体内又包含了一个完整的循环结构称为循环的嵌套.例:九九乘法表的实现。nullPrivate Sub Command1_Click()
For i = 1 To 9
For j = 1 To 9
se = i & "×" & j & "=" & i * j
Picture1.Print Tab((j - 1) * 9 + 1); se;
Next j
Picture1.Print
Next i
End Sub
执行本程序, 图片框上将显示九九乘法表。换行!作用?null For ii =1 To 10
For jj=1 To 20
…
Next ii
Next jj For ii =1 To 10
For ii=1 To 20
…
Next ii
Next ii For ii =1 To 10
For jj=1 To 20
…
Next jj
Next ii For ii =1 To 10
…
Next ii
For ii =1 To 10
…
Next ii 对于循环的嵌套,要注意以下事项:
内循环变量与外循环变量不能同名;
外循环必须完全包含内循环,不能交叉;
不能从循环体外转向循环体内,反之则可以。
正确 错误3、设计循环程序的关键3、设计循环程序的关键需要解决的问题有规律?哪个变?怎么变?
确定控制变量;
了解两种循环语句的功能与特点,
选择合适的循环语句。
保证不多做一次,不少做一次
尝试编写循环体语句
静态走一遍;结果?
调试….最后正确。null其他辅助控制语句
1. Go To 语句
形式: Go To {标号|行号}
作用:无条件地转移到标号或行号指定的那行语句.
标号是一个字符序列,行号是一个数字序列.
2.Exit语句
多种形式: Exit For、Exit Do、Exit Sub、Exit Function等。
作用:退出某种控制结构的执行。
3. End语句
多种形式: End、 End If、 End Select、 End With、 End Type、 End Sub、 End Function、
作用:End结束一个程序的运行;其余表示某个结构的结束,与对应的结构语句配对出现。4、举例4、举例Private Sub Command1_Click()
Dim intranum, i, j, a As Integer
Randomize ‘随机化语句
For i = 1 To 1000
intranum = Int(100 * Rnd) + 1 ‘产生1~100间随机数
a = 0
For j = 1 To 10000 ‘延时
a = a + 1
Next j
Text1.Text = CStr(intranum)
Text1.Refresh ‘文本框刷新
Next i
Text1.Text = CStr(intranum)
End Sub4.5 常用算法4.5 常用算法算法是对某个问题求解过程的描述
1. 累加、连乘 1~100的5或7的倍数的和
Sum = 0
For i = 1 To 100
If i Mod 5 = 0 Or i Mod 7 = 0 Then
Sum = Sum + i
End If
Next i
Print Sum 3~10的乘积
t = 1
For i =3 To 10
t = t * i
Next i
Print t思考:若把循环体前面置各变量初值的语句放在循环体内,程序运行时会产生什么情况?null例:求自然对数e的近似值,要求其误差小于0.00001,近似公式为:
该例题涉及两个问题:
(1)用循环结构求级数和的问题。本例根据某项值的精度来控制循环的结束与否。
(2)累加:e=e+t 循环体外对累加和的变量清零 e=0
连乘:n=n*i 循环体外对连乘积变量置1 n=1
Private Sub Form_Click()
Dim i%,n&, t!, e!
e = 0 : n = 1 ‘ e存放累加和、n存放阶乘
i = 0 : t = 1 ‘ i计数器、t第i项的值
Do While t > 0.00001
e = e + t : i = i + 1 ‘ 累加、连乘
n = n * i : t = 1 / n
Loop
Print "计算了 "; i; " 项的和是 "; e
End Subnull用以下公式计算sin(x)的值。当最后一项的绝对值小于10-7时,停止计算。X的值由键盘输入。分析:设变量 t 用于存放中间项的计算结果,并且当第n项值< 10-7时结束计算,即循环结束条件为t的绝对值<1E-7 ;可以把算法描述
为:再看和式中第 n项 tn 的值与第 n-1项的递推关系:t=第1项值 : s=t : n=1
Do Until Abs(t)<1E-7
n=n+1
t=第n项值
s=s+t
Loop null2. 求素数
素数是一个大于2,且不能被1和本身以外的整数整除的整数。
判别某数m是否为素数最简单的方法是:
对于m 从 i=2,3,…,m-1判别m能否被i整除,只要有一个能整除,m不是素数,否则m是素数。
求100以内素数的代码: Private Sub Command1_Click() Dim I as integer , m as integer , flag as boolean
For m = 2 To 100 flag=true
For i = 2 To m - 1
If (m Mod i) = 0 Then flag=false
Next i
If flag then Print m
Next m
End Subnull3.穷举法
“穷举法”也称为“枚举法”或“试凑法”,即将可能出现的各种情况一一测试,判断是否满足条件,一般采用循环来实现。
百元买百鸡问题。假定小鸡每只5角,公鸡每只2元,母鸡每只3元。现在有100元钱要求买100只鸡,编程列出所有可能的购鸡
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
。
设母鸡、公鸡、小鸡各为x、y、z只,根据题目要求,列出方程为:
x+y+z=100
3x+2y+0.5z=100
三个未知数,两个方程,此题有若干个解。
解决此类问题采用“试凑法”,把每一种情况都考虑到。
方法一:最简单三个未知数利用三重循环来实现。
方法二:从三个未知数的关系,利用两重循环来实现。
nullPrivate Sub Form_Click()
dim x as integer, y as integer, z as integer
End Sub改进:
For x=0 to 33
for y=0 to 50
if 3*x+2*y+0.5*(100-x-y)=100 then
print x,y,100-x-y
endif
next y
Next xfor x=0 to 100
for y=0 to 100
for z=0 to 100
if x+y+z=100 and 3*x+2*y+0.5*z=100 then
print x,y,z
endif
next z
next y
next x
null4.递推法
“递推法”又称为“迭代法”,其基本思想是把一个复杂的计算过程转化为简单过程的多次重复。每次重复都从旧值的基础上递推出新值,并由新值代替旧值。
猴子吃桃子。小猴在某天摘桃若干个,当天吃掉一半多一个;第二天吃了剩下的桃子的一半多一个;以后每天都吃尚存桃子的一半多一个,到第7天要吃时只剩下一个,问小猴共摘下了多少个桃子?
分析:这是一个“递推”问题,先从最后一天推出倒数第二天的桃子,再从倒数第二天的桃子推出倒数第三天的桃子……。设第n天的桃子为xn,那么它是前一天的桃子数的xn-1 的一半减1,即xn =( xn-1 +1)×2
nullPrivate Sub Form_Click()
dim n as integer, I as integer
x=1
print “第7天的桃子数为:1只”
for I=6 to 1 step –1
x=(x+1)*2
print “第”;I;”天的桃子数为:”;x;”只”
next i
End Subnull5.最小、最大值
在若干个数中求最大值,一般先假设一个较小的数为最大值的初值,若无法估计较小的值,则取第一个数为最大值的初值;然后将每一个数与最大值比较,若该数大于最大值,将该数替换为最大值;依次逐一比较。
例 随机产生10个100~200之间的数,求最大值。 Private Sub Command1_Click()
Max = 100
For i = 1 To 10
x = Int(Rnd * 101 + 100)
Print x;
If x > Max Then Max = x
Next i
Print
Print "最大值="; Max
End Subnull 实际应用,求最短残料。
有一根长度为321米的钢材料,要将它截取成两种规格a、b的长度分别为17米和27米的短料,每种至少1段,问分隔成a,b各多少段后,剩余的残料r最少?
分析,该题利用“试凑法”通过二重循环求残料r的最小值正数,残料不可能是负数。程序如下:Private Sub Command1_Click()
Dim a%, b%, r!, ia%, ib%
r = 321 ‘ 最小值初值取钢材料的长度
For b = 1 To 321 \ 27 ‘ b最多的段数
For a = 1 To 321 \ 17 ‘ a最多的段数
t = 321 - b * 27 - a * 17 ‘ 当前的残料
If t > 0 And t < r Then
r = t ‘ 求最短的残料
ia = a ‘ 最短残料时a的段数
ib = b ‘ 最短残料时b的段数
End If
Next a
Next b
Print ia, ib, r
End Subnull二级真题练习 阅读下面程序,单击窗体后在窗体上显示的内容是________,若将程序中的A语句与B语句的位置互换,再次执行程序,显示内容是________。 (02春)
Option Explicit
Private Sub Form_Click()
Dim sum As Integer, i As Integer
For i = 7 To 4 Step -1
Select Case i
Case 4, 7
sum = sum + i ‘A语句
Case 3, 5
sum = sum + 2 ‘B语句
Case Else
sum = sum + 1
End Select
Next i
Print "sum="; sum
End Subnull执行以下语句后,a的值是______ (02春)
Dim a As Integer
a = 1
Do Until a = 100
a = a + 2
Loop
A、99 B、100 C、溢出 D、101
null 求出1-100之内的所有勾股数(若a2+b2=c2,a,b,c为自然数,其中a<>b,则a,b,c称为一对勾股数)。编程题:null练习题1、下列循环语句能正常结束的循环是_____。
A、I=5
do
I=I+1
loop until I<0 B、I=1
do
I=I+2
loop until I=10C、I=10
do
I=I-2
loop until I<0D、I=6
do
I=I-4
loop until I=0null2、下面程序段运行结果为______。
For I=3 to 1 step –1
print spc(5-I);
for j=1 to 2*I-1
print “*”;
next j
print
Next iA、 *
* * *
* * * * *B、 * * * * *
* * *
*C、 * * * * *
* * *
*D、 * * * * *
* * *
*null3、执行下面程序,打印结果是_______。
option explicit
private sub form_click()
dim I as integer,j as integer
j=10
for I=1 to j step 2
I=I+1
j=j-i
next I
print I,j
end subnull4、将一个正整数分解为质因数乘积。例如:234=2*3*3*13。
Private sub command1_click()
dim n%,factor%,first as boolean
n=inputbox(“输入一个正整数”)
factor=2
first=true
do
do while ____
if first then
print n;”=”;factor;
else
print “*”;factor;
endif
_____
first=false
loop
factor=factor+1
Loop until factor>n
End sub