Кривые Серпинского - Pascal ABC

Формулировка задачи:

Мучаюсь третий день! Не могу сделать так, чтобы порядок нужно было вводить с клавиатуры, не константой. Выдает кучу бредовых ошибок. Это изначальный вариант, через константу
program DGDGDFGDFG;
uses GraphABC;
const
   power=1; {порядок меняется в зависимости от изменяемого числа}
var
  h, x, y: integer;
function calcZ(i: integer): integer;
begin
   if i=0 then calcZ:=1
   else calcZ:=2*calcZ(i-1)+3;
end;
procedure DrawSegment(a, b: integer);
begin
Line(x, y, x+a*h, y+b*h);
x:=x+a*h;
y:=y+b*h;
end;
Procedure LineCD(i: byte); forward;
Procedure LineGH(i: byte); forward;
Procedure LineEF(i: byte); forward;
Procedure LineAB(i: byte);
begin
    if i>0 then
    begin
      LineAB(i-1);
      DrawSegment(1, 1);
      LineCD(i-1);
      DrawSegment(2, 0);
      LineGH(i-1);
      DrawSegment(1, -1);
      LineAB(i-1);
    end;
end;
Procedure LineCD;
  begin
   if i>0 then
   begin
    LineCD(i-1);
    DrawSegment(-1, 1);
    LineEF(i-1);
    DrawSegment(0, 2);
    LineAB(i-1);
    DrawSegment(1, 1);
    LineCD(i-1);
   end;
  end;
Procedure LineEF;
  begin
   if i>0 then
   begin
    LineEF(i-1);
    DrawSegment(-1, -1);
    LineGH(i-1);
    DrawSegment(-2, 0);
    LineCD(i-1);
    DrawSegment(-1, 1);
    LineEF(i-1);
  end;
end;
Procedure LineGH;
  begin
   if i>0 then
   begin
    LineGH(i-1);
    DrawSegment(1, -1);
    LineAB(i-1);
    DrawSegment(0, -2);
    LineEF(i-1);
    DrawSegment(-1, -1);
    LineGH(i-1);
   end;
end;
begin
  h := round(Window.Height/(calcZ(power) + 1));
  x := Window.Width div 2 - Window.Height div 2 + h;
  y := 0;
  moveto(x, y);
  LineAB(power);
  DrawSegment(1, 1);
  LineCD(power); DrawSegment(-1, 1);
  LineEF(power);
  DrawSegment(-1, -1);
  LineGH(power);
  DrawSegment(1, -1);
end.

Код к задаче: «Кривые Серпинского - Pascal ABC»

textual
program DGDGDFGDFG;
uses GraphABC;
var
  h, x, y, power: integer;
function calcZ(i: integer): integer;
begin
   if i=0 then calcZ:=1
   else calcZ:=2*calcZ(i-1)+3;
end;
procedure DrawSegment(a, b: integer);
begin
Line(x, y, x+a*h, y+b*h);
x:=x+a*h;
y:=y+b*h;
end;
Procedure LineCD(i: byte); forward;
Procedure LineGH(i: byte); forward;
Procedure LineEF(i: byte); forward;
Procedure LineAB(i: byte);
begin
    if i>0 then
    begin
      LineAB(i-1);
      DrawSegment(1, 1);
      LineCD(i-1);
      DrawSegment(2, 0);
      LineGH(i-1);
      DrawSegment(1, -1);
      LineAB(i-1);
    end;
end;
Procedure LineCD(i:byte);
  begin
   if i>0 then
   begin
    LineCD(i-1);
    DrawSegment(-1, 1);
    LineEF(i-1);
    DrawSegment(0, 2);
    LineAB(i-1);
    DrawSegment(1, 1);
    LineCD(i-1);
   end;
  end;
Procedure LineEF(i:byte);
  begin
   if i>0 then
   begin
    LineEF(i-1);
    DrawSegment(-1, -1);
    LineGH(i-1);
    DrawSegment(-2, 0);
    LineCD(i-1);
    DrawSegment(-1, 1);
    LineEF(i-1);
  end;
end;
Procedure LineGH(i:byte);
  begin
   if i>0 then
   begin
    LineGH(i-1);
    DrawSegment(1, -1);
    LineAB(i-1);
    DrawSegment(0, -2);
    LineEF(i-1);
    DrawSegment(-1, -1);
    LineGH(i-1);
   end;
end;
begin
repeat
write('Введите порядок кривой от 1 до 7 power=');
readln(power);
until power in [1..7];
Window.Clear;
  h := round(Window.Height/(calcZ(power) + 1));
  x := Window.Width div 2 - Window.Height div 2 + h;
  y := 0;
  moveto(x, y);
  LineAB(power);
  DrawSegment(1, 1);
  LineCD(power); DrawSegment(-1, 1);
  LineEF(power);
  DrawSegment(-1, -1);
  LineGH(power);
  DrawSegment(1, -1);
end.

6   голосов, оценка 4.333 из 5


СОХРАНИТЬ ССЫЛКУ