Setw() bei Verkettungen?



  • Hallo liebe C++-Gemeinde,

    ich bin relativ neu eingestiegen in C++ und da mir dieses Board als sehr hilfsbereit und konstruktiv aufgefallen ist, habe ich mich hier mal angemeldet 😃

    Zu meiner Frage:
    Ich habe ein Programm, das Lösungen für quadratische Gleichungen für mich löst. Das klappt auch alles ganz gut, allerdings soll das ganze ja auch relativ schick aussehen, deshalb benutze ich ganz gerne setw() aus der <iomanip>-Bibliothek. Allerdings bekomme ich beim Verketten ein Problem:

    cout << setw(25) << a << "x² + " << b << "x + " << c << setw(13) << "x1 = " << x1 << ';' << setw(12) << "" << "x2 = " << x2 << endl;
    

    Ich möchte, dass der komplette Term ax² + bx + c eine Breite von 25 Feldern einnimmt. Allerdings wird durch diesen Code nur das "a" (aus einer Variablen) in das Feld gerückt, der Rest wird 25 Felder weiter rechts angezeigt. Gibts da irgendeine Möglichkeit, das zu lösen?

    Gruß

    PS: Auf andere Formatierungsfehler oder Schwächen im Code jetzt bitte nicht eingehen, das krieg ich schon selbst hin 😛



  • Schreib das ganze vorher in einen Stringstream:

    ...
    
    #include <sstream>
    
    ...
    
      stringstream out;
      out << a << "x² + " << b << "x + " << c;
      cout << setw(25) << out.str() << endl;
    
    ...
    

  • Mod

    Ich fürchte, mir fällt an einfachen Möglichkeiten nichts besseres ein als die Ausdrücke vorher in einen stringstream zu packen und dann das Ergebnis auszugeben:

    links << a << "x² + " << b << "x + " << c;
      mitte << "x1 = " << x1 << ';';
      rechts << "" << "x2 = " << x2;
      cout << setw(25) << links.str() << setw(13) << mitte.str() << setw(12) << rechts.str() << '\n';
    

    Die schönere zu benutzende , aber wesentlich komplizierter zu programmierende Variante wäre ein eigener streambuf der Tabellen passend formatiert. Das mache ich jetzt aber nicht vor.

    edit: zu langsam.



  • Stringstream habe ich noch gar nicht gekannt, sieht aber sehr logisch aus. Werd ich mich mal einlesen.

    Vielen Dank!

    Gäbe es noch irgendwelche Möglichkeiten oder ist das die einzige? Nur so aus Interesse.



  • struct deep_setw {
      deep_setw(std::size_t n) : n(n) {}
      std::size_t n;
      mutable std::ostringstream o;
    };
    template <typename T>
    deep_setw const& operator<<(deep_setw const& d, T const& t) { d.o << t; return d; }
    
    std::ostream& operator<<(std::ostream& os, deep_setw const& d)
    { os.width(d.n); return os << d.o.str(); }
    
    // dann:
    cout << (deep_setw(25) << a << "x� + " << b << "x + " << c)
         << (deep_setw(13) << "x1 = " << x1 << ';')
         << (deep_setw(12) << "" << "x2 = " << x2) << endl;
    

    Das ganze kann so beliebig tief verschachtelt werden.

    Die Idee von SeppJ w�rde IMHO darauf hinauslaufen, einen eigenen Stringstreambuffer zu schreiben, aber das w�re weder schneller noch sch�ner zu benutzen.



  • Anonymus42 schrieb:

    Ich möchte, dass der komplette Term ax² + bx + c eine Breite von 25 Feldern einnimmt.

    .. was spricht gegen:

    cout << "1234567890123456789012345;" << endl;
        cout << setw(5) << a << "x2 + " << setw(6) << b << "x + " << setw(5) << c << ";" << endl;
    

    Gruß
    Werner



  • Werner Salomon schrieb:

    Anonymus42 schrieb:

    Ich möchte, dass der komplette Term ax² + bx + c eine Breite von 25 Feldern einnimmt.

    .. was spricht gegen:

    cout << "1234567890123456789012345;" << endl;
        cout << setw(5) << a << "x2 + " << setw(6) << b << "x + " << setw(5) << c << ";" << endl;
    

    Gruß
    Werner

    Da ist halt das Problem, dass der Abstand von "x2 +" zu b nicht so schön ist. Da gefällt mir die Variante mit dem Stringstream schon besser. 😉


Anmelden zum Antworten