web-dev-qa-db-ger.com

Dreieck mit for-Schleifen erstellen

Ich scheine keine Antwort auf diese Frage zu finden- 

Ich muss ein einfaches Dreieck mit Schleifen zeichnen.

     *  
    ***
   *****
  *******
 *********

Ich kann ein halbes Dreieck erstellen, weiß aber nicht, wie ich meine aktuelle Schleife hinzufügen soll, um ein vollständiges Dreieck zu bilden. 

 *
 **
 ***
 ****
 *****



  for (int i=0; i<6; i++)
  {
  for (int j=0; j<i; j++)
  {
  System.out.print("*");
  }
  System.out.println("");
  }

Vielen Dank-

10
Kerry G

Zunächst müssen Sie sicherstellen, dass Sie die korrekte Anzahl von *-Symbolen erstellen. Wir müssen 1, 3, 5 und so weiter anstelle von 1, 2, 3 erzeugen. Dies kann durch Ändern der Zählervariablen behoben werden:

for (int i=1; i<10; i += 2)
{
    for (int j=0; j<i; j++)
    {
        System.out.print("*");
    }
    System.out.println("");
}

Wie Sie sehen, beginnt i mit 1 und erhöht sich bei jedem Schritt um 2, solange es kleiner ist als 10 (dh 1, 3, 5, 7, 9). Dies gibt uns die korrekte Anzahl von * Symbolen. Wir müssen dann die Einrückungsebene pro Zeile festlegen. Dies kann wie folgt durchgeführt werden:

for (int i=1; i<10; i += 2)
{
    for (int k=0; k < (4 - i / 2); k++)
    {
        System.out.print(" ");
    }
    for (int j=0; j<i; j++)
    {
        System.out.print("*");
    }
    System.out.println("");
}

Bevor wir die *-Symbole drucken, drucken wir einige Leerzeichen und die Anzahl der Leerzeichen hängt von der Zeile ab, in der wir uns befinden. Dafür gibt es die for-Schleife mit der Variable k. Wir können sehen, dass k die Werte 4, 3, 2, 1 und 0 durchläuft, wenn ì1 ist. , 3, 5, 7 und 9. Das wollen wir, denn je höher wir im Dreieck sind, desto mehr Leerzeichen müssen wir platzieren. Je weiter wir das Dreieck runterkommen, desto weniger Leerzeichen benötigen wir und die letzte Linie des Dreiecks benötigt überhaupt keine Leerzeichen. 

16
Simeon Visser

Eine lustige, einfache Lösung:

for (int i = 0; i < 5; i++) 
  System.out.println("    *********".substring(i, 5 + 2*i));
20
Marko Topolnik

Denken Sie zuerst an eine Lösung ohne Code. Die Idee ist, eine ungerade Zahl * zu drucken, die sich um Zeilen erhöht. Dann zentrieren Sie das * mit Leerzeichen. Wenn Sie die maximale Anzahl von * in der letzten Zeile kennen, erhalten Sie die erste Anzahl von Leerzeichen, um das erste * zu zentrieren. Schreiben Sie es jetzt in Code.

3
Pablo Pazos

Ich weiß es zu schätzen, dass das OP neu für Java ist, daher werden Methoden als "fortgeschritten" betrachtet. Ich denke jedoch, dass es sich lohnt, dieses Problem zu verwenden, um zu zeigen, wie Sie ein Problem angreifen können, indem Sie es in Stücke zerlegen.

Lassen Sie uns überlegen, wie Sie eine Methode zum Drucken einer einzelnen Zeile schreiben und der Methode mitteilen, um welche Zahlenzeile es sich handelt:

public void printTriangleLine(int rowNumber) {
    // we have to work out what to put here
}

Wir müssen einige Leerzeichen drucken, dann einige Sterne.

Wenn ich mir das Beispiel anschaue, kann ich sehen, dass (wenn die erste Zeile 0 ist) (5-Zeilen-Nummer) Leerzeichen und (2 * Zeilen-Nummer + 1) Sterne sind.

Lassen Sie uns eine Methode erfinden, die die Zeichenzeilen für uns druckt, und verwenden Sie sie:

public void printTriangleLine(int rowNumber) {
    printSequence(" ", 5 - rowNumber);
    printSequence("*", 2 * rowNumber + 1);
    System.out.println(); 
}

Das wird erst kompiliert, wenn wir printSequence () tatsächlich schreiben, also machen wir das:

public void printSequence(String s, int repeats) {
    for(int i=0; i<repeats; i++) {
        System.out.print(s);
    }
}

Jetzt können Sie testen printSequence selbst und Sie können testen printTriangleLine alleine. Jetzt können Sie es einfach ausprobieren, indem Sie diese Methoden direkt in main() aufrufen.

public static void main(String [] args) {
    printSequence("a",3);
    System.out.println();
    printTriangleLine(2);
}

... führen Sie es aus und überprüfen Sie (mit Ihren Augen), dass es ausgibt:

aaa
   *****

