第6章 数组
在选择结构一章中介绍过,成绩管理系统能根据学生的成绩进行评价,本章将为成绩管理系统增加一个功能:求平均值。
画控件,设置控件属性
增加二个按钮控件,并设置其name属性为inputButton和averButton,caption属性为输入和平均值。
增加二个标签控件,并设置其name属性为statusLabel和averLabel。 确定事件,为事件编写过程 inputButton的click事件
从文本框获取用户输入的姓名和成绩,并保存到变量中。
在前面各章中,程序所涉及和处理的数据类型都比较简单,用基本数据类型(即整形、浮点型、字符型)的变量来描述就可以了。但在实际应用中,需要处理的数据往往很多,例如要对学校某年级数千人的学生成绩,如何用变量来标识这些数据呢?如果用前面所介绍的变量,几千人就要用几千个变量,即使程序员有耐心和毅力使用这么多的变量,也无法使用循环来处理。
数组是将相同类型的数据类型组合在一起的序列。用统一的数组名来标识数组,序列中的一个数据称为数组的一个元素,数组元素同其所在的位置序号(也称为数组的下标)来区分,利用数组名和下标就可以用统一的方式来处理数组中的所有元素。从而用数组可以方便地实现用一个变量来描述一批具有相同性质的数据的问题。
和普通变量一样,数组变量也要先定义,再赋值,最后才能使用。 1. 数组的定义
要使用数据必须先定义数组,定义数组的格式为:
Dim 数组名(数组长度1,数组长度2,……)as数组元素类型
数组长度是指数组元素的最大个数,可以看出,数组变量和普通变量的区别在于定义数组长度。数组元素类型根据需要确定,数组名由程序员根据数组的意义确定。
程序运行时,定义一个数组意味着分配存储空间,可以将定义数组当作用一条语句定义多个变量(即数组元素)。注意:下标是从0开始。
例如定义一个长度为2的int类型的数组: Dim scores(2) as integer
其内存示意图如图6-1所示:
score
Score(0) Score(1) Scores(2)
图6-1
引用数组元素的格式是:数组变量名(下标),下标是0开始编号。
scores数组可以使用的数组元素是score(0)、score(1)、score(2),也就是说,定义scores数组相当于定义了3个变量score(0)、score(1)、score(2)。
定义数组后,系统运行时就会为数组分配内存空间,数组的大小(能使用的数组元素的数量)也就确定了,再也不能更改数组的大小。
2. 数组的赋值
定义一个数组后,还要对数组赋值。因为数组元素的使用和普通变量是一样的,都必须先赋值才能使用。
例如如下的语句:
Scores(0)=56;scores(1)]=87;
访问数组不能超越数组的边界,如上面的数组scores,它的大小为3,能访问的数组元素是score[0]、score[1]、score[2],但是由于程序员的失误,可能引用数组元素score[3]或score[4],这就超越了数组的边界。
求数组元素中的最大值
6.3.1 二维数组
如果一个一维数组(本书将此数组称为外层数组),它的每个元素又是类型相同的一维数组(本书将此数组称为内层数组)时,便构成二维数组。类型相同的数组是指数组大小、元素类型相同。和一维数组一样,二维数组也要先定义和赋值,最后才能使用。
1. 二维数组的定义
二维数组的定义格式与一维数组类似,如下所示:
数组元素类型 数组名[外层数组元素的个数] [内层数组元素的个数];
一般将外层数组元素的个数称为下标1,内层数组元素的个数称为下标2。 显然,二维数组的元素个数为:外层数组元素的个数×内层数组元素的个数。 例如: static int a[3][4]; float b[2][3]; 2. 二维数组的初始化
与一维数组一样,定义一个二维数组后,相当于定义了多个变量,如上面的数组b,相当定义了以下6个变量:
b[0][0],b[0][1],b[0][2],b[1][0],b[1][1],b[1][2]。
变量都必须先赋值才能使用,所以定义二维数组后,要给该二维数组的全部或部分元素赋值,即对二维数组初始化。
二维数组的初始化有如下方法:
(1) 将数组的所有元素按相应顺序写在一个花括号内,各初值用逗号分隔,按数组元素的排列顺序给各元素赋值。例如:
int a[3][2]={0,1,2,3,4,5};
数组a中元素的排列顺序(按行数)如下: a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1]
所以上面的赋值语句使得:a[0][0]=0, a[0][1]=1, a[1][0]=2, a[1][1]=3, a[2][0]=4, a[2][1]=5。
从形式上看,一个二维数组:数组名[下标1][下标2],它的排列顺序类似于数学中的矩阵,下标1表示数组(矩阵)的行数,下标2表示数据的列数。习惯上,将下标1相同的元素称为行,将下标2相同的元素称为列。
存放表6-2中的姓名的二维数组的定义和初始化如下:
char names[2][5]={”张方”,”王晨”}; 其中names[0]的值为“张方”,names[1]的值为“王晨”。
(2) 分行给二维数组赋初值:将每行元素初值写在花括号内,并以逗号分隔,最后将所有行的元素写在一个总的花括号内。例如:
int a[3][2]={{0,1},{2,3},{4,5}};
这种方式比上种方式更直观,符合二维数组的特点,初始值与元素关系清楚,不易出错。并且用这种方式中可以只给某行元素的部分元素赋值。例如:
int a[3][2]={{0,1},{2},{4,5}}; 其中,a[1][1]没有赋值。
上面2种方式,在给全部数组元素赋初值时,可以不指定下标1,但是下标2必须指定。例如:
int a[][2]={0,1,2,3,4,5};
int a[][2]={{0,1},{2,3},{4,5}};
因为系统能够根据初值数目与下标2确定下标1。 (3) 分别给数组元素赋值,例如: int a[3][2]; a[0][0]=0; a[0][1]=1;
3. 二维数组的使用
经过二维数组的定义和初始化后,就可以使用二维数组了。与一维数组一样,二维数组的使用只能对单个数组元素进行,并且多使用二重循环结构实现。
下面用一个例子演示二维数组的定义、初始化和使用。
程序示例:将一个4×4的二维数组转置后输出,二维数组直接赋值,转置后的二维数组放在另一个二维数组中。转置是指交换行列的位置,即第i行第j列的元素在转置后成为第j行第i列的元素。
矩阵转置的源程序如下所示: 程序6-10
--------------------------------------------------------------------------------------------------------------- #include
int i,k;
int a[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}; int b[4][4];
for(i=0;i<4;i++) //将二维数组a转置,同时也是以数组b赋值 for(k=0;k<4;k++) b[i][k]=a[k][i];
for(i=0;i<4;i++) //显示转置后的矩阵 { for(k=0;k<4;k++) //内循环显示一行 printf(\每个元素占用5个字符的位置 printf(\ //每行显示完后换行 } }
--------------------------------------------------------------------------------------------------------------- 程序比较简单,读者应能从中了解二维数组的使用方法,包括定义、赋值以及使用数组元素。
6.4 数组作为函数参数
数组作为函数参数有2种方式:一是单个数组元素作为函数参数,这与普通变量作为函数参数的执行过程是一致的;二是整个数组作为函数参数。
在选择结构中介绍对3个学生的成绩进行了排序,并且留下了一个问题,如果学生人数很多,要求顺序输出学生的成绩,怎么办呢?现在利用数组和循环,就可以解决这个问题了。
假设有10个学生的成绩:3、5、7、9、1、2、34、43、22、12,要求按从小到大的顺序输出学生的成绩。在选择结构中介绍了选择法和插入法,下面介绍选择法,请读者自行完成插入法。
选择法排序是一种容易实现的对数据排序的算法,在选择结构中已介绍过,选择法以一定的顺序,每次选择最小的数(从小到大排序),分别与最前面的数交换。具体过程是:
1. 将成绩赋值给一个整形数组A,这个数组有10个元素,即A[0],A[1],…,A[8],
A[9]。
2. 以一个元素为基准,从一个方向开始扫描,比如从左至右扫描,首先以A[0]为基
准,从A[0],…,A[9]中找出最小的元素,将其与A[0]交换。
3. 将基准位置右移一位,重复上面的动作,即以A[1]为基准,找出A[1]~A[9]中最
小的,将其与A[1]交换。
重复上面过程的第2步和第3步,一直进行到基准位置移到数组最后一个元素时排序结束,此时基准左边(包括基准)所有元素均递增有序,而基准为最后一个元素,故完成排序。
以上过程有明显的重复步骤:找出一个数组中最小的元素,然后与这个数组中的第1个元素互换。按照循环结构一章所讲的步骤,将这个重复步骤用相同的语句表示,这些相同的语句就是内层循环,所以首先写出内层循环。内层循环找出基准后面的元素(包括基准)最小的元素的位置,最小的元素如果不是基准,则要与基准交换,这样保证基准是最小的元素。设外层循环变量为i,内层循环为j,第一次内层循环时,基准的位置为最左边的元素,即位置为0,所以i=0。用以下循环找出最小的元素的位置:
k=i; for(j=i+1;j<10;j++) if(a[j]
现在已找出最小的元素位置k,接下来是判断k是否基准的位置,如果不是则交换它们,程序如下:
if(i!=k) { temp=a[k]; a[k]=a[i]; a[i]=temp; }
这样内层循环就完成了,接下来套上外层循环,最终的程序如下: 程序6-13
--------------------------------------------------------------------------------------------------------------- #include
main() {
int a[10]={3,5,7,9,1,2,34,43,22,12},i,j,k,temp; for(i=0;i<9;i++) { k=i; for(j=i+1;j<10;j++) if(a[j]
for(i=0;i<9;i++) //这个循环用于显示数组元素,以便观察排序的结果 printf(\ }
--------------------------------------------------------------------------------------------------------------- 在前面介绍过,排序在编程中是一种基本运算,排序在编程用得很多,所以有必要学会用函数实现数组排序,在需要排序的时候调用函数即可。
显然,对数组进行排序的函数,其参数是整个数组,可用数组名作为函数参数。用数组名作为函数参数时,传递的是数组的起始地址,形参接受实参的起始地址值,形参和实参共用相同的存储区域。其结果是函数中形参值的改变,实参值也会相应的改变。这实际上是引用传递,即传递的是指针,我们会在指针一章中进一步谈到这个问题。
现在就来学习怎样用函数实现数组排序,然后在主程序中调用此函数。首先写出数组排序函数,显然函数的参数是数组,在下面的函数中,实现对数组a(形参)排序,代码如下:
void sortArray(int a[]) {
int i,j,k,temp;
for(i=0;i<9;i++) { k=i; for(j=i+1;j<10;j++) if(a[j]
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库VB6 数组在线全文阅读。
相关推荐: