Du bist nicht angemeldet.

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

Frischling

Beiträge: 47

Wohnort: Nähe Stuttgart

Beruf: neu kompilierter Fachinformatiker Anwendungsentwickler

  • 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 193

Wohnort: Wickede

Beruf: Student

  • 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