Кривые Серпинского - 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.

Объяснение кода листинга программы

  1. Программа начинается с объявления переменных h, x, y и power типа integer. Функция calcZ вычисляет значение z для заданного индекса i. Процедура DrawSegment рисует сегмент кривой на экране.
  2. В процедуре LineAB вызываются процедуры LineCD, LineGH и LineEF в зависимости от значения i. Если i больше нуля, то сначала вызываются эти процедуры, затем рисуется сегмент кривой.
  3. В процедуре LineCD вызываются процедуры LineEF и LineGH в зависимости от значения i. Если i больше нуля, то сначала вызываются эти процедуры, затем рисуется сегмент кривой.
  4. В процедуре LineEF вызываются процедуры LineGH и LineAB в зависимости от значения i. Если i больше нуля, то сначала вызываются эти процедуры, затем рисуется сегмент кривой.
  5. Программа повторяется, пока power не будет введено от 1 до 7. Затем окно очищается, вычисляется высота окна в единицах z, и координаты x и y устанавливаются таким образом, чтобы центр окна соответствовал началу кривой.
  6. Затем вызываются процедуры LineAB, DrawSegment и Window.Clear для рисования кривой на экране.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.333 из 5
Похожие ответы