Zeichnen Sie ein Dreieck auf der Konsole in Bash

Zeichnen Sie ein Dreieck auf der Konsole in Bash

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 printfin 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.)

verwandte Informationen