You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将表示金字塔的数组传入自定义过程以执行后续操作

解决GraphABC中金字塔数组传递与复制的问题

现有代码的核心问题

  1. 数组索引错误:动态数组默认是0起始索引,但你用i := 1 to Length(arr)遍历,会导致越界(比如SetLength(arr,4)时,有效索引是0-3,i=4会访问不存在的元素)。
  2. DrawPyramid灵活性不足:固定使用clRed绘制,未充分利用数组传递的优势实现复用。
  3. 未封装金字塔数据:主程序中混合了数组赋值与绘制逻辑,不利于后续复制、修改操作。

修正后的实现方案

1. 优化DrawPyramid过程

增加颜色参数,并使用Low(arr)和High(arr)安全遍历数组:

uses GraphABC;

var 
  x, y: integer;

procedure kv(x, y: integer; color: TColor);
begin
  Rectangle(x, y, x + 20, y - 50);
  FloodFill(x + 10, y - 10, color);
end;

// 优化后的绘制过程:支持自定义颜色,安全遍历数组
procedure DrawPyramid(arr: array of array [1..2] of integer; color: TColor);
begin
  for var i := Low(arr) to High(arr) do
  begin
    kv(arr[i][1], arr[i][2], color);
  end;
end;

2. 构造与传递金字塔数组

将金字塔的坐标数组单独构造,再传递给DrawPyramid:

var
  pyramidSmall: array of array [1..2] of integer; // 小金字塔(3个块)
  pyramidLarge: array of array [1..2] of integer; // 大金字塔(5个块)
begin
  SetPenColor(clBlack);
  kv(40, 50, clGreen);

  // 构造小金字塔数组
  x := 80;  
  y := 100;
  SetLength(pyramidSmall, 3);
  for var i := 0 to 2 do
  begin
    pyramidSmall[i][1] := x - 20 * (i+1);
    pyramidSmall[i][2] := y;
  end;
  DrawPyramid(pyramidSmall, clOrange); // 传递数组并绘制

  // 构造大金字塔数组
  x := 120;
  y := 150;
  SetLength(pyramidLarge, 5);
  for var i := 0 to 4 do
  begin
    pyramidLarge[i][1] := x - 20 * (i+1);
    pyramidLarge[i][2] := y;
  end;
  DrawPyramid(pyramidLarge, clRed); // 传递数组并绘制

3. 实现金字塔复制

通过复制原数组的坐标并添加偏移量,实现同一金字塔在新位置绘制:

var
  pyramidSmallCopy: array of array [1..2] of integer;
begin
  // 复制小金字塔,x坐标偏移+100(向右移动)
  SetLength(pyramidSmallCopy, Length(pyramidSmall));
  for var i := Low(pyramidSmall) to High(pyramidSmall) do
  begin
    pyramidSmallCopy[i][1] := pyramidSmall[i][1] + 100;
    pyramidSmallCopy[i][2] := pyramidSmall[i][2];
  end;
  DrawPyramid(pyramidSmallCopy, clBlue); // 绘制复制后的金字塔
end.

关键说明

  • 数组兼容性:动态数组array of array [1..2] of integer可以直接传递给开放数组参数array of array [1..2] of integer,类型完全匹配。
  • 索引安全:用Low(arr)和High(arr)遍历数组,无需手动计算长度,避免索引越界问题。
  • 复用性:分离数组构造与绘制逻辑后,修改金字塔结构、复制或重新绘制都只需操作数组,无需重复编写绘制代码。

内容的提问来源于stack exchange,提问作者intelligent

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 12:15:47