由于不同学校、不同教材的实验四具体要求可能存在差异,以下内容将基于一个非常经典的实验四主题——“使用数组与过程” 来构建,这个主题通常包含数组的排序、查找,以及 Sub 过程和 Function 过程的应用。

您可以根据您实验的具体要求,对以下代码进行修改和调整。
数组与过程应用
实验目的
- 掌握一维数组和二维数组的定义、初始化及引用方法。
- 学习使用数组解决实际问题,如数据排序、查找等。
- 熟练掌握 Sub 过程的创建与调用方法。
- 熟练掌握 Function 过程(函数)的创建与调用方法,理解其与 Sub 过程的区别。
- 学习在过程间传递参数,特别是按地址传递和按值传递的区别。
实验内容与要求
本实验将完成两个主要任务:
- 一维数组排序与查找:创建一个窗体,实现对随机生成的整数数组进行升序排序,并允许用户输入一个数字进行查找。
- 二维数组矩阵转置:创建一个窗体,实现一个 3x3 矩阵的转置,并使用过程来完成矩阵的输出。
一维数组排序与查找
要求
- 窗体上有一个“生成数组”按钮,点击后生成 10 个 1 到 100 之间的随机整数,并显示在文本框中。
- 一个“排序”按钮,点击后对数组进行升序排序,并显示排序后的结果。
- 一个“查找”按钮,点击后弹出一个输入框,让用户输入要查找的数字,然后在数组中查找,并给出查找结果(找到或未找到,以及找到的位置)。
- 使用
Sub过程来实现排序功能。 - 使用
Function过程来实现查找功能。
界面设计
您可以在窗体上放置以下控件:
- 1 个
TextBox,用于显示数组内容(txtArray)。 - 3 个
Button,分别命名为btnGenerate,btnSort,btnSearch。 - 1 个
Label,用于显示查找结果(lblResult)。
代码实现
双击窗体进入代码视图,编写如下代码:

