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

26.02.2020, 19:12

C++ Zahlenmuster in der Konsole ausgeben

Nächste Aufgabe. Es soll eine Funktion geschrieben werden der n-Zahlen übergeben werden. Ist n < 1 soll ein leerer String zurückgegegeben werden. Ist n größer soll folgendes Muster in der Konsole erscheinen:

1
22
333
....
.....
nnnnnn

Für den Parameter 11 wäre das etwa:

1
22
333
4444
55555
666666
7777777
88888888
999999999
10101010101010101010
1111111111111111111111

Hier mein bisheriges Programm:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
string pattern(int n){
    string patt;

    if(n < 1)
        return (patt="");

    for (int j=0; j < n; j++)
    {

      for (int i=0; i <= j; i++)
      {
        patt.push_back('i+1');
      }

        patt.push_back('\n');
    }

    cout << patt;

    return patt;
}


Bei pattern(3); gibt es auf dem Bildschirm folgendes aus:
1
11
111

Wo ist mein Fehler?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

27.02.2020, 12:05

Da ist dein Fehler: patt.push_back('i+1');

Mehr sage ich nicht. Du lernst mehr, wenn du das selbst rausfindest ;)

3

27.02.2020, 21:14

Quellcode

1
 patt.push_back('i+1');


Was passiert hier eigentlich intern? Ich behandle das ganze ja wie ein einzelnes chracter. Wird dann das ganze ding 'i+1' einmal übersetzt und dann nie wieder verändert? Also ein const-Wert? Würde mich interessieren.

-----------------

Also ich habe jetzt einige Sachen ausprobiert. Zuerst kam ich auf die Idee mit sprintf(); einen string zusammenzubasteln und dann an die push_back() funktion zu übergeben - ging nicht. Dann hab ich folgendes versucht:

Quellcode

1
patt.push_back(to_string(j+1));


Ging auch nicht.
Daher meine endgültige Lösung:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
string pattern(int n){
    string patt;

    if(n < 1)
        return (patt="");

    for (int j=0; j < n; j++)
    {
      for (int i=0; i <= j; i++)
        patt = patt + to_string(j+1); // das funktioniert :)

        patt.push_back('\n');
    }
    return patt;
}


Warum haben die beiden ersten Wege nicht geklappt? Bei sprintf() ist das erste Argument ein Zeiger auf den Ziel-String. Funktioniert es deshalb nicht? Weil push_back() ein einzelnes chracter erwartet und sprintf() mit strings hantiert? std::to_string() gibt als rückgabewert einen string zurück. Das scheint wieder das gleiche Problem zu sein - es liefert einen string aber push_back() möchte ein einzelnes character.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

28.02.2020, 00:18

1. Die einfachen Anführungszeichen (') nutzt man für einzelne Zeichen, nicht für ganze Strings. 'i+1' ist mehr als ein Zeichen und laut Standard implementierungsabhängig (quasi "falsch").
2. Mit sprintf geht es auch, aber das ist aus C und nicht für std::string aus C++ gedacht.
3. Ja, patt.push_back(to_string(j+1)); geht nicht, weil du mit push_back nur einzelne Zeichen anhängen kannst, nicht ganze Strings.
4. Statt patt = patt + ... kannst du auch kürzer schreiben: patt += ...

5

28.02.2020, 16:46

Danke für die Antwort. :)

Werbeanzeige