Wenn Sie sich weiter mit der Programmierung beschäftigen, sollten Sie ein Unit-Testframework wie jUnit verwenden. Anstatt zu drucken, schreiben Sie eher Dinge wie printTriangleLine, um einen String zurückzugeben (den Sie von oben in Ihrem Programm drucken würden), und Sie würden Ihre Tests mit Befehlen automatisieren:

assertEquals("   *****", TriangleDrawer.triangleLine(2));
assertEquals("     *", TriangleDrawer.triangleLine(0))

Jetzt haben wir die Teile, die wir brauchen, um ein Dreieck zu zeichnen.

public void drawTriangle() {
    for(int i=0; i<5; i++) {
        printTriangleLine(i);
    }
}

Der Code, den wir geschrieben haben, ist etwas länger als die Antworten, die andere Leute gegeben haben. Wir konnten jeden Schritt jedoch testen, und wir haben Methoden, die wir bei anderen Problemen erneut anwenden können. Im wirklichen Leben müssen wir das richtige Gleichgewicht finden, wenn ein Problem in zu viele oder zu wenige Methoden aufgeteilt wird. Ich neige dazu, viele wirklich kurze Methoden zu bevorzugen.

Für zusätzliche Gutschrift:

  • passen Sie dies so an, dass die Methoden anstelle eines Ausdrucks in System.out einen String zurückgeben. In main () können Sie System.out.print(drawTriangle()) verwenden.
  • passen Sie dies so an, dass Sie drawTriangle () nach verschiedenen Größen fragen können - dh Sie können drawTriangle(3) oder drawTriangle(5) aufrufen.
  • machen Sie es für größere Dreiecke. Hinweis: Sie müssen PrintTriangleLine () einen neuen "width" -Parameter hinzufügen.
3
slim

Versuchen Sie es in Java

for (int i = 6, k = 0; i > 0 && k < 6; i--, k++) {
    for (int j = 0; j < i; j++) {
        System.out.print(" ");
    }
    for (int j = 0; j < k; j++) {
        System.out.print("*");
    }
    for (int j = 1; j < k; j++) {
        System.out.print("*");
    }
    System.out.println();
}
2
loveleen

Hausaufgabenfrage? Nun, Sie können Ihren ursprünglichen 'rechtwinkligen Dreieck'-Code ändern, um ein umgekehrtes' rechtwinkliges Dreieck 'mit Leerzeichen zu erzeugen

for(i=0; i<6; i++)
{
for(j=6; j>=(6-i); j--)
{
   print(" ");
}
for(x=0; x<=((2*i)+1); x++)
{
   print("*");
}
print("\n");
}
2
Ganesh Iyer

Dies wird auf Ihre Frage antworten. Kommentieren Sie den kommentierten Code, um nur die äußere Zeile anzuzeigen :)

public class TrianglePattern {

    public static void main(String[] args) {
        // This logic will generate the triangle for given dimension
        int dim = 10;
        for (int i = 0; i < dim; i++) {
            for (int k = i; k < dim; k++) {
                System.out.print(" ");
            }
            for (int j = 0; j <= i; j++) {
                //if (i != dim - 1)
                //  if (j == 0 || j == i)
                //      System.out.print("*");
                //  else
                //      System.out.print(" ");
                //else
                    System.out.print("*");
                System.out.print(" ");
            }
            System.out.println("");
        }
    }
}
1
Chandra
  for (int i=0; i<6; i++)
  {
     for (int k=0; k<6-i; k++)
     {
        System.out.print(" ");
     }
     for (int j=0; j<i*2+1; j++)
     {
        System.out.print("*");
     }
     System.out.println("");
  }
1
citydeer
private static void printStar(int x) {
    int i, j;
    for (int y = 0; y < x; y++) { // number of row of '*'

        for (i = y; i < x - 1; i++)
            // number of space each row
            System.out.print(' ');

        for (j = 0; j < y * 2 + 1; j++)
            // number of '*' each row
            System.out.print('*');

        System.out.println();
    }
}
1
Fahim Faysal

Nun, es gibt zwei Sequenzen size-n für Leerzeichen und (2*(n+1)) -1 für Sterne. Bitte schön.

public static void main(String[] args) {
    String template = "***************************";
    int size = (template.length()/2);
    for(int n=0;n<size;n++){
        System.out.print(template.substring(0,size-n).replace('*',' '));
        System.out.println(template.substring(0,((2*(n+1)) -1)));
    }
}
0
zawhtut

Auf diese Weise haben Sie ein wenig mehr Kontrolle und können es einfacher machen:

public static int biggestoddnum = 31;

public static void main(String[] args) {
    for (int i=1; i<biggestoddnum; i += 2)
    {
        for (int k=0; k < ((biggestoddnum / 2) - i / 2); k++)
        {
            System.out.print(" ");
        }
        for (int j=0; j<i; j++)
        {
            System.out.print("*");
        }
        System.out.println("");
    }
}

Ändern Sie einfach den Wert von public static int biggestoddnum in die von Ihnen gewünschte ungerade Zahl, und die for(int k...) wurde getestet.

0
user8742736