C++ Text vertikal schreiben



  • Als kleine Hilfestellung könnte man ein paar Stichwörter nennen.

    - der Text ist ein string
    - einen string kann man behandeln wie einen vector aus char
    - man iteriert durch diesen und gibt jedes Element mit nachfolgenden Zeilenumbruch aus.

    Ich vermute, die Vorlage soll extra unverständlicher Pseudo-Code sein, um die Schwierigkeit künstlich zu erhöhen?



  • Wie ich es hinbekommen dass der Text vertikal ausgegeben wird.



  • Ist die Definition von "print_all" also auch der Inhalt der Funktion vorgegeben, oder ist diese Funktion die Stelle an der ihr selbst etwas tun sollt?



  • inflames2k schrieb:

    Ist die Definition von "print_all" also auch der Inhalt der Funktion vorgegeben, oder ist diese Funktion die Stelle an der ihr selbst etwas tun sollt?

    An print_all dürfen wir nichts verändern.



  • Da wäre ich überfordert. Wie soll man denn std::cout einer Funktion übergeben? Ist das überhaupt möglich?



  • Also dies ist die Angabe die wir bekamen.

    a) Durch die einmalige (!) Verwendung des Funktions-Templates print all() der
    Aufgabe 4 mit dem unveränderten String name (Sie dürfen das Template dazu
    nicht verändern, im Zweifelsfall muss Ihr Programm auch mit meiner Version von
    print all() funktionieren!) wird folgender Output erzeugt:
    Inhalt von Name:
    Buchstabe 1: M
    Buchstabe 2: a
    Buchstabe 3: x
    Buchstabe 4:
    Buchstabe 5: M
    Buchstabe 6: u
    Buchstabe 7: s
    Buchstabe 8: t
    Buchstabe 9: e
    Buchstabe 10:r
    Buchstabe 11:m
    Buchstabe 12:a
    Buchstabe 13:n
    Buchstabe 14:n
    Der print all() -Aufruf muss das letzte Statement in main() vor dem return
    sein und der Text muss vor der Auführung dieses return bereits am Bildschirm
    zu sehen sein.
    Ein Tipp: Sie konnen diese Aufgabe losen, indem Sie print all() als Ausgabe-
    trenner selbstgeschriebene Objekte übergeben. Diese brauchen selbst eine Stream-
    ausgabe, die beim Aufruf mit << obige fortlaufend nummerierten Labels erzeugen.
    Falls C++ sich beschwert, dass Sie in der Streamausgabe den Zähler des konstan-
    ten Objekts inkrementieren, machen Sie diesen mutable .



  • Und wo in diesem Output ist '"' und ' ' vorhanden?

    Solche Aufgabenstellungen finde ich unmöglich. Vielleicht sind solche Aufgaben in einem Studium oder so benötigt, aber eine einfache Möglichkeit, die Ausgabe zu lösen ist so ganz anders als dieses Schwurbilumm aus Text.



  • Irgendwie verstehe ich lemon03s Argumente nicht. Warum suchst du Anführungszeichen in der Ausgabe? Und wo ist das Problem, cout an eine Funktion zu übergeben? Das macht man bei dem operator<< doch andauernd?!

    Viel interessanter ist hier die Signatur von Print_all. Die Lösung steht doch schon fast da. Als Ausgabetrenner soll man ein Objekt einer eigenen Klasse nehmen, wo der operator<< passend überladen ist. Da werdet ihr doch was zu besprochen haben!



  • Wie sieht denn die komplette Signatur (bzw. Definition) der Funktion print_all aus?

    Du sollst wohl dann eine eigene Klasse übergeben, für welche dann der Stream-Operator << überladen ist (welcher dann die Ausgabe "Buchstabe X:" erzeugt).

    lemon03 schrieb:

    Da wäre ich überfordert. Wie soll man denn std::cout einer Funktion übergeben? Ist das überhaupt möglich?

    Ganz einfach als

    std::ostream&
    


  • Th69 schrieb:

    Wie sieht denn die komplette Signatur (bzw. Definition) der Funktion print_all aus?

    Du sollst wohl dann eine eigene Klasse übergeben, für welche dann der Stream-Operator << überladen ist (welcher dann die Ausgabe "Buchstabe X:" erzeugt).

    lemon03 schrieb:

    Da wäre ich überfordert. Wie soll man denn std::cout einer Funktion übergeben? Ist das überhaupt möglich?

    Ganz einfach als

    std::ostream&
    

    Also so sieht die print_all Fkt aus.
    /*
    * print_all.h print_all prints a Container
    */

    #ifndef PRINT_ALL_H
    #define PRINT_ALL_H

    #include <iostream>
    #include <cstdlib>

    template<typename Container, typename Head, typename Tail, typename Sep>
    void print_all(std::ostream& out, const Container& v,
    const Head& head, const Tail& tail, const Sep& sep)
    {
    out << head;
    for (auto& x: v) {
    out << x;
    if (&x != &v.back())
    out << sep;
    }
    out << tail;
    }

    #endif



  • Th69 schrieb:

    lemon03 schrieb:

    Da wäre ich überfordert. Wie soll man denn std::cout einer Funktion übergeben? Ist das überhaupt möglich?

    Ganz einfach als

    std::ostream&
    

    Aha, danke 🙂 Ich will nichts gesagt haben...



  • Hallo cleee,

    der Trick an der Aufgabe besteht jetzt darin, eine Klasse zu erstellen, welche als Container (2. Parameter) übergeben wird, welche dann sowohl iteriert werden kann (mittels for (auto& x: v)) als auch Ausgaben erzeugt (out << x;).
    Der Aufruf in main sollte dann also in etwa so aussehen:

    string name{"Max Mustermann"}; 
    MyContainer container(name);
    
    print_all(cout, container, "Inhalt von Name:\n" , "", '\n');
    

    Stichworte: iterator, begin(), end(), s.a. Range-based for loop
    sowie Input/Output Operators Overloading in C++


Anmelden zum Antworten