' 在窗体级别声明数组,以便在多个过程中使用
Private numbers(9) As Integer
' --- 生成数组按钮 ---
Private Sub btnGenerate_Click(sender As Object, e As EventArgs) Handles btnGenerate.Click
' 使用 Randomize 初始化随机数生成器,确保每次运行结果不同
Randomize()
' 生成10个随机整数
For i As Integer = 0 To 9
numbers(i) = CInt(Int((100 * Rnd()) + 1))
Next
' 调用显示数组的子过程
DisplayArray()
' 清空上一次的查找结果
lblResult.Text = ""
End Sub
' --- 排序按钮 ---
Private Sub btnSort_Click(sender As Object, e As EventArgs) Handles btnSort.Click
' 调用排序子过程
BubbleSort(numbers)
' 排序后重新显示数组
DisplayArray()
End Sub
' --- 查找按钮 ---
Private Sub btnSearch_Click(sender As Object, e As EventArgs) Handles btnSearch.Click
' 使用 InputBox 获取用户输入
Dim searchValue As Integer = CInt(InputBox("请输入要查找的数字:", "数字查找"))
' 调用查找函数,返回找到的索引,如果未找到则返回 -1
Dim index As Integer = FindNumber(numbers, searchValue)
' 根据查找结果显示结果
If index <> -1 Then
lblResult.Text = $"查找成功!数字 {searchValue} 在数组中的位置是: {index}"
Else
lblResult.Text = $"查找失败!数字 {searchValue} 不在数组中。"
End If
End Sub
' =================================================================
' '================= 自定义过程和函数 =================
' =================================================================
' --- 子过程:显示数组内容 ---
' 此过程没有返回值,只负责将数组内容显示到 TextBox 中
Private Sub DisplayArray()
Dim sb As New System.Text.StringBuilder()
For i As Integer = 0 To numbers.Length - 1
sb.Append(numbers(i).ToString().PadRight(5)) ' 每个数字占5个字符宽度,对齐显示
Next
txtArray.Text = sb.ToString()
End Sub
' --- 子过程:冒泡排序 ---
' 此过程没有返回值,直接对传入的数组进行排序(按地址传递)
' 注意:ByRef 是默认的,可以省略,但明确写出有助于理解
Private Sub BubbleSort(ByRef arr() As Integer)
Dim n As Integer = arr.Length
For i As Integer = 0 To n - 2
For j As Integer = 0 To n - 2 - i
If arr(j) > arr(j + 1) Then
' 交换两个元素
Dim temp As Integer = arr(j)
arr(j) = arr(j + 1)
arr(j + 1) = temp
End If
Next
Next
End Sub
' --- 函数:线性查找 ---
' 此过程有返回值,返回找到的元素的索引
' 如果未找到,返回 -1
' ByVal 表示传递数组副本,但在这里我们为了修改原数组,排序时用了 ByRef。
' 查找通常不需要修改原数组,用 ByVal 更安全,但数组是引用类型, ByVal 传递的是引用的副本,指向的还是同一个数组。
' 所以查找时用 ByRef 或 ByVal 效果一样,但推荐 ByVal 以表明不修改意图。
Private Function FindNumber(ByVal arr() As Integer, ByVal value As Integer) As Integer
For i As Integer = 0 To arr.Length - 1
If arr(i) = value Then
Return i ' 找到,返回索引
End If
Next
Return -1 ' 遍历完未找到,返回-1
End Function
二维数组矩阵转置
要求
- 创建一个窗体,实现一个 3x3 矩阵的转置。
- 使用一个
Sub过程来打印(显示)矩阵。 - 使用一个
Sub过程来执行矩阵转置操作。
界面设计
您可以在窗体上放置以下控件:
- 2 个
TextBox,分别用于显示原始矩阵和转置后的矩阵(txtOriginalMatrix,txtTransposedMatrix)。 - 1 个
Button,命名为btnTranspose。
代码实现
双击窗体进入代码视图,编写如下代码:
' 在窗体级别声明原始矩阵和转置后的矩阵
Private originalMatrix(2, 2) As Integer
Private transposedMatrix(2, 2) As Integer
' --- 转置按钮 ---
Private Sub btnTranspose_Click(sender As Object, e As EventArgs) Handles btnTranspose.Click
' 1. 初始化原始矩阵(可以随机生成或手动赋值)
InitializeMatrix(originalMatrix)
' 2. 显示原始矩阵
DisplayMatrix(originalMatrix, txtOriginalMatrix)
' 3. 调用转置过程
TransposeMatrix(originalMatrix, transposedMatrix)
' 4. 显示转置后的矩阵
DisplayMatrix(transposedMatrix, txtTransposedMatrix)
End Sub
' =================================================================
' '================= 自定义过程 =================
' =================================================================
' --- 子过程:初始化矩阵 ---
Private Sub InitializeMatrix(ByRef matrix(,) As Integer)
Randomize()
For i As Integer = 0 To 2
For j As Integer = 0 To 2
matrix(i, j) = CInt(Int((100 * Rnd()) + 1))
Next
Next
End Sub
' --- 子过程:显示矩阵 ---
' 接收一个二维矩阵和一个 TextBox 控件作为参数
Private Sub DisplayMatrix(ByVal matrix(,) As Integer, ByRef outputTextBox As TextBox)
Dim sb As New System.Text.StringBuilder()
For i As Integer = 0 To matrix.GetLength(0) - 1 ' GetLength(0) 获取第一维的长度
For j As Integer = 0 To matrix.GetLength(1) - 1 ' GetLength(1) 获取第二维的长度
sb.Append(matrix(i, j).ToString().PadRight(5))
Next
sb.AppendLine() ' 每行结束后换行
Next
outputTextBox.Text = sb.ToString()
End Sub
' --- 子过程:矩阵转置 ---
' 接收原始矩阵和用于存放结果的矩阵
Private Sub TransposeMatrix(ByVal source(,) As Integer, ByRef result(,) As Integer)
For i As Integer = 0 To source.GetLength(0) - 1
For j As Integer = 0 To source.GetLength(1) - 1
' 转置的核心:将 source(i, j) 的值赋给 result(j, i)
result(j, i) = source(i, j)
Next
Next
End Sub
实验总结与要点
- 数组:数组是存储相同类型数据的集合,VB.NET 中使用
Dim arrayName(size) As Type来声明,注意数组的索引是从 0 开始的。 - Sub 过程 vs. Function 过程:
- Sub 过程:执行一系列操作,没有返回值,排序、显示内容、修改控件属性等,调用时使用
Call MySub(...)或直接MySub(...)。 - Function 过程:执行计算并返回一个值,查找、计算平均值、判断条件等,调用时通常将其赋值给一个变量,如
Dim result As Integer = MyFunction(...)。
- Sub 过程:执行一系列操作,没有返回值,排序、显示内容、修改控件属性等,调用时使用
- 参数传递:
- ByVal (按值传递):传递参数的副本,在过程中对副本的修改不会影响原始变量,这是默认的传递方式,适用于基本数据类型,可以保护原始数据。
- ByRef (按地址传递):传递参数的内存地址,在过程中对参数的修改会直接影响原始变量,适用于需要修改数组、对象等复杂数据结构,或者在 Sub 过程中需要返回多个值的情况。
- 模块化编程:将复杂的功能分解为一个个小的、可重用的过程(Sub 或 Function),是编写高质量程序的关键,这使代码更清晰、更易于调试和维护。
希望这份详细的教程和答案能帮助您顺利完成实验四!如果您有更具体的实验要求,可以提供给我,我可以为您进一步定制答案。

