Кривые Серпинского - 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.
Объяснение кода листинга программы
- Программа начинается с объявления переменных
h,x,yиpowerтипаinteger. ФункцияcalcZвычисляет значениеzдля заданного индексаi. ПроцедураDrawSegmentрисует сегмент кривой на экране. - В процедуре
LineABвызываются процедурыLineCD,LineGHиLineEFв зависимости от значенияi. Еслиiбольше нуля, то сначала вызываются эти процедуры, затем рисуется сегмент кривой. - В процедуре
LineCDвызываются процедурыLineEFиLineGHв зависимости от значенияi. Еслиiбольше нуля, то сначала вызываются эти процедуры, затем рисуется сегмент кривой. - В процедуре
LineEFвызываются процедурыLineGHиLineABв зависимости от значенияi. Еслиiбольше нуля, то сначала вызываются эти процедуры, затем рисуется сегмент кривой. - Программа повторяется, пока
powerне будет введено от 1 до 7. Затем окно очищается, вычисляется высота окна в единицахz, и координатыxиyустанавливаются таким образом, чтобы центр окна соответствовал началу кривой. - Затем вызываются процедуры
LineAB,DrawSegmentиWindow.Clearдля рисования кривой на экране.