您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 第4章 数组与记录类型
第4章数组与记录类型上章回顾:理解顺序结构、选择结构和循环结构程序设计的思想理解双分支语句和多分支语句的含义掌握利用双分支语句和多分支语句设计分支程序的方法理解循环的概念掌握循环程序设计的方法以及常用的算法,如累加求和、穷举法等本章要点:理解数组的概念,含义与定义方法掌握引用数组元素的方法理解记录的概念,含义与定义方法掌握使用记录常用方法4.1循序渐进学理论4.1.1数组的定义及使用数组是一些具有相同类型的元素按一定顺序组成的序列。其中每个元素由其对应的位置来指定,这个位置就是数组的索引号(又称下标),数组元素与索引号是一一对应的,用户可以通过这个索引号来存取数组的每个元素。数组中的各元素是顺序地安排在内存中一段连续的存储空间中。按照数组在定义时是否确定了元素个数可以将数组分为静态数组和动态数组。1数组的定义在Delphi5/6版本中的ObjectPascal引入了动态数组,数组的内存分配不再局限于静态的,可以采用动态方式为数组分配内存区。因此,数组可分为静态数组和动态数组两种类型。(1)静态数组静态数组在程序初始化时必须分配内存单元,明确其固定的大小和元素的数据类型。一维静态数组数组通常可分为一维、二维和多维数组,在ObjectPascal中,定义一个一维数组类型,其声明格式为:Type〈数组类型标识符〉=array[〈下标类型〉]of〈基类型〉;例如:(1)Typemyarry=array[1…100]ofreal;(2)Typemcolor=(red,green,blue);Typemint=0…50;myarry=array[mcolor]ofinteger;test1=array[mint]ofmcolor数组变量:array1,array2:myarray;tcolor:test1;注意事项:数组类型和数组变量:程序不能直接使用类型,可以使用变量;定义时可以二合一;varayyay1,array2:array[0…100]ofreal;访问数组元素,通过数组名加方括号,括号内为数组下标值,下标值符合取值范围,下标可以为表达式;标准函数Low和High可以返回数组的最小和最大下标值,Length可以返回数组的长度;数组赋初值通常通过循环;二维静态数组二维数组是指一个一维数组中的元素类型本身又是一个一维数组。其一般形式为;Type〈数组标识符〉=Array[〈下标类型1〉]ofArray[〈下标类型2〉]of〈元素类型〉;理解为每行就是一个元素,即又是一个一维数组的递归定义;也可以把上述形式简写成下面的形式:Type〈数组标识符〉=Array[〈下标类型1〉,〈下标类型2〉]of〈元素类型〉;通常使用第二种方式的定义;例如:Typetp=array[1…5]ofarray[1…10]ofreal;tmax=array[1…5,1…20]ofinteger;VarTr1:tp;tr2:tmax;array1:[1…5,1…8]ofinteger;二维数组赋初值通常采用二重循环;多维静态数组多维静态数组的一般格式为:Type〈数组类型标识符〉=array[〈下标类型1〉,〈下标类型2〉,…,〈下标类型n〉]of〈基类型〉;TypeTest1=array[1..10,1..10,1..30]ofinteger;VarMyarray:array[0..5,0..6,0..8]ofreal;使用静态数组的注意事项零基准数组。所谓零基准数组,就是下标从零开始的数组,例如:array[0..5]ofchar数组的整体赋值。假设有两个数组array1和array2,其变量定义如下:Vararray1,array2:[1..10]ofchar;如果要把array2中每一个元素的值相应赋值给array1中的元素,一般是使用For语句,例如:ForI:=1To10Doarray1[i]:=array2[i];把数组作为过程或函数的形参。ProcedureMyProc(varArray1:Array[1..10]ofInteger);Began…End;上述程序中,数组的定义和传递并在一起进行,并且Array1是作为变量参数实现地址传递。另外,数组也可以作为函数的返回类型。开放式数组数组作为形参传递给过程或函数是,长度可以不确定,可以传递不同长度的数组作为实数;例如:定义两个长度不同的数组Varx1:array[1…10]ofreal;Varx2:array[3…8]ofreal;Proceduremyproc(x:arrayofreal)Begin…end;BeginMyproc(x1);Myproc(x2);End;开放数组是零基准数组,因此数据和下标可能不相符开放数组可以作为数值参数,变量参数,常量参数实现传递也可以直接使用Myproc([1,2,3,4]);Myproc([1,2,3.4.5.6])【例4-1】利用数组求出任意10个数中的最大及最小值。如程序所示【例4-2】利用二维数组建立一个8×8的方阵,该矩阵对角线元素为8,其余元素为1,结果显示在列表组件ListBox1中。如程序所示静态数组典型应用procedureTForm1.Button1Click(Sender:TObject);vari,ma,mi:integer;a:array[1..10]ofinteger;beginfori:=1to10dobeginrandomize;//初始化随机函数a[i]:=random(i*100);//产生10个随机数edit1.text:=edit1.text+inttostr(a[i])+''end;ma:=a[1];mi:=a[1];fori:=2to10dobeginifma=a[i]thenma:=a[i];ifmi=a[i]thenmi:=a[i]end;edit2.text:=inttostr(ma);//输出最大值edit3.text:=inttostr(mi);//输出最小值end;procedureTForm1.FormCreate(Sender:TObject);vara:array[1..8,1..8]ofinteger;i,j:integer;st:string;beginfori:=1to8doforj:=1to8doif(i=j)or(i=9-j)thena[i,j]:=8elsea[i,j]:=1;fori:=1to8dobeginst:=‘’;//每一行初始化为空;forj:=1to8dost:=st+inttostr(a[i,j])+'';listbox1.items.Add(st)EndEnd(2)动态数组一维动态数组一维动态数组的声明格式为:Type〈数组类型标识符〉=arrayof〈基类型〉;也可在变量声明中直接声明动态数组,其格式为:Var〈变量名〉:arrayof〈基类型〉;注意事项:动态数组没有给定数组的下标类型,具有不确定的大小;动态数组的大小通过调用过程setlength来确定;例如:Varmyarray:arrayofinteger;Beginsetlength(myarray,10);end;多维动态数组Type〈数组类型标识符〉=arrayofarrayof…arrayof〈基类型〉;Var〈变量名〉:〈动态数组类型标识符〉;或Var〈动态数组变量名〉:arrayofarrayof…arrayof〈基类型〉;例如,如下声明了一个二维动态数组变量TypeTMessageGrid=arrayofarrayofstringVarMsGS:TMessageGrid;Delphi支持创建行的长度不等的动态数组例如:Varmyarray1:arrayofarrayofstring;Varmyarray2:arrayofarrayofstring;//方法一setlength(myarray1,2,3);下标从0开始//方法二setlength(myarray2,2);//设定动态数组为2行,列未定setlength(myarray2[0],2);//0行为2列setlength(myarray2[1],3);//1行为3列所有元素为:myarray2[0,0],myarray2[0,1],myarray2[1,1],myarray2[1,1],myarray2[1,2]【例4-3】创建一个三角形的矩阵,并在一个ListBox列表框中显示出来。如程序所示动态数组典型应用procedureTForm1.Button1Click(Sender:TObject);VarA:arrayofarrayofstring;I,J:Integer;Tempstr:string;BeginListBox1.Clear;SetLength(A,10);ForI:=Low(A)toHigh(A)doBeginSetLength(A[I],I);ForJ:=Low(A[I])toHigh(A[I])doBeginA[I,J]:=IntToStr(J+1)+'';ifI0thentempstr:=tempstr+A[I,J];end;ifI0thenbeginListBox1.Items.Add(tempstr);Tempstr:='';End;End;End;ObjectPascal的记录类型跟数据库中的记录概念很相似,记录类型中的元素可以理解为数据库中的字段。事实上,ObjectPascal正式借用了数据库中的记录和字段的概念。4.1.2的定义及使用1记录类型的定义(1)声明一个记录类型的一般格式为:Type〈记录类型标识符〉=Record〈域名表1〉:〈类型1〉;〈域名表2〉:〈类型2〉;…〈域名表n〉:〈类型n〉;End;例如:TypeTEmployee=recordName:string[20];YearHired:1990..2000;Salsry:Double;Position:string[20];end;注意事项:标识符符合命名规则;记录类型标识符可以和域名标识符重名;域名标识符之间不允许重名;记录类型不能直接使用,使用之前,声明记录类型变量;(2)访问记录域与With语句在程序设计中,记录类型经过声明并建立实例之后就可以使用了。使用记录类型实际上是对记录的字段进行访问,由于记录类型中元素的类型不同,因此不能像使用数组一样使用下标。访问记录域的方法有两种:限定访问记录字段和使用With语句。限定访问记录中的字段在ObjectPascal中,限定访问记录中某个字段的格式:〈记录变量名〉.〈字段名〉;TypeTEmployee=recordName:string[20];YearHired:1990..2000;Salary:Double;Position:string[20];end;Varnewem1,newem2:TEmployee访问记录字段:单个字段赋值:newem1.Salary:=1000;所有字段赋值:beginnewem1.name:=‘张三’;newem1.yearhired:=1993;newem1.salary:=2000.00;newem1.position:=‘主管’;记录的整体赋值。尽管记录中的每一个字段可以进行各种合法的运算,但记录作为一个整体,只能进行赋值运算,即把一个记录整体赋给另一个类型一致的记录。例如:VarCust1,Cust2:Customer;Cust1:=Cust2;赋值号右边的记录变量必须是有值的,所谓有值是指记录的每个字段都赋值。记录与数组。记录与数组的相同点是:两者都是构造类型,是多个相关数据的集合,都可以整体赋值。记录如数组的不同点是:1)数组中元素的类型是相同的,而记录中的字段可以是不同类型。2)数组中元素的个数在一定范围内是可变的,而记录中字段的数量是固定的。3)数组的元素是通过数组变量名加方括号和下标来访问的,而记录中的字段是通过记录变量名加一个小圆点和字
本文标题:第4章 数组与记录类型
链接地址:https://www.777doc.com/doc-4048619 .html