Вывести фигуру Z из символов (*) - Free Pascal
Формулировка задачи:
Каждая последующая фигура начинается с середины предыдущей, те c n div 2 +1.
Никак не могу разобраться со внутреннем циклом , а конкретно заставить Z выводится именно с середины предыдущей Z
Решение задачи: «Вывести фигуру Z из символов (*)»
textual
Листинг программы
uses crt;
const nm = 25; {высота дисплея в символах}
sp = 4; {пробел между Z}
var n, k, i, j, x, y: integer;
begin
repeat {ввод высоты с контролем}
write('n in [1..', nm, ']; n = ');
readln(n)
until (n >= 1) and (n <= nm);
repeat {ввод количества с контролем}
write('k > 0; k = ');
readln(k)
until k > 0;
y := n; {координата Y низа букв}
n := n * 2; {коррекция n перед циклом}
x := 1; {начальная координата X нижнего левого угла буквы}
clrscr; {чистим экран}
while (k > 0) and (n > 1) do {цикл, пока количество и высота актуальны}
begin
n := n div 2 + n mod 2; {следующая высота буквы}
dec(k); {сколько букв осталось вывести}
for i := 0 to n - 1 do {цикл по приращению координаты X}
for j := 0 to 2 do {цикл вывода низа, диагонали и верха}
begin
gotoxy(x + i, y - j div 2 * (n - 1) - j mod 2 * i); {переход к координате}
write('*') {печать}
end;
x := x + n + sp; {следующая координата X нижнего левого угла буквы}
end;
gotoxy(x, y); {убираем курсор в эстетически оправданное место}
repeat until keypressed {ждём нажатия любой клавиши для выхода из программы}
end.
Объяснение кода листинга программы
- Ввод высоты и количества символов для вывода.
- Инициализация переменной
yзначениемn, гдеn— это высота дисплея. - Корректировка значения
nпутем умножения на 2 и сохранения остатка от деления. - Инициализация переменной
xзначением 1, что является начальной координатой нижнего левого угла буквы. - Очистка экрана с помощью функции
clrscr. - Цикл, выполняющийся до тех пор, пока
kбольше 0 иnбольше 1. - Внутри цикла корректировка значения
nпутем деления на 2 и получения остатка от деления, что дает следующую высоту буквы. - Уменьшение значения
kна 1. - Два вложенных цикла, первый итерации по
iот 0 доn — 1, а второй итерации поjот 0 до 2. - Внутри вложенных циклов переход к соответствующей координате с помощью функции
gotoxy, и вывод символа*с помощью функцииwrite. - Увеличение значения
xнаn + sp, что является следующей координатой нижнего левого угла буквы. - После окончания вложенных циклов переход к новой координате
xиyс помощью функцииgotoxy. - Цикл, выполняющийся до тех пор, пока не будет нажата любая клавиша.
- Код ожидает ввода, пока не будет нажата клавиша, с помощью функции
keypressed.