我想使用 中的巢狀循環繪製一個三角形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 天中每天執行一次,然後一週再執行一次。繼續練習類似的程式設計挑戰(就像學習彈吉他一樣,你必須練習。)