台州学院
《VB程序设计》实验报告
实验1.1 设计一个程序,程序运行的初始界面如图1-1所示。当单击“显示”按钮时,在文本框中显示“欢迎使用VB!(”图1-1);当单击“清除”按钮时,清除文本框内的文本;当单击“退出”按钮时,结束程序运行。 Private Sub Command1_Click() Text1.Text = "欢迎使用VB!" End Sub
Private Sub Command2_Click() Text1.Text = "" End Sub
Private Sub Command3_Click() End End Sub
实验1.2 设计一个程序,程序运
行的初始界面如图1-3所示,其中“显
示”按钮为不可用。同时要求:
(1)当单击“改变文字”按钮时,在左边标签文字内容改为“你好,张三!,”同时“改变文字”按钮变为不可用(图1-4);
(2)当单击“隐藏”按钮时,将左边标签设为不可见,同时“隐藏”按钮变为不可用,“显示”按钮变为可用(图1-5);
(3)当单击“显示”按钮时,重新显示左边标签,同时“隐藏”按钮变为可用,“显示”
Private Sub Command1_Click() Label1.Caption = "你好,张三!" Command1.Enabled = False End Sub
Private Sub Command2_Click()
Label1.Visible = False
Command3.Enabled = True Command2.Enabled = False End Sub
Private Sub Command3_Click() Label1.Visible = True Command2.Enabled = True Command3.Enabled = False End Sub
实验2.1 设计一个程序,运行时界面如图2-1所示。当单击“左”、“右”、“上”、“下”按钮时,标签分别向左、右、上、下移动。
Private Sub Command1_Click() Label1.Left = Label1.Left - 100
实验2.2 设计一个程序,在文本框中输入一个3位整数,单击按钮后,在标签上输出该数的百位数、十位数和个位数,运行界面如图2-2所示。 Private Sub Command1_Click()
End Sub
Private Sub Command2_Click() Label1.Left = Label1.Left + 100 End Sub
Private Sub Command3_Click() Label1.Top = Label1.Top - 100 End Sub
Private Sub Command4_Click() Label1.Top = Label1.Top + 100 End Sub
Label1.Caption = "百位数:" + Left(Text1.Text, 1) + " 十位数:" + Mid(Text1.Text, 2, 1) + " 个位数:" + Right(Text1.Text, 1) End Sub
实验2.3 设计一个程序,实现简单计算的功能、
Private Sub Command1_Click() Dim a As Single, b As Single, c As Single
a = Text1.Text b = Text2.Text c = a + b
Label1.Caption = "+" Text3.Text = c End Sub
Private Sub Command2_Click() Dim a As Single, b As Single, c As Single
a = Text1.Text b = Text2.Text c = a - b
Label1.Caption = "-" Text3.Text = c End Sub
Private Sub Command3_Click() Dim a As Single, b As Single, c As Single
a = Text1.Text b = Text2.Text c = a * b
Label1.Caption = "*" Text3.Text = c End Sub
Private Sub Command4_Click() Dim a As Single, b As Single, c As Single
a = Text1.Text b = Text2.Text c = a / b
Label1.Caption = "/" Text3.Text = c End Sub
Private Sub Command5_Click()
Text1.Text = "" Text2.Text = "" Text3.Text = "" End Sub
Private Sub Command6_Click() End End Sub
实验2.4 设计一个程序,单击“输入”按钮可弹出一个输入对话框,提示用户输入带区号的电话号码,区号为4为,号码为8位,比如输入“0571-86281517”,然后将区号和电话号码在消息对话框中显示出来,运行界面如图2-4所示。
Private Sub Command1_Click() Dim c As String
c = InputBox("输入带区号的电话号码,区号为4为,号码为8位,比如输入“0571-86281517”:")
MsgBox ("区号:" + Left(c, 4) + Chr(13) + Chr(10) + "号码:" + Right(c, 8)) End Sub
实验3.1 在两个文本框中输入实数,单击按钮,显示“较小值是xxx。” Private Sub Command1_Click() Dim a As Single, b As Single, m As Single
a = Text1.Text b = Text2.Text If a < b Then m = a Else m = b End If
MsgBox "较小值是" & m End Sub
实验3.2 输入三个实数,计算其中的最大值,运行界面如图3-1所示。
采用变量m来存放中间过程和结果 Private Sub Command1_Click() Dim a As Single, b As Single, c As Single, m As Single a = Text1.Text b = Text2.Text c = Text3.Text
If a > b Then '将a,b的较大值存入
m
m = a
Else
m = b
End If
If c > m Then m = c '再将m与c比
较,得到最大值
Text4.Text = m
End Sub
注:比较a,b部分可以写成单行If结
构:
If a > b Then m = a Else m = b
实验3.3 用输入对话框输入x,根据下式计算对应的y,并在窗体上输出y的值。
Private Sub Command1_Click() Dim x As Single, y As Single
x = InputBox("请输入x的值:",0)
If x > 10 Then
y = Sqr(x) + Sin(x)
ElseIf x < 10 Then
y = 2 * x ^ 3 + 6 '注意:乘号不
能省略
Else
y = 0
End If
Print "y的值是" & y
End Sub
实验3.4 由键盘输入(1~7)范围内
的整数,试编程将其转换为中文表示的星期几,运行界面如图3-2所示。 Private Sub Command1_Click() Dim n As Integer, w As String '注意:w的类型必须为String n = Text1.Text If n = 1 Then w = "星期一" ElseIf n = 2 Then w = "星期二" ElseIf n = 3 Then w = "星期三" ElseIf n = 4 Then w = "星期四" ElseIf n = 5 Then w = "星期五" ElseIf n = 6 Then w = "星期六" ElseIf n = 7 Then w = "星期日" Else
w = "错误的输入"
End If
Text2.Text = w End Sub
实验3.5(选做)由键盘输入3个数,试编程将它们的中间数打印出来 Private Sub Command1_Click() Dim a As Single, b As Single, c As Single, m As Single a = Text1.Text b = Text2.Text c = Text3.Text
If a >= b And b >= c Then m = b
ElseIf a >= c And c >= b Then m = c
ElseIf b >= a And a >= c Then m = a
ElseIf b >= c And c >= a Then m = c
ElseIf c >= a And a >= b Then
m = a Else m = b End If
Text4.Text = m End Sub
实
验
4.1
编
写
过
程
Commandl_Click,显示对话框输入n(n>0),循环n次,每次随机产生一个两位数,求出其中的偶数之和,并在标签框Label1上显示。 Private Sub Command1_Click() Dim n As Integer, i As Integer, a As Integer, s As Integer Randomize '初始化随机数 n = InputBox("请输入n:") For i = 1 To n
a = Int(Rnd * 90) + 10 '随机生成一个两位数存于变量a中
Print a; '显示在屏幕上,以便校对(实际编程可以省略) If a Mod 2 = 0 Then s = s + a '判断是否为偶数 Next i
Label1.Caption = s End Sub
说明:随机生成两位数也可以用 a=(Int(Rnd*9)+1)*10+Int(Rnd*10)
实
验
4.2
编
写
过
程
Commandl_Click,用InputBox函数输入10个学生的成绩,统计后依次用标签控件Labell~Labe13显示优秀(85-100)、通过(60-84)和未通过(小于60)的人数。
Private Sub Command1_Click() Dim n1 As Integer, n2 As Integer, n3 As Integer, CJ As Integer For i = 1 To 10
CJ = InputBox("请输入成绩(一共10个成绩):")
If CJ >= 85 And CJ <= 100 Then
n1 = n1 + 1
ElseIf CJ >= 60 And CJ <= 84 Then
n2 = n2 + 1 ElseIf CJ < 60 Then n3 = n3 + 1 End If Next i
Label1.Caption = n1 Label2.Caption = n2 Label3.Caption = n3 End Sub
实验
4.3 编制事件程序
Dim n As Integer, i As Integer, s As Single
n = InputBox("请输入n:") s = 1 For i = 2 To n
s = s + i / ((i + 1) * (i + 2)) Next i Text1.Text = s End Sub
实验4.4 打印出所有的水仙花数,所谓水仙花数是指一个三位数,其各位数字立方和等于该数。例如,153是一水仙花数,因为153?13?53?33 程序1:用3个数字组合成百位数的办法,生成所有的三位数进行判断。 Dim a As Integer, b As Integer, c As Integer 'a代表百位数字,b十位,c各位
Dim s As Integer 's存放组合成的三位数
Command1_Click,执行该过程时输入n,并计算下列表达式的值,然后将计算结果在文本框控件Text1中显示。
Private Sub Command1_Click()
For a = 1 To 9 '百位数字取值范围是1-9
For b = 0 To 9 '十位数字取值范围是0-9
For c = 0 To 9 '个位数字取值范围是0-9
s = a * 100 + b * 10 + c '组合成的三位数
If s = a * a * a + b * b * b + c * c * c Then '判断是否水仙花数 Print s End If Next c Next b Next a ---------------
程序2:将百位数拆分出每一位,来判断是否水仙花数。
Dim i As Integer '存放循环取值的三
位数
Dim a As Integer, b As Integer, c As Integer 'a存放百位数字,b十位,c各位
For i = 100 To 999 a = Int(i/100)
b = Int((i - a * 100) / 10) c = i Mod 10
If i = a * a * a + b * b * b + c * c * c Then '判断是否水仙花数 Print i End If Next i
实
验
4.5
用
?
2
?116
?
11
2
2
2
?
3
2
???
1n
2
近似公式求
?值,当
1?5
n
2
?10
时不再累加。
Private Sub Command1_Click() Dim i As Integer, s As Single, t
As Single
t = 1 Do
i = i + 1
s = s + 1 / i ^ 2 Loop Until 1 / i ^ 2 < 10 ^ -5 Print Sqr(6 * s) End Sub
实验4.6(选做)一个两位数的正整数,如果将其个位数与十位数对调所生成的数称为对调数,如28是82的对调数。现给定一个两位的正整数,请找到另一个两位的正整数,使这两个数之和等于它们各自的对调数之和,如56+32=65+23。 Private Sub Form_Click()
Dim i As Integer, j As Integer, m As Integer, n As Integer m = InputBox("")
n = (m Mod 10) * 10 + m \ 10 For i = 10 To 99
j = (i Mod 10) * 10 + i \ 10 If i + m = j + n Then Print m, i Exit For
End If Next i End Sub
实验5.1 输入10个数给x数组,找出其中值为最大的元素并将其与第一个元素互换,找出值最小的元素并将其与最后一个元素互换,其他元素不动。如
原来: 8,7,9,15,0,3,-8,19,31, 5
输出:31,7,9,15,0,3, 5,19, 8,-8 -----------
Private Sub Form_Click() Dim x(10) As Integer, i As
Integer
Dim Max As Integer, m As Integer, Min As Integer, n As Integer 'Max、m存最大值和最大值位置;Min、n存最小值和最小值位置
For i = 1 To 10
x(i) = InputBox("请输入第" & i & "个数:")
Print x(i);
'
显示在窗体上 Next i Print
'显示换行
Max = x(1) Min = x(1) m = 1 n = 1
For i = 1 To 10 If Max < x(i) Then Max = x(i) m = i
End If
If Min > x(i) Then Min = x(i) n = i
End If
Next i
If m > 1 Then '如果最大元
素不是第一个,则与第一个交换
x(m) = x(1)
x(1) = Max
End If
If n < 10 Then '如果最小元
素不是第10个,则与第10个交换 x(n) = x(10) x(10) = Min
End If
For i = 1 To 10
'
在窗体上显示结果 Print x(i);
Next i
End Sub
注意:如果第一个为最小元素,则结'记录最大值位置
果出错,因为最小值被最大值调换了。可以这么改:在最后一个If前添加一行“If n = 1 Then n = m”可以设定新的最小值所在位置。'记录最小值位置 ==================== 实验5.2 编写事件过程
Command1_Click,完成下列运算: (1)输入10个数到整型数组a;
(2)将a(1)各位数字和赋值到b(1)、a(2)各位数字和赋值到b(2)、...、a(10)各位数字和赋值到b(10);
(3)在窗体上以一行输出a数组各元素值(保持原输入值不变); (4)在窗体上以一行输出b数组各元素值。 -----------
Private Sub Command1_Click()
Dim a(10) As Integer, b(10)
As Integer, i As Integer '下面完成(1): For i = 1 To 10
a(i) = InputBox("请
输入第" & i & "个数:") Next i
'(1)完成,下面完成(2): For i = 1 To 10 t = a(i) '取元素
While t > 0 '分解t
的每一位,并加入到b(i)中
b(i) = b(i) +
(t Mod 10) '取出t的个位数,加入b(i)中
t = t \
10 ’t缩小十倍,去掉原来的个位 Wend
Next i
'(2)完成,下面完成(3): For i = 1 To 10 Print a(i); Next i Print
'(3)完成,下面完成(4): For i = 1 To 10 Print b(i);
Next i
End Sub
====================
实验5.3 利用随机函数产生30个不同的三位正整数,打印出这30个数,然后将它们按从大到小的次序排序,并打印出排序后的结果。
(完全可以参照:书上实例,可以用冒泡排序法,也可以用选择排序法) ====================
实验5.4(选做)输入n后,再输入n个数a1,a2,…,an,按照下列公式计算s的值并显示。
公式1:v=(a1+a2+...+an)/n 公式2:
s=Sqr((a1-v)^2+(a2-v)^2+...+(an-v)^2))/n -----------
Private Sub Form_Click()
Dim a() As Single, n As
Integer, i As Integer
Dim sum As Single, v As
Single, s As Single n = InputBox("请输入元素个
数:") ReDim a(n) For i = 1 To n
a(i) = InputBox("请
输入第" & i & "个数:")
Print a(i); '
显示在窗体上 Next i Print
'显示换行
'求出v: For i = 1 To n sum = sum + a(i)
Next i v = sum / n '求出s: sum = 0 For i = 1 To 10
sum = sum + (a(i) - v) ^ 2 Next i
s = Sqr(sum) / n '显示结果:
Print v, s End Sub
====================
实验6.1 编写一个求三个数最大值的函数max(x,y,z),然后调用此函数求下列表达式的值,首先在文本框中输入a,b,c三个数,然后单击“计算”按钮,在文本框中输出表达式的值m。表达式为: -----------
'功能:返回x,y,z的最大值 Function max(ByVal x As Single, ByVal y As Single, ByVal z As Single) As Single max = x
If max < y Then max = y If max < z Then max = z End Function
Private Sub Command1_Click() Dim a As Single, b As Single, c As Single, m As Single a = Text1.Text b = Text2.Text
c = Text3.Text
m = max(a, b, c) / (max(a + b, b, c) * max(a, b, b + c)) Text4.Text = m End Sub
==================== 实验6.2 编一求素数的函数过程Prime(x),若x是素数返回True,否则返回False。主调程序调用Prime(x)函数输出100之内的所有素数。 ------------
'功能:判断整数x是否素数,如果是返回True,否则返回False Function Prime(ByVal x As Integer) As Boolean
Dim i As Integer
If x < 2 Then Exit Function '当x<2返回False For i = 2 To Sqr(x)
If x Mod i = 0 Then Exit Function '如果x被i整除,说明x不是素数,立刻返回 Next i
Prime = True 'x是素数 End Function
Private Sub Form_Click() Dim i As Integer For i = 1 To 100
If Prime(i) Then Print i; Next i End Sub
=================== 实验6.3(选做)编一过程
Find(S1,S2),用于在字符串S1中查找子串S2,并用消息框输出结果:未找到或找到的个数。(提示:利用Mid函数反复在字符串S1找S2子串。)------------
'功能:在字符串S1中查找子串S2,返回找到的个数,未找到返回0 Function Find(S1 As String, S2 As String) As Integer
Dim i As Integer, j As Integer, L1 As Integer, L2 As Integer L1 = Len(S1) L2 = Len(S2)
For i = 1 To L1 - L2 + 1 If Mid(S1, i, 1) = Left(S2, 1) Then '如果S1中第i个字母与S2的首字母是否相同,进行下面的判断 For j = 2 To L2 '判断S1中第i+1个开始的字母序列与S2中第2个开始的字母序列是否相同 If Mid(S1, i + j - 1, 1) <> Mid(S2, j, 1) Then Exit For Next j
If j > L2 Then Find = Find + 1 '找到相同的子串,子串计数+1
End If
Next i End Function
Private Sub Form_Click()
Dim S1 As String, S2 As String, n As Integer
S1 = Input("请输入一个字符串:")
S2 = Input("请输入要查找的子串:")
n = Find(S1, S2) If n > 0 Then
MsgBox "找到" & n & "个子串。" Else
MsgBox "未找到。" End If End Sub
实验7.1 设计一个字体修饰的程序,界面如图7-1所示。要求:框架1中有两个复选框,可以选择粗体和斜体
对标签中的文字进行修饰;框架2中有两个单选按钮,可以选择宋体或楷体对标签中的文字进行修饰;标签Label1的文字内容为“Visual Basic 程序设计”,宋体,常规,三号;文字对齐方式为居中。
Private Sub Check1_Click() If Check1.Value = 1 Then Label1.FontBold = True Else
Label1.FontBold = False End If End Sub
Private Sub Check2_Click() If Check2.Value = 1 Then Label1.FontItalic = True Else
Label1.FontItalic = False End If End Sub
Private Sub Option1_Click() Label1.FontName = "宋体" End Sub
Private Sub Option2_Click() Label1.FontName = "楷体_GB2312" End Sub
实验7.2 设计一个点菜的程序,界面如图7-2所示。要求:框架中的复选框提供可选择的三种套餐,右边的文本框中可以输入数量;输入时文本框只接受数字键;并且只有选取了相应的套餐后才可以进行输入;如果没有选取套餐,那么文本框不能编辑并清空;单击“确定”按钮,统计点餐的金额,并用消息框显示出来。
Private Sub Check1_Click()
If Check1.Value = 0 Then Text1.Text = "" Text1.Enabled = False Else
Text1.Enabled = True End If End Sub
Private Sub Check2_Click() If Check2.Value = 0 Then Text2.Text = "" Text2.Enabled = False Else
Text2.Enabled = True End If End Sub
Private Sub Check3_Click() If Check3.Value = 0 Then Text3.Text = "" Text3.Enabled = False Else
Text3.Enabled = True End If End Sub
Private Sub Command1_Click() Dim s As Single
If Check1.Value = 1 Then s = 13 * Val(Text1.Text)
If Check2.Value = 1 Then s = s + 18 * Val(Text2.Text)
If Check3.Value = 1 Then s = s + 25 * Val(Text3.Text)
MsgBox "总价" & s & "元" End Sub
Private Sub Form_Load() Text1.Text = "" Text1.Enabled = False Text2.Text = "" Text2.Enabled = False Text3.Text = "" Text3.Enabled = False
End Sub
Private Sub
Text1_KeyPress(KeyAscii As Integer)
If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then KeyAscii = 0 End If End Sub
Private Sub
Text2_KeyPress(KeyAscii As Integer)
If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then KeyAscii = 0 End If End Sub
Private Sub
Text3_KeyPress(KeyAscii As Integer)
If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then KeyAscii = 0 End If End Sub
实验7.3 设计一密码修改程序,要求: 1) 当单击“确定”按钮后,首先比较“用户名”和“原密码”是否一致,若一致且都为“admin”,则继续执行步骤2;否则弹出消息框,提示用户出错,并让用户重新输入。
2) 比较“新密码(N) ”和“新密码(S) ”,若两者一致,弹出密码修改成功消息框,程序终止执行。否则弹出错误消息,并让用户重新输入。
3) 当单击“取消”按钮后,程序终止执行。
Private Sub Command1_Click() If Text1.Text = "admin" And Text2.Text = "admin" Then If Text3.Text = Text4.Text Then
MsgBox "密码修改成功。"
End Else
MsgBox "输入的新密码不一致,请重新输入。" End If Else
MsgBox "用户名或密码错误,请重新输入。" End If End Sub
Private Sub Command2_Click() End End Sub
实验7.4(选做)设计一个拨号盘的程序。界面如图7-4所示。要求:命令按钮数组构成数字键,单击数字键按钮,将拨号的内容显示在文本框Text1中;单击“重拨”按钮,再现原来的拨号过程;
(提示:再现过程由定时器实现)定时器的时间间隔为0.5秒;设置文本框最多接受10个字符。
Dim Number As String Dim n As Integer
Private Sub Command1_Click(Index As Integer)
Text1.Text = Text1.Text & Command1(Index).Caption End Sub
Private Sub Command2_Click() Number = Text1.Text Text1.Text = "" n = 0
Timer1.Enabled = True End Sub
Private Sub Form_Load() Timer1.Enabled = False Text1.MaxLength = 10 End Sub
Private Sub Timer1_Timer() If n < Len(Number) Then n = n + 1
Text1.Text = Text1.Text & Mid(Number, n, 1) Else
Timer1.Enabled = False End If End Sub
实验8.1 下列程序运行时,先输入各公司月销售额,然后单击命令按钮,图片框中将显示各公司销售额的圆饼图(如图8-1所示)。要求:在文本框中只能输入数字字符;在圆饼图中分别用红、绿、篮色显示A、B、C公司的扇区填充色。
Private Sub Command1_Click() Dim a As Single, b As Single, c As Single, d As Single Const pi = 3.1415926 a = Val(Text1.Text) b = Val(Text2.Text) c = Val(Text3.Text) d = a + b + c
Picture1.Scale (-1.5, 1.5)-(1.5, -1.5) '设置图片框的坐标,左上角为(-1.5,1.5),右下角为(1.5,-1.5) Picture1.FillStyle = 0 '设置填充方式为实心(原来默认为1,透明) Picture1.FillColor = vbRed
Picture1.Circle (0, 0), 1, , -2 * pi, -2 * pi * a / d
Picture1.FillColor = vbGreen Picture1.Circle (0, 0), 1, , -2 * pi * a / d, -2 * pi * (a + b) / d Picture1.FillColor = vbBlue Picture1.Circle (0, 0), 1, , -2 * pi * (a + b) / d, -2 * pi End Sub
Private Sub
Text1_KeyPress(KeyAscii As Integer)
If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then KeyAscii = 0 End If End Sub
Private Sub
Text2_KeyPress(KeyAscii As Integer)
If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then KeyAscii = 0 End If End Sub
Private Sub
Text3_KeyPress(KeyAscii As Integer)
If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then KeyAscii = 0 End If End Sub
实验8.2(选做)坐标系作图:设置如图8-2所示的运行界面,单击“坐标系”按钮,将图片框的坐标系设置为原点
在中央,x轴[-10,10],y轴[-10,10],并画出该坐标系;单击“扇形”按钮,在图片框中画出一个圆心在原点,半径为5,圆周为红色,线宽为2,内部为绿色,起始角为30度,终止角为150度的扇形;单击“退出”按钮,结束程序运行。
Private Sub Command1_Click()
Picture1.Scale (-10, 10)-(10, -10) '设置图片框的坐标系
Picture1.Line (-10, 0)-(10, 0) Picture1.Line (0, 10)-(0, -10) Picture1.CurrentX = 0 'CurrentX, CurrentY 指示当前输入位置
Picture1.CurrentY = -0.3 Picture1.Print "(0,0)" End Sub
Private Sub Command2_Click()
Picture1.DrawWidth = 2 '画图的线粗为2
Picture1.FillColor = vbGreen Picture1.FillStyle = 0 '填充方式为实心
Picture1.Circle (0, 0), 5, vbRed, -3.14159 / 6, -3.14159 * 5 / 6 End Sub
Private Sub Command3_Click() End End Sub
实验9.2 某文本文件以下列格式存储若干学生的学号和两门课成绩,编写单击窗体的事件过程:
(1)用通用对话框控件Commondialog1选择该文件;
(2)在Label1(0)~Label1(1)显示总分最高的学生之学号、总分。
文本文件格式 “05010101”,78,89
“05010102”,83,79 ……
Private Sub Form_Click()
Dim xh As String, cj1 As Integer, cj2 As Integer
Dim topxh As String, topcj As Integer
CommonDialog1.ShowOpen Open
CommonDialog1.FileName For Input As #1
Do While Not EOF(1) Input #1, xh, cj1, cj2 If cj1 + cj2 > topcj Then topcj = cj1 + cj2 topxh = xh End If Loop Close #1
Label1(0).Caption = topxh Label1(1).Caption = topcj End Sub