【5.高级数据类型】5.动态数组

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;
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Janeb1018

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值