版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第七章 数组和记录,一维数组和数组元素 一维数组应用举例 二维数组和数组元素 二维数组应用举例 记录类型 有关数组和记录的常用算法,数组和数组元素的概念,QBASIC用“数组”来代表具有相同属性的一组数。数组中各个数称为“数组元素”。数组中每一个数据分别用序号来标识。 数组是有序数据的集合。或者说,数组是用一个名字来代表顺序排列的一组数。 有关数组的说明: 数组元素的地位和作用与简单变量相当它们两者都能用来存放一个数据。 数组中的数据必须是同一个类型,不允许在同一数组中同时存放不同类型的数据。 数组中各元素在内存中占据一组连续的存储单元。 数组与循环结合使用,可以很方便地对大批数据进行处理。,
2、S数组,S(1),S(2),S(3),S(4),S(5),S(6),数组的表示形式,A (7),数组元素,数组名,数组元素的下标可以是常数、变量甚至用数组元素来表示: a(3): -下标是常数 a(i): 当i=3,相当于a(3)-下标是变量 a(i*3-j): 当i=3,j=6,相当于a(3)-下标是表达式 a(b(4): 当b(4) =3,相当于a(3)-下标是数组元素 下标的值只能是整数,如果下标的值带有小数,则系统会自动四舍五入后取整。 a(2)=29: a(3)=35 PRINT a(2.4),a(2.6) (执行结果:29 35) 对数组元素的引用,必须把下标放在一对紧跟数组名的括
3、号内。 s(7)和s7是有区别的,前者是一个数组元素,后者是一个简单变量,一维数组,如果一个数组的元素只有一个下标,那么这个数组称为一维数组。或者说,用一个数组名和一个下标就能唯一地标识一个数组元素的就是一维数组。 例 输入n个实数,求平均数。 设一个一维数组a,用数组元素存放各个实数项,可编写出程序如下: OPTION BASE 1 input the total number of real:; n DIM a(n) FOR i=1 TO n INPUT a(i) sum=sum+a(i) NEXT i average=sum/n PRINT average=; average END,运
4、行结果如下: the total number of real:5 ?78.5 ?97.5 ?100.2 ?98.8 ?81 average=91.2,数组的建立DIM语句(1),QBASIC提供两种格式的DIM语句: 1)DIM语句的格式 DIM是Dimension的缩写,意为“定维”。DIM语句称为“数组说明语句”或“定维语句”。 对一维数组,其基本格式为: DIM数组名(下标上界) 默认的下标值从0算起。 例如:DIM a(100) QBASIC允许改变下标值的下界,即可以将下标值的下界由0改变为1。此时应用OPTION BASE语句来指定下标值的下界。其一般格式为: OPTION BA
5、SE n n只有0和1两个值,不能是其它数字。 QBASIC规定,如果下标的上界(即可用的下标最大值)不超过10,则可以不必用DIM语句定义数组。,数组的建立DIM语句(2),2)DIM语句的格式这是QBASIC扩充的功能。它允许用户自己指定下标的下界,即下标的下界可以不是0或1。 如: DIM b(-2 TO 4) 定义了一个一维数组b,下标下界为-2,上界为4。 QBASIC规定: 下标值的范围为-32768,32767。,定义数组时要注意的几点,数组名的定名规则与变量名相同。应尽可能使数组“见名知义”; 数组定义语句必须放在数组元素使用之前; 在同一个程序模块中,数组名可以与变量名同名;
6、 如:DIM a(10) : a=1 DIM语句中的下标可以是常数,也可以是变量或表达式。对用变量名或表达式定义下标的数组属动态数组,可以用REDIM语句重新定维,或用ERASE语句释放所占内存空间。 如:m=20 :DIM a(m+10) (动态定义数组) DIM a(10) (错误) REDIM a(10)(正确) 数组不可以整体操作,对数组的操作只能通过数组元素,例如以下的操作试图将所有的数组元素赋值10是错误的: DIM a(10) AS SINGLE: a=10,静态数组和动态数组,静态数组是指建立数组后到运行结束,数组的维数和大小是不能再改变的。 动态数组在程序执行过程可中改变数组
7、的大小,或者释放数组所占用的空间。 QBASIC规定,在DIM语句中用常数指定下标上、下界的数组为静态数组,它的大小是不能改变的。如果在DIM语句中用变量或表达式指定下标上、下界的数组是动态数组,它的大小是可以改变的,也可以释放。 对动态数组的操作,可以使用以下语句。 1.REDIM语句(重定义语句) REDIM是redimension(重定维)的意思。用它来改变已定义的同名数组的大小,但不能改变数组的维数。静态数组不可以重复定义! 2.ERASE语句(释放语句) 此语句的功能是释放数组所占据的空间。静态数组使用ERASE语句是将数组元素的值重新置零。,重新定义动态数组的方法,用ERASE语句
8、释放动态数组所占内存,然后用DIM语句重新定义: DIM n AS INTEGER,m AS INTEGER n=3:m=4 DIM a(n) ERASE DIM a(m) 用REDIM语句重新定义: INPUT n DIM a(n) REDIM a(50) REDIM a(30),定义数组为全局变量,和简单变量相同,可以在DIM语句内加上关键字SHARED,使得语句内所定义的数组为全局变量。例如: DIM SHARED a(50)AS DOUBLE 可以用COMMON语句来说明数组为全局变量。例如: COMMON SHARED a(),b() DIM n AS INTEGER DIM a(2
9、0) INPUT n DIM b(n) COMMON 语句在说明一个数组为全局变量时,在数组后的一对括号内应当是空的。 COMMON 语句必须置于任何可执行的语句之前,而DIM可以在程序中的任何位置(但必须在使用数组前)。,数组的引用,在建立一个数组以后,即可对数组或数组元素进行操作。 引用数组元素的办法是在数组名后的括弧中指定下标。 如:a(3),b(2) 一般情况下,在程序中凡允许简单变量出现的地方,都可以用数组元素代替。数组元素可以参加表达式的运算,可以被赋值。 如:a(1)=10: a(2)=10: a(3)=10: Total=a(0)+a(1)+a(2) 引用数组元素时,数组名、类
10、型和维数必须与定义数组时一致。 引用数组元素时,下标值应在建立数组时所指定的范围内。 同一程序模块中,数组和变量可以同名,但它们不是同一个对象。,过程之间数组的传递,独立模块的子程序或函数的形参除了可以是变量外,还可以是数组。例如: SUB ss(n AS INTEGER,m AS INTEGER,a() AS INTEGER) 其中:n,m是变量,a是数组,其后的括号不能省略 在形参中,不可以出现数组元素名; 在调用上面的子程序时,与a()对应的实参应当是类型完全一致的数组名。例如: DIM b(20) AS INTEGER,i AS INTEGER,j AS INTEGER CALL ss
11、(i,j,b() 在调用语句中,数组名后的一对括号不可缺少; 当形参为变量时,对应的实参可以是数组元素。例如: CALL ss(b(1),b(3),b() 数组传递时形参和实参之间是按地址传递数据,共用相同的存储单元。,一维数组举例,例1:统计学生各个分数段上学生的人数。,SUB count (a() AS SINGLE) DIM q AS INTEGER, r AS INTEGER READ q WHILE (q 0) r = INT(q / 10): a(r) = a(r) + 1 READ q WEND END SUB,一维数组举例,例2:a数组中存放n个互不相同的数据,请从a中删除与x
12、(键盘输入)相同的那个元素。,(删除后),分析:假设输入x=85,FUNCTION find% (a() AS INTEGER, n AS INTEGER, x AS INTEGER) DIM i AS INTEGER a(0) = x i = n WHILE (a(0) a(i) i = i - 1 WEND find% = i END FUNCTION,步骤1:找到X所在的位置,步骤2:从找到X的位置顺序前移数据,SUB delmove (a() AS INTEGER, n AS INTEGER, p AS INTEGER) DIM i AS INTEGER FOR i = p TO n
13、- 1 a(i) = a(i + 1) NEXT i n = n - 1 END SUB,例3:冒泡法排序。假设数组中存放n个数据,请按由小到大的顺序排序。,一维数组举例,我们以6个数据来说明其思路:,a(1)和a(2)比,即5和7比,不对调,因为57,a(2)和a(3)行,即7和4比,对调,因为74,a(3)和a(4)比,即7和3比,对调,因为73,a(4)和a(5)行,即7和8比,不对调,因为78,a(5)和a(6)比,即8和6比,对调,因为86,排序结束后数组中数的排列情况,第一次排序结束后数组中数的排列情况,a(1)和a(2)比,即5和4比,对调,因为54,a(2)和a(3)行,即5和
14、3比,对调,因为53,a(3)和a(4)比,即5和7比,不对调,因为57,a(4)和a(5)行,即7和6比,对调,因为76,第二次排序结束后数组中数的排列情况,SUB mysort (x() AS INTEGER, n AS INTEGER) DIM j AS INTEGER, i AS INTEGER FOR j = 1 TO n - 1 FOR i = 1 TO n - j IF x(i) x(i + 1) THEN SWAP x(i), x(i + 1) NEXT i NEXT j END SUB,冒泡法程序设计:,例4:选择法排序。假设数组中存放n个数据,请按由小到大的顺序排序。,我们
15、以6个数据来说明其思路:,一开始p=1,m=5(红色字符表示p指向的位置),m和a(2)比,p指向a(1)至a(2)最小数所在位置,m=5,m和a(3)比,p指向a(1)至a(3)最小数所在位置,m=4,m和a(4)比,p指向a(1)至a(4)最小数所在位置,m=3,m和a(5)比,p指向a(1)至a(5)最小数所在位置,m=3,m和a(6)比,p指向a(1)至a(6)最小数所在位置,m=3,一维数组举例,将找到的最小数与第一个数互换,第二轮循环p=2,m=7(红色字符表示p指向的位置),m和a(3)比,p指向a(2)至a(3)最小数所在位置,m=4,m和a(4)比,p指向a(2)至a(4)最
16、小数所在位置,m=4,m和a(5)比,p指向a(2)至a(5)最小数所在位置,m=4,m和a(6)比,p指向a(2)至a(6)最小数所在位置,m=4,将第二轮找到的次小数与第二个数互换,SUB mysort (x() AS INTEGER, n AS INTEGER) DIM j AS INTEGER, i AS INTEGER, p AS INTEGER FOR j = 1 TO n - 1 p = j FOR i = j + 1 TO n IF x(p) x(i) THEN p = i NEXT i IF (p j) THEN SWAP x(j), x(p) NEXT j END SUB,
17、选择法程序设计:,例5:将n个整数在数组中排序,排序后在其中插入一个数,使插入后的数仍然又序。,一维数组举例,插入前数组:n=6,FUNCTION posit% (a() AS INTEGER, n AS INTEGER, x AS INTEGER) DIM p AS INTEGER a(n+1) = x p=1 WHILE (xa(p) p = p+1 WEND posit% =p END FUNCTION,定位X所在的位置,从找到最后一个元素开始顺序后移数据,SUB inmove (a() AS INTEGER, n AS INTEGER, p AS INTEGER, x AS INTEG
18、ER) DIM i AS INTEGER FOR i = n TO p STEP -1 a(i+1) = a(i ) NEXT I a(p) = x n = n +1 END SUB,二维数组,二维数组的定义形式为: DIM数组名(第一维下标的上界,第二维下标的上界) 如:DIM a(10,10), DIM a(m,n) 动态数组DIM数组名(第一维下标下界TO第一维下标上界,第二维下标下界TO第二维下标上界) 如:DIM a(-3 TO 15, 1 TO 8),W(2,3),数组名,行号,列号,两个下标中间用逗号分隔,基本要求,掌握一维数组和二维数组的定义方法; 掌握使用一维数组的常用算法。
19、,例1 有一个nm的矩阵a,求全部元素的平均值。设该矩阵为 34的矩阵: 67 87 90 56 77 88 99 100 64 95 1 65,程序如下: n=3:m=4 DIM a(n,m) sum=0 FOR i=1 TO n FOR j=1 TO m READ a(i,j) sum=sum+a(i,j) NEXT j NEXT I aver=sum/(n*m) DATA 67,87,90,56 DATA 77,88,99,100 DATA 64,95,1,65 END,二维数组应用举例,二维数组应用举例,例2 给出一个班级中学生的学号和每位学生6门课程的成绩。假设每班不超过20人。求出
20、每名同学的平均成绩,按平均成绩排名次,输出一张学生成绩单,如下所示:,* No. Q1 Q2 Q3 Q4 Q5 Q6 AVE * 1 2306 98 92 100 97 90 97 95.7 2 2304 80 90 91 88 95 99 90.5 3 2305 83 82 79 85 77 84 81.7 4 2308 85 73 80 77 83 86 80.7 5 2307 78 82 77 86 83 73 79.8 6 2301 65 57 71 75 82 69 69.8 7 2302 70 68 83 59 73 64 69.5 8 2303 45 38 44 48 61 52
21、 48 *,DATA 2301,65,57,71,75,82,69 DATA 2304,80,90,91,88,95,99 DATA 2307,78,82,77,86,83,73 DATA 2303,45,38,44,48,61,52 DATA 2305,83,82,79,85,77,84 DATA 2302,70,68,83,59,73,64 DATA 2306,98,92,100,97,90,97 DATA 2308,85,73,80,77,83,86,0,SUB readin (n AS INTEGER, m AS INTEGER, s() AS INTEGER, t() DIM x A
22、S INTEGER, i AS INTEGER n = 0 READ x WHILE x 0 n = n + 1: s(n) = x FOR i = 1 TO m READ t(n, i) NEXT i READ x WEND END SUB,1、数据读入子程序:,2、求平均分子程序:,SUB getave (n AS INTEGER, m AS INTEGER, t(), a() DIM i AS INTEGER, x AS SINGLE, j AS INTEGER FOR i = 1 TO n x = 0 FOR j = 1 TO m x = x + t(i, j) NEXT j a(i)
23、 = INT(x / m * 10 + .5) / 10 NEXT i END SUB,3、按平均成绩排序子程序:,SUB mysort (n AS INTEGER, m AS INTEGER, s() AS INTEGER, a(), t() DIM i AS INTEGER, p AS INTEGER, j AS INTEGER, k AS INTEGER FOR i = 1 TO n - 1 p = i FOR j = i + 1 TO n IF a(p) j THEN SWAP a(p), a(i) SWAP s(p), s(i) FOR k = 1 TO m SWAP t(p, k)
24、, t(i, k) NEXT k END IF NEXT i END SUB,SUB outtab (n AS INTEGER, m AS INTEGER, s() AS INTEGER, a(), t() DIM i AS INTEGER, j AS INTEGER PRINT CALL stars(52) PRINT TAB(7); No.; TAB(13); Q1; TAB(19); Q2; PRINT TAB(25); Q3; TAB(31); Q4; TAB(37); Q5; PRINT TAB(43); Q6; TAB(49); AVE CALL stars(52) FOR i =
25、 1 TO n PRINT i; TAB(6); s(i); FOR j = 1 TO m PRINT TAB(j + 1) * 6); t(i, j); NEXT j PRINT TAB(48); a(i) NEXT i CALL stars(52) END SUB,4、输出子程序:,二维数组应用举例,例3 求以下4个公司1周电视机的销售总额。,SUB readin (m AS INTEGER, n AS INTEGER, a(), s() DIM i AS INTEGER, j AS INTEGER FOR i = 1 TO m FOR j = 1 TO n READ a(i, j) NE
26、XT j NEXT i FOR i = 1 TO n READ s(i) NEXT i END SUB,1、读入数据子程序:,2、求总销售额子程序:,SUB count (m AS INTEGER, n AS INTEGER, a(), s(), t() DIM i AS INTEGER, j AS INTEGER FOR i = 1 TO m t(i) = 0 FOR j = 1 TO n t(i) = t(i) + a(i, j) * s(j) NEXT j NEXT i END SUB,记录类型,在数组中只能用来存放一组类型相同的数据,数组的赋值必须是对其数组元素一一赋值。 在实际事务中
27、我们会碰到一组由不同类型数据构成的数据。比如对于一个学生,姓名是字符型、学号是长整型、成绩是单精度型。 QBASIC允许构造一种称作“记录”的数据类型。“记录”是较为复杂,但又非常灵活的数据类型。,记录类型的定义,TYPE 记录类型名 成员名1 AS 数据类型名 成员名2 AS 数据类型名 成员名3 AS 数据类型名 END TYPE 举例: TYPE student sNum AS LONG sName AS STRING*12 sex AS STRING*1 sc AS adate END TYPE,说明:AS子句的“类型名”可以是另一个已说明过的记录类型,称为记录的嵌套: TYPE ad
28、ate d as integer m as integer y as integer END TYPE TYPE student sNum AS LONG sName AS STRING*12 sex AS STRING*1 sc AS adate birthday AS adate END TYPE,记录类型变量、数组说明,定义记录类型只是列出该记录的组成情况,标志着这种类型的结构“模式”已存在,程序并没有因此而分配任何存储空间。真正占有存储空间的仍应是具有相应记录类型的变量、数组,只有这些“实体”才可以用来存放记录中的数据。因此,在使用记录类型的变量、数组之前,必须先对这些变量、数组进行说
29、明; 如果定义了以上student记录类型,可以用以下方式说明记录类型的变量、数组: DIM std AS student,pers(5) AS student 以上说明一个student记录类型的变量和std和具有5个元素的pers数组,数组中的每个元素都是student记录类型。,对记录类型变量中数据的引用,假设已经定义了student记录类型,并由如下说明语句: DIM std AS student,pers(5) AS student 对记录成员的引用: 一般格式:记录变量名(数组名).成员名 记录类型变量的引用:std.snum,std.sname,std.sex 内嵌记录成员的引用
30、:std.birthday.d, std.birthday.y 记录类型数组的引用:pers(1).snum,pers(2).sex 相同记录类型变量之间的整体赋值: DIM std1 AS student, std2 AS student std2=std1 (假设std1已经有数据,则其每个成员的值都赋给std2。这种赋值方法很简捷,但必须保证赋值号两侧的变量类型相同) 在模块间传递记录型变量: 调用子程序:CALL try(std1) 子程序首行:SUB try(ad as student) 记录类型的实参和形参之间只能“按地址结合”,记录类型变量、数组举例,Name Sex Mouth Year Score WANG MING M 06 1980 89.5 LI NING F 07 1979 91.5 CHEN HONG M 01 1980 92 ,读入一组学生数据到记录类型
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026江西格润新材料有限公司招聘化验员岗位1人备考题库及一套完整答案详解
- 化肥减量替代政策的农户响应研究报告
- 2026-2030中国资产管理行业市场发展分析及竞争格局与投资战略研究报告
- 2026年河北石家庄市裕华区中考一模化学试卷
- 2026年山东省济南市历下区中考一模考前示范化学试卷
- 2026浙江台州市消防救援支队指挥中心招聘专职消防员2人备考题库及答案详解(典优)
- 2026四川成都市民政精神卫生中心(成都市德康医院)招聘3人备考题库含答案详解
- 2026广东东莞市东城街道办事处招聘编外聘用人员17人备考题库(第一批)完整答案详解
- 2026中国农业科学院北京畜牧兽医研究所博士后招聘47人备考题库含答案详解
- 2026云南省商务领域第一批“银龄工程师”招募46人备考题库附答案详解(典型题)
- 2026智能工厂梯度培育行动专项申报解读及建设方案
- 2026届西藏自治区拉萨市高三下学期第二次联考数学试卷(解析版)
- 2026届浙江省杭州市高三二模英语试题(含答案和音频)
- 2026届江苏省南京市、盐城市高三一模物理卷(含答案)
- 巴楚钒钛磁铁矿选矿项目(600万吨-年)环境影响报告书
- 全屋定制培训课件
- 国企风控面试常见问题解析与应对策略
- 2025年海东辅警协警招聘考试真题附答案详解(满分必刷)
- 天津市广通信息技术工程股份有限公司(所属公司)招聘笔试题库2025
- 灭菌物品召回流程
- 贵州中烟考试真题2025
评论
0/150
提交评论