第六章 各就各位---数组一、学习目标 1. 掌握数组的声明和数组元素的引用2. 掌握动态数组与数组重定义以及与静态数组的差别3. 掌握利用数组进行排序、查找等操作4. 掌握控件数组的概念以及应用二、教学重点声明数组、初始化数组以及引用各个数组元素三、教学难点数组的概念以及应用四、教学方法1.演示法。2.实践法。五、教学手段与教学媒体多媒体网络教室。六、课时安排1课时。七、教学过程 教学内容、步骤与方法第一节 整装待发----认识数组一、概念例如要求一个班50名学生的平均成绩: 下标变量si 用数组表示为:s(i) 1、有关说明: (1).数组与普通变量一样,用来存放数据; (2).数组中的数据必须是同一类型; 2、数组与循环结合 for i=1 to 50 input s(i)next is=0for i=1 to 50 s=s+s(i)next iprint s/50end 二、数组的建立和引用 1、数组的建立 (1).dim (下标上界) 或dim (上界1,上界2)说明: 一般情况下,下标值从0开始 如:dim a(5) 即定义了a(0)、a(1)、…、a(5); 若要修改下标起始值,可用下面语句: option base n如:option base 1 dim a(5)则定义了5个变量a(1)、a(2)、a(3)、a(4)、a(5);若数组下标上界不超过10则可不必用dim定义数组。 (2)dim <(请记得收藏本站-一路高升范文网,以获取更多新鲜内容);数组名>(n1 to n2) 下标值的范围:-32768~32767 数组名与变量名的定义相同; 允许在同一模块中,数组名与变量名同名,它们不代表同一对象; dim a(100) a=3 dim语句中的上界可是常数或变量、表达式; 如: dim a(10) dim a(n) dim a(n+2) 但变量值一定先赋值 定义全局数组 dim shared a(50) 用dim 语句可定义变量类型dim as 其中是:integer(整型)、long(长整型)、single(单精度型)、double(双精度型)、string(字符串型); 但不能加类型定义符,如下写法是错误的: dim a& as long 在用dim语句定义了一个变量类型后,该变量名后面加上类型定义符或不加类型定义符都是合法的,且代表同一个对象。例如: dim a as long a=123456 a&=77777 print a , a& end 运行结果如下: 77777 77777 但程序中不能再用a作其它类型的变量名。2、数组的引用 引用数组元素(下标变量),即在括弧中指定下标; 在程序中,数组与其它变量的使用相同,即可参与运算,可以被赋值; 在引用数组时,数组名、类型、维数以及下标的范围,应与定义时一致; 同一模块中,数组和变量可同名,但数组与数组不能同名; 下列情况是不允许的: dim a(10,10) 或 dim a(50,50) dim a(15) dim a%(15) 3、静态数组和动态数组 静态数组——建立数组后,其维数和大小不能改变; 动态数组——在程序执行教程中,可改变大小或者被释放; qbasic规定:在dim 语句中用常数指定下、上界的数组为静态数组,如果用变量(或表达式)指定上下界的数组为动态数组。 (1).重定义语句 redim (上界)
如:dim s(20),x(20,30) …… √redim s(50) ×redim x(30) 只改变同名数组的大小,但不能改变维数;(2).释放数组语句 erase 释放数组所占据的空间;例1:释放和重定义数组: n=10dim a(n)for i=1 to n a(i)=i print a(i);next iprinterase aredim a(16)for i=1 to 16 a(i)=i print a(i);next iprintend 说明:.如果不使用erase语句释放数组,不能用dim语句对同一个数组两次定义;.用redim可改变数组的大小,而不必先用erase语句释放数组;.无论用dim或redim定义一个与原来数组同名的数组,可以改变数组中各维的上下界,而不能改变数组的维数。 (3).数组上、下界函数 lbound(,)——下界函数ubound(,)——上界函数 例: input n,mdim a(n to m)for i=lbound(a,1) to ubound(a,1) a(i)=i print a(i);next iprintdim b(10,15)for i=1 to ubound(b,1) for j=1 to ubound(b,2) b(i,j)=10*i+j print b(i,j); next jnext iprintend三、数组的应用 第二节 一字排开-----一维数组1、一维数组 只有一个下标的数组。 (1).数据统计 例: 输入n个学生的成绩,求平均成绩。 option base 1input "number of students is:";ndim s(n)for i=1 to n input s(i) sum=sum+s(i)next iaver=sum/nprint "aver=";averend 例: 输入n个学生的学号和成绩,要求输出平均成绩和高于平均分的学生学号及成绩。 option base 1input "number of students is:";ndim num(n),score(n)for i=1 to n input num(i),score(n) sum=sum+score(i)next iaver=sum/nprintprint "平均分是:";averprintprint "高于平均分的学生有:"print "学号","成绩"for i=1 to n if score(i)>aver then print num(i),score(i)next iend (2)、数据排序 例:从键盘输入10个数。要求按由小到大的顺序将它们打印出来; • 比较交换法 a1、a2、a3、a4、a5、a6、a7、a8、a9、a10 第一次:a1与a2、a3、a4、a5、a6、a7、a8、a9、a10比较第二次:a2与a3、a4、a5、a6、a7、a8、a9、a10比较第三次:a3与a4、a5、a6、a7、a8、a9、a10比较第四次:a4与a5、a6、a7、a8、a9、a10比较第五次:a5与a6、a7、a8、a9、a10比较第六次:a6与a7、a8、a9、a10比较第七次:a7与a8、a9、a10比较第八次:a8与a9、a10比较第九次:a9与a10比较 option base 1dim a(10)for i=1 to 10 input a(i)next ifor i=1 to 9 for j=i+1 to 10 if a(i)>a(j) then swap a(i),a(j) next jnext ifor i=1 to 10 print a(i);next iend6. 选择法 option base 1dim a(10)for i=1 to 10 input a(i)next ifor i=1 to 9 k=i for j=i+1 to 10 if a(k)>a(j) then k=j next j if ki then swap a(k),a(i)next ifor i=1 to 10 print a(i);next iend (3).数据查找(检索) 例: 设有n个学生,每个学生的数据包括:学号、姓名、性别、年龄、平均分等;要求输入一个学号,程序输出该学生的所有数据。 • 顺序查找法 假设:num(i)为学生学号,nam$(i)为姓名,num为查找对象。 sub search
for i=1 to n if num=num(i) then print "num";num(i) print "name";nam$(i) exit for end ifnext iif i>n then num ;"not found"end sub • 折半查找法(二分查找法); 对按一定规律(由小到大或由大到小)排列好的数据进行检索;假设:num(i)为按从小到大排列的学生学号,nam$(i)为姓名,num为查找对象。 sub se(请记得收藏本站-一路高升范文网,以获取更多新鲜内容)archtop=1bot=nfind=0do mid=int((top+bot)/2) if num=num(mid) then print "num";num(i) print "name";nam$(i) find=1 elseif numnum(mid) then top=mid+1 end ifloop until ((bot