Muster zeichnen über Schleifen



  • Also das folgende Muster ist Ziel des Programmes und zwar bei einer Eingabe von Hoehe = 5:

    ***********
    _*********
    __*******
    ___*****
    ____***
    _____*
    ____***
    ___*****
    __*******
    _*********
    ***********

    (Die Unterstriche sollen auch leerzeichen sein!)

    Das fällt mir irgendwie unglaublich schwer. Mein Ansatz sieht vorerst wiefolgt aus:

    [cpp]
    #include <iostream>

    using namespace std;

    int main()
    {
    int h=0;
    int x=0;
    int y=0;

    cout << "Dieses Programm zeichnet eine Raute!" << endl
    << endl << "Geben Sie die gewuenschte Hoehe ein: ";
    cin >> h;

    SCHLEIFE

    return 0;
    }

    [/cpp]

    Der Teil mit der Schleife ist bei mir der Knackpunkt. Ein Dreieck hab ich schon entworfen, das sieht dann wiefolgt aus:

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int a=0;
        int i=0;
        int j=0;
    
        cout << "Dieses Programm gibt eine Figur aus!" << endl
        << endl << "Geben Sie die Anzahl der Zeilen ein: ";
        cin >> a;
    
        for (i=1;i<=a;i++)
        {
            for (j=0;j<i;j++)
            {
            cout << "*";
            }
            cout << endl;
        }
    
        return 0;
    }
    

    Ich habe aber irgendwie starke Probleme schon im Anstaz, da was zu entwerfen. Kann mir jemand auf die Sprünge helfen?


  • Mod

    1. Du bist doch bestimmt in der Lage, die Anzahl der Leerzeichen in Abhängigkeit der Anzahl der Sterne anzugeben. Damit kannst du dann passend Leerzeichen vor die Sterne setzen.

    2. Für die Sanduhrform: Du könntest entweder zwei Schleifen nacheinander machen, von denen eine vorwärts und eine rückwärts zählt, oder du nimmst eine Schleife von -N bis N und betrachtest bloß den Betrag der Zählvariablen um die Anzahl der Sterne zu bekommen.



  • for (int zeile = -hoehe; zeile <= hoehe; ++zeile)
        {
            for (int spalte = -hoehe; spalte <= hoehe; ++spalte)
            {
                if (abs(zeile) >= abs(spalte))
                    cout << '*';
                else
                    cout << ' ';
            }
            cout << endl;
        }
    

    Nur als Anregung.



  • Eine Schleife lasse ich rückwerts dann ja mit i-- laufen, nehme ich an.

    for (i=1;i<=a;i++)
        {
            for (j=0;j<i;j--)
            {
            cout << "*";
            }
            cout << endl;
        }
    

    Das Problem ist, dass ich ein halbes Dreieck ja hinbekommen habe, aber dieses nicht umgedreht kriege, vielleicht würde ich dann den Rest hinbekommen



  • SeppJ hat dir doch schon 2 Möglichkeiten aufgezeigt und Nick Unbekannt hat dir sogar schon eine komplette Lösung geliefert.

    Versuch die Lösung zu verstehen. Wenn dir die Lösung klar erscheint, dann versuch dich an der alternativen Lösungsstrategie.

    Viele Grüße,
    MaBa



  • Oh, das von Nicht Bekannt habe ich nicht gesehen, da ich nicht mehr aktualisiert habe während meines Posts. Dort verstehe ich nur den Punkt
    if (abs(zeile) >= abs(spalte))
    nicht. Was hat das abs zu bedeuten?



  • std::abs() ist eine Funktion, die in <cmath> deklariert ist und sich (im Wesentlichen) so verhält:

    int abs(int arg)
    {
        if(arg < 0) return arg*(-1);
        else return arg;
    }
    


  • Zu Deutsch sie bildet den Betrag.


Log in to reply