Du bist nicht angemeldet.

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 236

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 236

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