1. 熟悉VB编程环境,能够建立、编译和运行VB程序。
2. 掌握窗体、标签、文本框、命令按钮、图形框的作用、常用属性、事件和方法。
3. 理解并掌握赋值语句、掌握表达式的书写规则。
4. 掌握使用Inputbox函数和MsgBox消息函数进行输入输出。 5. 熟悉VB的数据类型和类型转换。 二、 实验内容
(一) 字幕滚动
1. 设计如下图所示的界面实现字幕从上到下进行滚动,“欢迎使用VB”是一个字幕标签,两个命令按钮分别实现自动滚动和手动滚动。 a) 在窗体水平居中的地方放置一个标签。
b) 当字幕向下移出窗体时,重新从窗体顶端开始继续往下移动。
c) 单击“手动”按钮一次字幕将向下移动一下,单击“自动”按钮字幕将连续移动,具体移动的速度或幅度、窗体和按钮上的图片由自己设定。
d) 以EX1-1分别保存窗体和工程。 2. 实验要求
a) 对于标签应对其什么属性设置什么值才能够使窗体的背景不被遮挡? Backstyle----1
b) 使标签在窗体中水平居中需要设置什么属性,如何设置?设置的依据是什么? 2
c) 要想在命令按钮上显示图片,需要设置哪些属性,如何设置? Style -----1
d) 写出标签从上往下移动的代码,注意,当标签移出窗体后要从窗体上顶端开始继续往下。 , + 50
If > Then = 0
e) 要使Timer控件启用,必须设置哪两个属性,属性值设置为多少?
=100 =true
f) 单击“手动”按钮时,如何使Timer控件停用?需要在什么地方编写代码?请写出代码? =0 或 =false
(二) 打开教材实验材料中工程文件,完成下面的任务。
1.观察窗体上分别有哪些类的控件,根据观察结果制作下表,表格行数视情况而定。以EX1-2保存窗体和工程。
控件类 控件名称 2.启动程序,右图为启动之后的初始界面。回答下面的问题:
① List1中为什么会被添加了两项内容?
启动后,窗体从无到有,大小发生改变—form_resize 焦点放置在文本框内,触发 text1_gotfocus
② 单击按钮Command1,List1中又被添加了1项什么内容? 单击了命令按钮Command1
③ 拖拽窗体的右下角改变窗体的大小,List1中又被添加了什么内容? 窗体Form1的大小改变
3.关闭程序,写出你对该程序功能的理解。
通过在各个控件的一些事件里编写代码,当操作或系统触发事件,可将所有的操作记录下来。 (三) BMI计算。
1. 编写一个计算人的身体质量指数BMI的程序,计算公式为BMI等于体重(千克)除以身高(米)的平方,计算结果按四舍五入保留2位小数。运行时的界面如下图所示。
a) 设计如图所示界面,两个文本框用于输入体重和身高。
b) 点击“计算”按钮或者在文本框中输入回车时,计算BMI的值。 c) 当计算完成时将当前时间的BMI值打印在图形框,如果输入错误使用MsgBox弹出对话框提示输入错误。
d) 窗体大小设置为固定大小,窗体的标题显示系统当前的时间,使用计
时器每隔1秒钟更新Form的Caption。以EX1-3保存窗体和工程。 2. 实验要求
a) 该程序的计算用到了哪些变量,作用分别是什么?需要在什么地方定义这些变量,请写出这些变量的定义,并注明变量的作用。
窗体通用程序段或”计算”按钮的click事件内声明 ,两个变量用于保存文本框内输入的数值。一个变量用于保存bmi
b) 进行BMI计算的表达式是什么,使用自己定义的变量来表示。 a = Val b = Val
bmi = a / ((b / 100) ^ 2)
c) BMI计算的结果保留2位小数打印在PictureBox图形框中,请写出具体的Print语句。
Now & \"的BMI是\" & Round(bmi, 2) d) 请写出Timer1_Timer事件的代码,该代码用于控制窗体的标题,使标题显示当前时间。 = Time 课程名称: 实验报告2 成绩评定: 实验项目名称: 指导教师 实验项目编号: 实验项目类型: 实验地点: 学生姓名: 学号: 学院: 系 专业: 实验时间 年 月 日 午~ 月 日 午 一、 实验目的
1. 掌握条件分支中逻辑表达式的书写,掌握If语句的使用方法,包括单分支、双分支和多分支结构。掌握分支条件语句的嵌套形式,学会运用Select Case语句。
2. 掌握For…Next语句的使用方法,能准确、灵活地确定初值、终值及步长。掌握循环的嵌套。
3. 掌握Do…Loop语句的使用方法,理解几种不同形式Do…Loop语句的区别,能够正确描述控制循环的条件。 4. 分析理解如何避免死循环。 二、 实验内容
(一) 设计如下图所示界面,实现两个变量的交换。
1. 编写一个程序,用于演示两个变量内容的交换,界面设计如下图。运行通过后用文件名EX2-1分别保存窗体和工程。
a) 点击“第一步”按钮将时“数据1”的信息存放在temp变量中。 b) 点击“第二步”按钮将时“数据2”的信息移至“数据1”。 c) 点击“第三步”按钮时将“Temp”中的信息移至“数据2”。 d) 点击“交换”按钮时直接将两个数据交换。 提示:图中的横线为line控件。 2. 实验要求
a) 写出实现变量交换的代码,即“交换”按钮中的代码。 temp = = = temp
b) 如何保证按钮“第一步”,“第二步”,“第三步”的事件中都能够使用临时变量的值?填写以下事件的代码 将该临时变量定义为窗体级变量 Private Sub Command2_Click()’“第一步”按钮 temp = = temp End Sub
Private Sub Command3_Click()’ “第二步”按钮 = End Sub
Private Sub Command4_Click()’ “第三步”按钮 = temp End Sub (二) 生成字符
1. 设计如下图所示界面,并编码实现:
(1)窗体加载时,反复通过33至126之间的随机数生成一个ASCII字符,将其连接到文本框Text1中,直到生成的字符为“Z”时为止。
(2)单击“生成Text2中字符”命令按钮时,反复通过33至126之间的随机数生成一个ASCII字符,将其连接到文本框Text2中,直到生成的字符已在Text2中时为止。
(3)单击统计命令按钮时,将文本框Text1和Text2中的大写字母的总数、小写字母的总数、数字的总数和其它字符的总数信息显示在Picture1中。
(4)运行通过后用文件名EX2-2分别保存窗体和工程。 2. 实验要求
a) 设置哪些属性使得文本框能够显示垂直滚动条? Scrollbars---2-vertical
b) 窗体加载时生成字符的代码需要写在哪个事件中?请写出具体的代码。 Form_load() = \"\" Randomize
Do Until s = \"Z\"
s = Chr(Int(Rnd * 94) + 33) = & s Loop
c) 写出生成Text2中字符的代码。 = \"\" Do
s = Chr(Int(Rnd * 94) + 33) = & s
Loop Until InStr(Left, Len - 1), s) > 0
d) 写出统计字符的代码?描述代码中的难点。 Dim Up%, Lw%, Nu%, Oth% s = &
For i = 1 To Len(s)
Select Case Asc(Mid(s, i, 1)) Case 48 To 57
Nu = Nu + 1 ' \"数字字符\" Case 65 To 90
Up = Up + 1 '\"大写字母\" Case Asc(\"a\") To Asc(\"z\") Lw = Lw + 1 ' \"小写字母\" Case Else
Oth = Oth + 1 '\"标点字符\" End Select Next i
\"数字字符个数\"; Nu \"大写字母个数\"; Up \"小写字母个数\"; Lw \"标点字符个数\"; Oth 难点在于各类字符的识别。
e) 你编写代码的过程中有没有出现死机等问题,原因是什么?是怎么解决的?
(三) 设计如下图所示界面,并编码实现:
1. 利用迭代公式求一个数的立方根,界面如下图。求a的立方根的迭代公式为:
迭代到|xn1-xn|<时为止,并用求立方根的算术表达式进行比较。运行通过后用文件名EXF06分别保存窗体和工程。
a) 对求得的根保留2位小数显示,以EX2-3保存窗体和工程。 2. 实验要求
a) 求解过程中用到了哪些临时变量?定义为哪种数据类型比较合适?为什么?
单精度。足够精度。数值不大,且精度要求不是很高。 b) 求立方根的表达式是什么? If a >= 0 Then
Text3 = Format(a ^ (1 / 3), \"\") Else
Text3 = Format(-((-a) ^ (1 / 3)), \"\") End If
c) 写出用迭代法求立方根的循环语句,并对语句进行简单解释。 Dim x0#, x1#, a# a = Val(Text1)
x0 = a ’初始值 If a = 0 Then x1 = 0 Else
x1 = x0 * 2 / 3 + a / (3 * x0 * x0) ’如果输入不为0,才计算立方根 End If
Do While Abs((x1 - x0)) >
x0 = x1 ’迭代,根据旧值获得新值
x1 = x0 * 2 / 3 + a / (3 * x0 * x0) ’迭代,根据旧值获得新值 Loop
课程名称: 实验报告3 成绩评定:
实验项目名称: 指导教师 实验项目编号: 实验项目类型: 实验地点: 学生姓名: 学号: 学院: 系 专业:
实验时间 年 月 日 午~ 月 日 午 一、 实验目的
1. 掌握数组的声明、数组的赋值和数组元素的访问方法。正确地使用ReDim语句。
2. 掌握函数和子过程的定义和调用方法。理解形参和实参的作用以及关系。
3. 熟练运用数组类控件:组合框和列表框。 4. 理解参数传地址和传值的区别和使用方法。 二、 实验内容
(一) 按下面的要求对Form1的Click事件编程,运行通过后用文件名EX3-1分别保存窗体和工程。要求功能为:
1. 随机产生20个20以内的正整数存入数组a中,并在窗体上显示; 2. 将数组a中相同的元素只保留第一个,其余的全部删除,并且要求同时改变数组a的大小;
3. 将数组a中的元素依升序排列并显示在窗体上。
4. 实验要求
a) 本题中数组a定义为静态数组还是动态数组呢?为什么? 动态数组。需要改变数组大小
b) 语句ReDim Preserve中Preserve的作用是什么? 保留数组中原来的数据
c) 描述删除重复元素的算法思路,写出删除重复元素的代码?
从第二个元素起,依次判断前面有无出现重复元素。如果有,则将其后的元素都依次往前移动一个位置,覆盖重复元素。 k = 1 '从第二个元素开始 Do
'判断下标从0,1,...k-1的数组元素与下标为k的元素是否有重复 i = 0 Do
Repeat = a(k) = a(i)
If Repeat Then 'a(k)与前面的某个元素重复 'k右边的元素全部左移一位,即删除a(k) For j = k To UBound(a) - 1 a(j) = a(j + 1) Next j
'数组长度减1
ReDim Preserve a(UBound(a) - 1) '当前位置k左移一位 k = k - 1
End If i = i + 1
Loop While i < k And Not Repeat k = k + 1 '继续下一个数组元素 Loop Until k > UBound(a)
d) 删除重复元素时,有无出现错误?原因是什么,是怎么解决的? e) 写出排序代码
'冒泡法对a进行排序
For i = UBound(a) To 1 Step -1 For j = 0 To i - 1
If a(j) > a(j + 1) Then k = a(j)
a(j) = a(j + 1) a(j + 1) = k End If Next j Next i (二) 最大公因数
1. 编写一个使用递归算法实现求两个整数的最大公因数的函数GCD%(m%, n%)并调用。界面如下。以EX3-2分别保存窗体和工程。 2. 求最大公约数有两种方法:举例如下表:
碾转相减 98-63=35 63-35=28 35-28=7 28-7=21 21-7=21 21-7=14 碾转相除 98 mod 63=35 63 mod 35=28 35 mod 28=7 28 mod 7=0 14-7=7 3. 两个整数的最大公因数的递归定义为:若使用碾转相除法,n整除m则n就是最大公因数,即GCD(m, n) = n,否则GCD(m, n) = GCD(n, m Mod n)。
4. 实验要求
a) 对于函数GCD(m%, n%),将m和n使用地址传递和使用值传递时有什么不同?被调函数执行完毕后,主调过程中m和n的值有什么不同? 如果是传值,则实参数据传递进函数后,实参与形参就断开联系,被调函数执行完毕后,主调过程中m和n的值不会改变。;如果是传址,形参获得的是实参的内存地址,形参的改变就是实参的改变。被调函数执行完毕后,主调过程中m和n的值会改变。
b) 对于递归过程而言需要跳出分支,若使用碾转相除法求最大公因数,使递归终止的分支条件是什么?使用碾转相减法呢? 碾转相除法 if m mod n=0 then GCD=n 碾转相减法if m - n=0 then GCD=n c) 写出GCD(m%, n%)函数。 Function GCD%(m%, n%)
If m = 0 Or n = 0 Then Exit Function If m < n Then tmp = m: m = n: n = tmp If m Mod n = 0 Then GCD = n Else
GCD = GCD(n, m Mod n) End If End Function (三) 判断完数
1. 按下面的要求编写程序判断一个正整数是否为完数:如果一个正整数等于它的所有因子之和,则它是完数,界面如下图所示。
题目要求如下: a) 为工程添加一个模块,命名为MyFunctions。
b) 在模块MyFunctions上编写一个函数PositiveInt (s$) As Boolean,
当s为正整数时返回True,否则为False。
c) 在模块MyFunctions上编写一个求给定整数的所有因子(包括1但不包括本身)之和的函数SumFactor&(n%)。
d) 在文本框Text1中输入一个正整数,当按下Enter键时调用函数PositiveInt。当Text1中的内容不是正整数时:①用消息框给出相应提示;②将焦点置于Text1;③选中Text1中的内容。否则,①调用函数SumFactor求这个正整数的所有因子之和;②如果它的所有因子之和等于其本身,则在标签Label1中输出“是完数”,否则输出“不是完数”。并将文本框中数的所有因子输出到组合框中。注意,应清除上一次计算的结果。
e) 运行通过后用文件名EX3-3分别保存窗体工程。 2. 实验要求
a) 补充如下代码,完成PositiveInt函数的编写。特别注意函数参数和返回值的类型。
Function PositiveInt(s ) As boolean If IsNumeric(s) And (Val(s)) = Int(s) And Val(s) > 0 Then PositiveInt = True End Function 并回答以下问题: ① 标识符PositiveInt在函数体内部是作为一个局部变量吗? 是 ② 判断一个数a是正整数的条件是什么?用自然语言描述。 大于0 ,且取整前后相等。 ③ 如果PositiveInt在函数体内部没有被赋值至少一次,会出现什么样的后果? 函数没有返回值
b) 整个project中有几个模块,相互之间的关系是什么? 一个窗体,一个标准模块。属于同一个工程。 c) 补充函数SumFactor的代码。
Function SumFactor&(x%)
SumFactor = 0
For i = 1 To x - 1 If x Mod i = 0 Then
SumFactor = SumFactor + i End If End Function
d) 当窗体上文本框中内容不是正整数时,用MsgBox对话框提示并且选择Text1中的内容。写出选中Text1中内容的3条语句: MsgBox \"不是正整数\"
= 0 = Len
e) 往组合框中添加数据前是否要清空组合框,否则会有怎样的结果?
要。否则组合框中保留了其他数字的因子。
课程名称: 实验报告4 成绩评定:
实验项目名称: 指导教师 实验项目编号: 实验项目类型: 实验地点: 学生姓名: 学号: 学院: 系 专业: 实验时间 年 月 日 午~ 月 日 午 一、 实验目的
1. 掌握常用控件的常用属性、事件和方法。包括窗体、文本框、标签、命令按钮、组合框、列表框、单选按钮、复选框等。 2. 熟练合理使用不同的控制结构和函数过程。
3. 掌握数组的相关操作和常用算法,以及自定义数据类型数组的使用。 4. 掌握顺序文件的特点,掌握顺序文件的打开、读写和关闭的方法。掌握Line Input和Input的使用。 5. 能够根据应用程序的需要读写脱机数据。 6. 掌握菜单的设计方法。 二、 实验内容
(一) 综合练习
1. 设计如下图所示界面的窗体。
(1) 将左侧组合框设置为升序,当添加新的待选课程名称时自动放至
合适的位置上。 (2)
编写事件过程。
a) 当窗体加载时,分别从文件“待选课.txt”、“已选课.txt”中读取数据显示在左侧的组合框和右侧的列表框中。
b) 在左侧组合框中输入数据按回车键时,检查无重复后,添加新的
待选课程名称至待选课列表框中。 c) 编写移动按钮事件:
“>”:将选中的课程移至已选课列表中 “>>”:将所有待选课程移至已选课列表中
“<”:从已选课列表中删除选中的已选课程,并将其移入待选课列表
“<<”:从已选课列表中删除所有的已选课程,并将其移入待选课列表
d) 单击“退出”按钮时,分别将组合框和列表框中的数据保存至“待选课.txt”和“已选课.txt”文件中。
e) 编写SortASC和SortDSC过程对已选课列表框中的数据进行排序,在单击“升序”按钮时调用SortASC过程,并将按钮的标题修改为“降序”,反之亦然。 f) 以EX4-1保存窗体和工程。 2. 实验要求
a) 将左侧组合框设置为升序时,需要设置什么属性?该属性的设置能否用代码完成,为什么?
Sorted属性设置为true。不能,因为是只读属性
b) 添加新的待选课程名称到组合框时需要检查有无重复,请在下面
空白处写出正确的代码。
Private Sub Combo1_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then
For i = 0 To - 1 If = (i) Then Exit For
Next i If i = Then
End If End Sub
c) “>”按钮单击事件中,如果没有选中任何待选课程,会出现什么样的情况?原因是什么?
出错。因为没有选择项,则 为-1, (-1) 不存在,溢出。
所以应设置选择结构,当选中项后,才将该项添加至右边列表框。 d) 以下是对列表框数据进行升序排序的子过程SortASC,请完善。
Sub SortASC(a As listbox ) ‘选择排序的子过程 For i = 0 To - 2 For j = i + 1 To - 1 If (i) > (j) Then Tmp= (i)
(i)= (j) (j)=tmp
End If Next j Next i End Sub
(二) 综合练习
1. 在窗体上放置一个文本框,并设计如下图所示菜单。
文件 打开Ctrl+O 保存 - 退出 字号 变大 变小 格式 字体 宋体 隶书 性别 升序 降序 排序 年龄 升序 降序 (1) 编写事件过程。
a) “文件”-“打开”:打开应用程序所在目录的文件。 b) “文件”-“保存”:将文本框中内容保存至文件。
c) 在读取或者保存数据时需要保存数据的格式,因此在处理文件中的数据时需要使用自定义数据类型的数组。数据文件中的数据类型StudType定义如下:
Private Type StudType Name As String * 3 Sex As String * 1 Age As Integer End Type
Dim s() As StudType ‘定义一个StudType类型的动态数组
d) “格式”-“字体”:设置文本框中字体格式为“宋体”或者“隶书”
e) “格式”-“字号”:增大或者减小字体大小。 f) “排序”-“年龄”:按照年龄进行升序或降序排序 g) “排序”-“性别”:按照性别进行升序或降序排序。 (2) (3)
要求在文本框中输出时对齐,如下图。
右键点击文本框时出现格式菜单,并且禁止系统菜单的出现。
(4) 运行通过后用文件名EX4-2分别保存窗体和工程。 2. 实验要求
a) 由于不清楚文件中的数据有多少,所以要使用动态数组来存放文件中的数据。下面代码的功能是从当前目录中读取学生的信息,请完善。
Open & \"\\\" For input As #1 i = 0
Do While Not eof(1)
Input #1, iName, iSex, iAge
i = i + 1
ReDim preserve s(1 To i)
s(i).Name = iName: s(i).Sex = iSex: s(i).Age = iAge
= & s(i).Name & Space(IIf(Len(iName) = 2, 4, 3)) & s(i).Sex & \" \" & s(i).Age & vbCrLf
‘保证文本框中每行存放一个学生的信息, Loop Close #1
b) 文本框中如何实现对齐?请写出你的解决方案。中文字符与英文字符所占的宽度是否相同?
根据姓名的字符个数,在”性别“前决定连接不同的空格个数。 Space(IIf(Len(iName) = 2, 4, 3))
c) 以下是对自定义数据类型数组s按照年龄进行排序的代码,请完善。
For i = LBound(s) To UBound(s) - 1 For j = i + 1 To UBound(s)
If s(i).Age < s(j).Age Then Tmp = s(i): s(i) = s(j): s(j) = Tmp Next j Next i
d) 升序或者降序时如何显示check标记。 设置菜单项的checked属性为true
e) 显示右键菜单的代码如下,请完善。
Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
= False '可使VB 本身定义的系统右键菜单无效 = True
If Button = 2 Then PopupMenu MFormat End Sub
f) 说出该题的难点(至少2个)及解决方法。
因篇幅问题不能全部显示,请点此查看更多更全内容