Я хочу нарисовать треугольник, используя вложенные циклы bash
, как показано ниже:
/\
/ \
/ \
/ \
/________\
Вот мой сценарий:
#!/bin/bash
read -r -p "Enter depth of pyramid: " n
echo "You enetered level: $n"
s=0
space=n
for((i=1;i<=n;i++))
do
space=$((space-1)) #calculate how many spaces should be printed before /
for((j=1;j<=space;j++))
do
echo -n " " #print spaces on the same line before printing /
done
for((k=1;k<=i;k++))
do
if ((i==1))
then
echo -n "/\ " #print /\ on the same line
echo -n " " #print space after /\ on the same line
elif((k==1))
then
echo -n "/" #print / on the same line
elif((k==i))
then
for((l=1;l<=k+s;l++))
do
echo -n " " #print spaces on the same line before printing /\
done
s=$((s+1)) #as pyramid expands at bottom, so we need to recalculate inner spaces
echo -n "\ " #print \ on the same line
fi
done
echo -e #print new line after each row
done
Пожалуйста, помогите мне найти короткую версию.
решение1
$ ./script.sh
Size: 5
/\
/ \
/ \
/ \
/________\
#!/bin/bash
read -p 'Size: ' sz
for (( i = 0; i < sz-1; ++i )); do
printf '%*s/%*s\\\n' "$((sz-i-1))" "" "$((2*i))" ""
done
if [[ $sz -gt 1 ]]; then
printf '/%s\\\n' "$( yes '_' | head -n "$((2*i))" | tr -d '\n' )"
fi
Я выбралнетиспользовать вложенные циклы, поскольку это было бы медленно и ненужно. Вместо этого каждый бит треугольника печатается printf
с использованием формата, определяющего интервал между символами /
и \
на основе текущей строки i
.
Нижний ряд является особым и будет напечатан только в том случае, если размер треугольника это позволяет.
Похожие вопросы:
решение2
Вот моя попытка. Обратите внимание на более удачные имена переменных, кавычки переменных, отсутствие особых случаев, отсутствие мутации переменных (кроме счетчиков циклов), отсутствие поясняющих комментариев.чтоделает код (это работа кода, комментарии должны объяснять, почему, или заполнять слабые места в языке), и меньше циклов.
#!/bin/bash
if (($# == 0))
then
read -r -p "Enter depth of pyramid: " requested_height
elif (($# == 1))
then
requested_height="$1"
fi
echo "You enetered level: $requested_height"
left_edge="/"
right_edge=\\
#this procedure can be replaced by printf, but shown here to
#demonstrate what to do if a built in does not already exist.
function draw_padding() {
width="$1"
for((i=1;i<=width;i++))
do
echo -n " "
done
}
for((line_number=1;line_number<=requested_height;line_number++))
do
initial_spaces=$((requested_height-line_number))
draw_padding "$initial_spaces"
echo -n "$left_edge"
middle_spaces="$(((line_number-1) * 2 ))"
draw_padding "$middle_spaces"
echo "$right_edge"
done
Что я сделал: - Сделал отступ в коде и назвал все так, чтобы я мог это прочитать. - Спросил, что является условным:ВСЕВ строках есть a /
и a \
, поэтому что меняется: пробелы перед ними и пробелы между ними.
Обратите внимание, что это не завершено, согласно оригинальной спецификации. И если это задание, то попрактикуйтесь еще немного. Если вы этого не сделаете, то упретесь в стену позже в ходе курса. Сегодня напишите эту программу 3 раза, не глядя на эту или предыдущие попытки. Затем сделайте это по одному разу в каждый из следующих 3 дней, затем еще раз через неделю. Продолжайте практиковаться в решении подобных задач по кодированию (это как учиться играть на гитаре, вам нужно практиковаться.)