Кривые Серпинского - 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
для рисования кривой на экране.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д