1、第8章 数组与字符串Arrays and Strings,第8章 字符串与数组,8-1 一维数组的处理8-2 二维和多维数组8-3 字符串处理8-4 动态数组、不规则数组与参数传递8-5 数组排序与搜寻,8-1 一维数组的处理,8-1-1 数组的基础8-1-2 宣告一维数组8-1-3 For Each循环走访数组元素与边界函数,8-1-1 数组的基础-说明,数组(Arrays)是一种程序语言的基本数据结构,属于一种循序性的数据结构。日常生活最常见的范例是一排信箱,如下图所示:,8-1-1 数组的基础-VB数组,Visual Basic语言的数组属于参考数据型别,它可以将相同数据型别的变量集合起
2、来,使用一个名称代表,以索引值存取元素,每一个元素相当于是一个变量,如下图所示:,8-1-2 宣告一维数组-语法,Visual Basic数组同样使用【Dim】关键词来宣告,我们可以在宣告同时指定数组尺寸。一维数组的宣告语法,如下所示:Dim 数组名(最大索引) As 资料型别或Dim 数组名(0 To 最大索引) As 资料型别阵列元素个数为括号的最大索引数加一,也可以使用To关键词指出范围。,8-1-2 宣告一维数组-范例,例如:宣告一维数组来储存学生姓名和成绩,如下所示:Dim arrNames(4) As StringDim arrGrades(4) As Integer上述程序代码宣
3、告2个一维数组,一为整数数组;一是字符串数组,括号值是数组最大的索引值。索引值是从0开始,04共有5个元素。,8-1-2 宣告一维数组-一维数组的初值,我们也可以在宣告数组时,不指定数组最大索引值,而直接指定数组元素的初值,如下所示:Dim arrGrades() As Integer = 60, 89, 75, 68, 90上述程序代码宣告的一维数组大小就是初值的个数,数组索引的最大值是初值个数减一。在Visual Basic 2010版可以直接使用Dim宣告且指定初值,而不用指定数据型别,数组会自动依初值判断数据型别,如下所示:Dim arrNames = 陈会安, 江小鱼, 杨过, 小龙
4、女, 张无忌,8-1-2 宣告一维数组-存取一维数组的元素值,我们可以使用索引值以指定叙述来指定数组值,如下所示:arrGrades(0) = 60arrGrades(1) = 89arrGrades(2) = 75arrGrades(3) = 68arrGrades(4) = 90上述指定叙述使用索引值来指定数组元素值。同样方式可以取出数组元素值,如下所示:Dim grade As Integergrade = arrGrades(3),8-1-2 宣告一维数组-Visual Basic专案,Visual Basic专案:Ch8-1-2在Windows应用程序建立学生姓名字符串数组和成绩的整
5、数数组,学号是数组索引值。只需输入学号的索引值,就可以取得数组元素的学生姓名和成绩,如下图所示:,8-1-3 For Each循环走访数组元素与边界函数-走访数组(语法),For Each循环可以轻松走访整个一维数组,其语法如下所示:For Each 变数 In 数组 程序区块Next上述变量可以取得数组的一个元素,变量需要和数组属于相同数据型别,回圈自动从索引0开始,每执行一次循环取得一个元素值并且自动移至下一个元素,直到没有元素为止。,8-1-3 For Each循环走访数组元素与边界函数-走访数组(范例),例如:计算上一节arrGrades数组元素的成绩总和,如下所示:For Each
6、item In arrGrades totalGrade += itemNext上述程序代码的变数item是数组元素,每执行一次,就将数组元素值加到totalGrade,最后变数totalGrade就是数组元素的总和。,8-1-3 For Each循环走访数组元素与边界函数-数组边界函数,如果使用For/Next循环(Do/Loop循环也可以)来存取数组元素,我们可以搭配Visual Basic函数来取得数组边界,传入参数是数组变量,如下表所示:,8-1-3 For Each循环走访数组元素与边界函数-Visual Basic专案,Visual Basic专案:Ch8-1-3在Windows应
7、用程序可以显示每位学生的姓名和成绩,和全班总分和平均成绩,如下图所示:,8-2 二维和多维数组-说明,二维数组(Two-dimensional Array)或多维数组都是一维数组的扩充。如果将一维数组想象成一度空间的线,二维数组就是二度空间的平面,三维数组即空间。在日常生活中的二维数组应用非常广泛,只要是平面的表格,都可以转换成二维数组来表示。例如:月历、功课表和成绩单等。在Visual Basic宣告学生成绩的二维数组也是使用Dim,如下所示:Dim arrGrades(,) As Integer = 54, 68, 93 , 67, 78 , 89 Dim pressure(3,3) As
8、 Double,8-2 二维和多维数组-图例,二维数组拥有2个索引,左索引(Left Index)指出元素位在哪一列,右索引(Right Index)指出位在哪一栏,使用2个索引值就可以存取指定的二维数组元素。,8-2 二维和多维数组-VB2010数组初值,Visual Basic 2010版可以直接使用Dim宣告二维数组且指定初值,而不用指定数据型别,它会自动依初值判断维度和数据型别,如下所示:Dim arrGrades = 54, 68, 93 , 67, 78 , 89 ,8-2 二维和多维数组-指定元素值,二维数组如果没有指定数组初值,我们需要在宣告时指定数组尺寸,如下所示:Dim a
9、rrGrades(1, 2) As IntegerarrGrades(0,0)=54arrGrades(0,1)=68arrGrades(0,2)=93arrGrades(1,0)=67arrGrades(1,1)=78arrGrades(1,2)=89,8-2 二维和多维数组-走访元素,在设定数组值后,存取二维数组需要使用二层巢状循环,如下所示:For i = 0 To 1 For j = 0 To 2 totalGrades(i) += arrGrades(i, j) Next jNext i,8-2 二维和多维数组-Visual Basic专案,Visual Basic专案:Ch8-2在
10、Windows应用程序输入学生各科成绩后,可以计算学生的总分和平均分数,如下图所示:,8-3 字符串处理,8-3-1 字符串的基础8-3-2 字符串长度与大小写转换8-3-3 取出子字符串与字符串反转8-3-4 子字符串的搜寻与取代,8-3-1 字符串的基础-说明,Visual Basic字符串是String数据型别的变量或字符串字面值,字符串是0或多个依序的Char数据型别的字符,以双引号括起的文字内容,如下所示:Dim str As String = Visual Basic程序设计范例教本Dim str1 As Stringstr1 = ASP.NET网页制作彻底研究,8-3-1 字符串
11、的基础-新字符串值,Visual Basic字符串内容并不能更改,也就是说,一旦建立字符串后,就无法改变其值,只能重新指定成新的字符串值或另一个字符串变量,如下图所示:,8-3-2 字符串长度与大小写转换-说明,Visual Basic字串函数可以取得字符串长度、进行英文字母大小写转换和删除头尾的空格符,如下表所示:,8-3-2 字符串长度与大小写转换-Visual Basic专案,Visual Basic专案:Ch8-3-2在Windows应用程序可以测试上表的字符串函数,取得字符串长度、转换成小写和删除空格符,读者可以自行执行程序来测试函数的执行,如下图所示:,8-3-3 取出子字符串与字
12、符串反转-说明,Visual Basic提供Mid()、Left()和Right()等函数,可以从字符串中取出所需的子字符串,或是反转字符串,如下所示:,Left() 和 Right() 函数因为会与其他类别的同名属性冲突,所以需写为: Microsoft.VisualBasic.Left(str, n) 或 Microsoft.VisualBasic.Right(str,n),8-3-3 取出子字符串与字符串反转-Visual Basic专案,Visual Basic专案:Ch8-3-3在Windows应用程序可以测试上表的字符串函数,取出所需的子字符串,读者可以自行执行程序来测试函数的执行
13、,如下图所示:,8-3-4 子字符串的搜寻与取代-说明,对于多行文本框输入的一整篇文章来说,我们可以使用Visual Basic函数来搜寻与取代字符串。Visual Basic字符串搜寻与取代函数的说明,如下表所示:,8-3-4 子字符串的搜寻与取代-Visual Basic专案,Visual Basic专案:Ch8-3-4在Windows应用程序建立类似文书编辑工具的搜寻和取代功能,如下图所示:,8-4 动态数组、不规则数组与参数传递,8-4-1 动态数组8-4-2 不规则数组8-4-3 传递字符串与数组参数,8-4-1 动态数组-宣告,Visual Basic数组可以使用【ReDim】关键
14、词在程序执行时,重新调整尺寸。不过ReDim不能宣告数组,只能更改已经宣告的数组尺寸,如下所示:Dim arrGrades(4) As Integer ReDim arrGrades(6),将原来arrGrades数组大小从5改为7个元素,8-4-1 动态数组-保留数组内容,如果数组已经拥有内容,请使用Preserve关键词来保留原数组的内容,如下所示:ReDim Preserve arrGrades(6)上述程序代码可以放大数组尺寸,当然放大数组尺寸并不会有问题,如果缩小数组的话,数组裁剪部分的数据还是会遗失。,8-4-1 动态数组-二维动态数组,对于是二维以上的多维数组,我们可以变更指定维
15、度的尺寸,如果使用Preserve关键词,就只能变更最后1个维度的尺寸,如下所示:Dim arrTable(10, 20) .ReDim Preserve arrTable(10, 30),8-4-1 动态数组-Visual Basic专案,Visual Basic专案:Ch8-4-1在Windows应用程序测试Visual Basic动态数组,首先建立尺寸5的一维数组储存学生成绩,因为这学期转入2位转学生,所以放大尺寸为7,并且计算调整前后的学生平均成绩,如下图所示:,8-4-2 不规则数组-说明,Visual Basic语言的不规则数组(Jagged Array)是让数组元素可以是另一个数
16、组,换句话说,二维数组的第1维元素值是另一个一维数组,而且可以是不同尺寸的一维数组。,8-4-2 不规则数组-宣告,在Visual Basic程序代码宣告不规则数组的语法和之前的二维数组有一些不同,我们是宣告Array物件。例如:因为每一班的学生人数并不同,所以准备宣告储存3个班级学生姓名的不规则数组,如下所示:Dim arrClasses(2) As ArrayDim arrStudents1 = 陈会安, 江小鱼Dim arrStudents2 = 张无忌, 杨过, 小龙女Dim arrStudents3 = 陈允杰, 陈允东然后指定不规则数组的元素值为这三个数组,如下所示:arrClas
17、ses(0) = arrStudents1arrClasses(1) = arrStudents2arrClasses(2) = arrStudents3,8-4-2 不规则数组-不规则数组的初值,在宣告不规则数组的同时也可以指定数组初值,不过,不同于二维数组的初值,在元素外需要额外括号( )括起,如下所示:Dim arrClasses()() = (陈会安, 江小鱼), (张无忌, 杨过, 小龙女), (陈允杰, 陈允东),8-4-2 不规则数组-使用巢状循环走访不规则数组,在建立二维不规则数组后,我们可以使用二层For Each巢状循环走访二维不规则数组,如下所示:For Each arr
18、 In arrClasses For Each item In arr out &= item & vbTab Next out & = vbNewLineNext,8-4-2 不规则数组-Visual Basic专案,Visual Basic专案:Ch8-4-2在Windows应用程序建立二维不规则数组储存三个班的学生姓名数据,因为每一班的学生数不同,然后显示每一班的学生清单,如下图所示:,8-4-3 传递字符串与数组参数-说明,程序与函数的参数如果是字符串或数组,因为字串与数组都是参考数据型别,此时ByVal和ByRef参数传递的差异,如下表所示:,8-4-3 传递字符串与数组参数-范例,
19、例如:在程序与函数中,使用指定叙述将参数指定成其他数组,如下所示:Sub ReplaceArray(ByVal A() As Integer) Dim B() As Integer = 10, 20, 30 A = B .End Sub上述程序将参数的数组A指定成新数组B,事实上,并不会影响原参数数组A,因为传值方式不能指定成新数组。,8-4-3 传递字符串与数组参数-Visual Basic专案,Visual Basic专案:Ch8-4-3在Windows应用程序建立最大值和取代字符串程序,可以取得数组最大值和取代字符串,程序参数是使用ByVal传递数组;字串是使用ByRef方式呼叫,如下图
20、所示:,8-5 数组排序与搜寻,8-5-1 数组的排序8-5-2 数组的搜寻,8-5-1 数组的排序-泡沫排序法(说明),泡沫排序法(Bubble Sort)是使用交换方式来进行排序,可以将较小元素逐渐移动至数组开始,较大元素慢慢浮向数组的最后,如同水缸中的泡沫,慢慢往上浮,故称为泡沫排序法。,8-5-1 数组的排序-泡沫排序法(过程),泡沫排序法的过程是使用交换方法,在数组中找寻最大值,例如:原始数组内容,如下所示: Data()=89 , 34 , 78 , 45 数组最大索引为 3第一次外循环: 内循环依序比较数组元素0和1,元素1和2,元素 2和3来交换数组元素,如下所示: 89, 3
21、4, 78, 45 = 34, 89, 78, 45 交换 34, 89, 78, 45 = 34, 78, 89, 45 交换 34, 78, 89, 45 = 34, 78, 45, 89 交换阵列最大值89一步步往数组尾端移动。,泡沫排序法(过程),第二次外循环: 内循环依序比较数组元素0和1,元素1和2, 如下所示: 34, 78, 45, 89 = 34, 78, 45, 89 不交换 34, 78, 45, 89 = 34, 45, 78, 89 交换阵列次大值78一步步往数组第二尾端移动。第三次外循环: 内循环依序比较数组元素0和1,如下所示: 34, 45, 78, 89 =
22、34, 45, 78, 89 不交换,交换过程,89, 34, 78, 45 = 34, 89, 78, 45 交换 temp = data(1) data(1)= data(0) data(0) = temp不可以写为: data(1) = data(0) data(0) = data(1) ?,8-5-1 数组的排序-泡沫排序法,Dim i, j, length, temp As Integer length = UBound(Data) For i = length To 0 Step -1 For j = 0 To i - 1 If Data(j + 1) target Then high = mid - 1 前半段 Else low = mid + 1 后半段 End IfLoop Until low high,8-5-2 数组的搜寻-Visual Basic专案,Visual Basic专案:Ch8-5-2在Windows应用程序建立线性和二元搜寻,可以在数组执行搜寻,因为二元搜寻需要已排序数据,所以提供上一节泡沫排序法来排序数组数据,如下图所示:,End,