5.动态数组
动态数组在定义和声明时只指定数组的类型,而不指定数组的大小,在程序运行时动态地开辟内存空间。
5.1一维动态数组
一维动态数组的定义格式:
type <数组类型名> = array of <基类型>;
变量声明方式与其他类型的变量一致。也可以直接声明动态数组类型的变量,格式:
var <数组变量名>: array of <基类型>;
动态数组在声明时没有给出下标类型,可以通过标准过程Setlength来设置。如:
var Ia: array of integer; begin Setlength(Ia, 10); end;
5.2一维动态数组示例
示例:输入一个整数n,随机产生n个数据保存到数组中,并在Memo控件中显示出来。界面如下图:
示例代码:
procedure TForm1.Button1Click(Sender: TObject); var i, n: Integer; a: array of Integer; begin // 确定按钮单击事件处理 n := strtoint(Edit1.Text); SetLength(a, n); randomize(); for i := low(a) to high(a) do a[i] := random(100); for i := low(a) to high(a) do Memo1.Lines.Add(inttostr(a[i])); end; procedure TForm1.Button2Click(Sender: TObject); begin // 清除按钮单击事件 Edit1.Text := ''; Memo1.Lines.Clear; end;
5.3多维动态数组
声明多维动态数组的方法采用递归定义的方式:
type <数组类型名> = array of array of ... array of <基类型>;
多维数组变量的定义与其他变量的定义是相同的,也可以是:
var <变量名>: array of array of ... array of <基类型>;
多维动态数组变量声明后,同样使用标准过程Setlength来设置其大小,如:
var a: array of array of integer; begin Setlength(a, 2, 3); end;
动态数组的下标最小值默认为0。
在Object Pascal中,允许创建长度不等的动态数组,如上面的2行3列数组,可以这样设置:
Setlength(a, 2); Setlength(a[0], 2); Setlength(a[1], 3);
这样就将数组a设置成列数不等的数组。
5.4多维动态数组示例
示例:用“*”输出等腰三角形与直角三角形,界面如下图:
代码如下:
procedure TForm1.Button1Click(Sender: TObject); var a: array of array of string; i, j: integer; s: string; begin // 等腰三角形 Setlength(a, 7); for i := 0 to 6 do Setlength(a[i], 7 + i); for i := Low(a) to High(a) do for j := Low(a[i]) to High(a[i]) do a[i, j] := ' '; for i := Low(a) to High(a) do for j := Low(a[i]) to High(a[i]) do if i + j >= 6 then a[i, j] := '*'; for i := Low(a) to High(a) do begin s := ''; for j := Low(a[i]) to High(a[i]) do s := s + a[i, j]; Memo1.Lines.Add(s); end; end; procedure TForm1.Button2Click(Sender: TObject); var a: array of array of char; i, j: integer; s: string; begin // 直角三角形 Setlength(a, 15); for i := Low(a) to High(a) do Setlength(a[i], i + 1); for i := Low(a) to High(a) do for j := Low(a[i]) to High(a[i]) do a[i, j] := '*'; for i := Low(a) to High(a) do begin s := ''; for j := Low(a[i]) to High(a[i]) do s := s + a[i, j]; Memo1.Lines.Add(s); end; end; procedure TForm1.Button3Click(Sender: TObject); begin // 清除 Memo1.Lines.Clear; end;