Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

25.02.2020, 18:03

C++ Alle Dominosteine in der Konsole ausgeben (for-Schleife)

Neuer Beitrag - Neue Aufgabe. Es soll ein Programm geschrieben werden das alle Dominosteine in der Konsole ausgibt. Dopplungen soll es nicht geben. Habe die Aufgabe aus dem Buch "Programmieren trainieren" - Workout.4.5 Dominosteine - Seite 47. (Hoffe das ist im Sinne des Copyrights :)) So soll es in der Konsole am Ende aussehen:
(0|0)(0|1)(0|2)(0|3)(0|4)(0|5)(0|6)
_____(1|1)(1|2)(1|3)(1|4)(1|5)(1|6)
_________(2|2)(2|3)(2|4)(2|5)(2|6)
______________(3|3)(3|4)(3|5)(3|6)
___________________(4|4)(4|5)(4|6)
________________________(5|5)(5|6)
_____________________________(6|6)

Die Unterstriche sollen Leerzeichen darstellen. Hier mein Code dazu:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
    for (int y=0; y < 7; y++)
    {
        for(int x=0; x < 7; x++)
        {
            cout << "(" << y << "|" << x << ")";
        }
        cout << endl;
    }
    return 0;
}


Macht auf dem Bilschirm folgendes:

(0|0)(0|1)(0|2)(0|3)(0|4)(0|5)(0|6)
(1|0)(1|1)(1|2)(1|3)(1|4)(1|5)(1|6)
(2|0)(2|1)(2|2)(2|3)(2|4)(2|5)(2|6)
(3|0)(3|1)(3|2)(3|3)(3|4)(3|5)(3|6)
(4|0)(4|1)(4|2)(4|3)(4|4)(4|5)(4|6)
(5|0)(5|1)(5|2)(5|3)(5|4)(5|5)(5|6)
(6|0)(6|1)(6|2)(6|3)(6|4)(6|5)(6|6)

Wie bekomme ich jetzt die überschüssigen Dominosteine weg? Und wie kommen die Leerzeichen ins Spiel? Bin gerade ziemlich planlos.

Tris

Treue Seele

Beiträge: 102

Wohnort: ~Stuttgart

  • Private Nachricht senden

2

25.02.2020, 20:53

Ist in PHP aber ich denke du siehst worauf es ankommt:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$max = 6;

for($i = 0; $i <= $max; $i++) 
{
    for($j = 0; $j <=$max; $j++) 
    {
        if($i <= $j)
        {
            echo "({$i}|{$j})"; 
        } 
        else 
        {
            echo "     ";
        }
    }
    echo "\n";
}


Oder hier ausprobieren:

http://sandbox.onlinephpfunctions.com/co…ccd5ecab69686c9

@alle: Kann man das eigentlich eleganter lösen?

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

3

26.02.2020, 17:56

Wie bekomme ich jetzt die überschüssigen Dominosteine weg?

Du musst dir überlegen welche Dominosteine in deinem Fall überschüssig sind. Hier sind es die Steine, bei denen der X-Wert kleiner als der Y-Wert ist. Deine innere Schleife sollte also nicht bei 0 starten, sondern bei y.

Und wie kommen die Leerzeichen ins Spiel?

Das Problem lässt sich an gut zerstückeln. Die erste Frage die du beantworten musst ist, wie viele Leerzeichen entsprechen der Ausgabelänge von einem Dominostein. Die Ausgabe sieht ja so aus, Klammer auf, einstellige Zahl, Komma, einstellige Zahl, Klammer zu. Die Ausgabelänge von einem Dominostein sind also 5 Zeichen. Als nächstes musst du überlegen wie viele Steine du überspringen möchtest. Deine äußere Schleife entspricht ja deinen Zeilen und deine Leerzeichen sollen immer am Anfang einer Zeile auftreten. Also möchtest du die direkt am Anfang davon ausgeben, direkt bevor du in die innere Schleife springst.
In der ersten Zeile (y=0) sollen 0 Steine übersprungen werden, in der zweiten Zeilen (y=1) ist es ein Stein, in der dritten Zeile (y=2) sind es zwei Steine und so weiter. Du siehst vermutlich selbst dass die Anzahl der Steine die du überspringen möchtest gleich dem Wert von y ist. Du gibst also 5 * y viele Leerzeichen aus.

Zusammengefasst:
Du springst in die äußere Schleife und gibst y * 5 viele Leerzeichen aus. Dann springst du in die innere Schleife und anstatt hier mit x=0 zu starten, startest du mit x=y. Schon ist dein Problem gelöst.

Quellcode

1
2
3
4
5
6
for (y = 0; y < max; y++) {
    // gibt 5 * y viele Leerzeichen aus
    for(x = y; y < max; x++) {
        // gibt stein (y, x) aus
    }
}
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

4

26.02.2020, 18:55

Cool. Danke für die Antworten. :)

Werbeanzeige