Ich möchte ein Dreieck mit verschachtelten Schleifen zeichnen bash
, etwa wie folgt:
/\
/ \
/ \
/ \
/________\
Hier ist mein Skript:
#!/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
Bitte helfen Sie mir, die Kurzfassung zu finden.
Antwort1
$ ./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
Ich habe gewähltnichtverschachtelte Schleifen zu verwenden, da dies langsam und unnötig wäre. Jedes Bit des Dreiecks wird stattdessen printf
in einem Format gedruckt, das den Abstand zwischen den /
und \
Zeichen basierend auf der aktuellen Zeile angibt i
.
Die untere Reihe ist speziell und wird nur gedruckt, wenn die Größe des Dreiecks dies zulässt.
Ähnliche Fragen:
Antwort2
Hier ist mein Versuch. Beachten Sie bessere Variablennamen, Variablen in Anführungszeichen, keine Sonderfälle, keine Variablenmutationen (außer Schleifenzähler), keine Kommentare, die erklärenWasder Code funktioniert (das ist die Aufgabe des Codes, Kommentare sollten erklären warum oder Schwächen in der Sprache beheben) und es gibt weniger Schleifen.
#!/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
Was habe ich getan: - Den Code einrücken und die Sachen gut benennen, damit ich sie lesen kann. - Fragen, was bedingt ist:ALLEZeilen haben ein /
und ein \
, also ändert sich: die Leerzeichen davor und die Leerzeichen dazwischen.
Beachten Sie, dass es gemäß der ursprünglichen Spezifikation noch nicht fertig ist. Und wenn dies eine Aufgabe ist, üben Sie noch etwas. Wenn Sie das nicht tun, werden Sie später im Kurs gegen eine Wand stoßen. Schreiben Sie dieses Programm heute dreimal, ohne sich diesen oder frühere Versuche anzusehen. Dann tun Sie es an jedem der nächsten drei Tage einmal und dann noch einmal in einer Woche. Üben Sie weiterhin ähnliche Programmieraufgaben (es ist wie Gitarrespielen lernen, Sie müssen üben.)