std::string, stringstream... Tschuldigung blick nicht durch



  • Hey Leute,

    erst mal hallo, bin Mechatronikstudent und lerne im Zuge des Faches "Softwareentwicklung" C++. Bin Anfänger und komm weitestgehend mit Lektüre in Form von Büchern sowie (leider ehr weniger) Unterlagen zu den Vorlesungen durch.

    In der ersten Übungsaufgabe sollen wir Komplexe Zahlen mit hilfe einer Klasse später auch mit Overloading verrechnen. Das Programm an sich ist nicht so das Problem leider steht in der Aufgabenstellung die Methode

    std::string toStr();
    

    ...womit wir auch schon beim Problem sind.

    Ich schreib euch einfach mal den Quellcode hier rein:

    main.cpp
    #include <iostream>
    #include "KomplexeZahl.h"
    
    using namespace std;
    
    int main()
    {
        KomplexeZahl* z1=new KomplexeZahl(23,15);
        KomplexeZahl* z2=new KomplexeZahl(45,3);    
    
        cout<<"Meine erste Zahl ist:"<<z1->toStr()<<endl;    
        cout<<"Meine zweite Zahl ist:"<<z2->toStr()<<endl;
    
        cout<<"Meine Summe ist:"<<z1->addiere(z2)->toStr()<<endl;
        cout<<"Meine Quotient ist:"<<z1->subtrahiere(z2)->toStr()<<endl;
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    
    KomplexeZahl.h
    class KomplexeZahl{
    public:
    
    KomplexeZahl(double real, double imag); // Konstruktor
    
    std::string toStr(); // Wandelt die komplexe Zahl in einen String um z.B. (23 + 42i)
    
    double getReal() const;
    double getImag() const;
    
    KomplexeZahl* addiere(KomplexeZahl* summand);
    KomplexeZahl* subtrahiere(KomplexeZahl* subtrahend);
    
    private:
    double real;
    double imag;
    };
    
    KomplexeZahl.cpp
    #include <string>
    #include <sstream>
    #include "KomplexeZahl.h"
    
    KomplexeZahl::KomplexeZahl(double real, double imag){
           this->real=real;                 
           this->imag=imag;}                                 
    
    std::string KomplexeZahl::toStr(){
           std::stringstream ausgabe;
           ausgabe<<"("<<real<<"+"<<imag<<"i)"; 
           return ausgabe.str();} 
    
    double KomplexeZahl::getReal() const{
           return real;}      
    
    double KomplexeZahl::getImag() const{
           return imag;}      
    
    KomplexeZahl* KomplexeZahl::addiere(KomplexeZahl* summand){
           double _real,_imag;
           _real=real+summand->getReal();
           _imag=imag+summand->getImag();
           return new KomplexeZahl(_real,_imag);}          
    
    KomplexeZahl* KomplexeZahl::subtrahiere(KomplexeZahl* subtrahend){
           double _real,_imag;
           _real=real-subtrahend->getReal();
           _imag=imag-subtrahend->getImag();
           return new KomplexeZahl(_real,_imag);}
    

    Hoffe is Ok wenn ich das hier so reinposte. Bitte erklär mir mal jemand die Zeile 50 bis 53 in allgemeiner Form in einfachen Worten ggf. auch en Lektürentipp hab da aber noch nicht sorecht was für mich gefunden.

    LG Manu



  • Ein Stringstream ist im Prinzip so etwas wie ein normaler Ausgabestream. Mithilfe << "sendest" du dort Strings, Integer, Klassen, die diesen Operator überladen haben, etc. an die Konsole und diese werden dort ausgegeben.
    Bei einem Stringstream werden diese "Sachen" nicht ausgegeben, sondern in einem String gespeichert. Diesen kannst du mit str() erhalten.



  • Du brauchst übrigens nirgends new. Gewöhn dir am besten gleich ab, alle Objekte mit new zu erstellen. Diese musst du nämlich jeweils mit delete freigeben.

    Schreib deine Funktionen so:

    KomplexeZahl KomplexeZahl::addiere(KomplexeZahl summand)
    {
           double _real = real + summand.getReal();
           double _imag = imag + summand.getImag();
           return KomplexeZahl(_real,_imag);
    }
    

    Noch besser als freie Funktion (wenn nicht gleich Operator):

    KomplexeZahl addiere(KomplexeZahl links, KomplexeZahl rechts)
    {
           double _real = links.getReal() + rechts.getReal();
           double _imag = links.getImag() + rechts.getImag();
           return KomplexeZahl(_real,_imag);
    }
    

    <💡>



  • Noch ein paar Anmerkungen zu deinem Code:

    • Du legst die KomplexeZahl-Objekte im Freispeier an. Wieso? Machst du das auch so bei lokalen ints und doubles? Ich hoffe nicht.
    • Ich hoffe, KomplexeZahl.h enthält Include-Guards und die entsprechende Include-Direktive für std::string
    • Die Formatierung ist hässlich
    • Mach Dich mal zum Thema Initialisierungsliste bzgl Konstruktoren schlau
    • addiere und subtrahiere erzeugen wieder Objekte im Freispeicher. Das ist großer Käse.

    Es sieht so aus, als ob du Python in C++ programmieren würdest. Mach doch lieber "richtiges" C++.



  • Hallo glückspirat,

    schau Dir auch noch diesen Thread über Komplexe Zahlen an.

    Gruß
    Werner



  • Hi,

    erst mal danke für die schnellen antworten.

    danke vor allem für den link ist en kommilitone von mir wir ham zusammen softwareentwicklung und schreiben in 3 Wochen prüfung.

    Falls es euch interessiert kann ich euch mal die komplette aufgabenstellung schicken mit den vorgegeben klassen damit ihr sehen könnt warum ich was mache mit Objekte mit new anlegen usw.

    Könnte mir mal jemand die Zeilen:

    std::string KomplexeZahl::toStr(){
           std::stringstream ausgabe;
           ausgabe<<"("<<real<<"+"<<imag<<"i)";
           return ausgabe.str();}
    

    mal mit einfachen worten erklären

    Edit: Ach ja tschuldiugn für den hässlischen code

    und weil ich heute verstreut bin Edit2: Die Aufgabenstellugn:
    https://www.dropbox.com/s/hoalmord9s2t0w3/PunkteÜbungen-29.11.12.pdf



  • Zitat aus der Aufgabenstellung:

    KomplexeZahl* a = new KomplexeZahl(23.42, 42.23);
    KomplexeZahl* b = new KomplexeZahl(42.23, 23.42);
    KomplexeZahl* c = *a + *b;
    cout << a->toStr() << " + " << b->toStr() << " = " << c->toStr() << endl;
    

    Und sowas nennt sich Professor und lehrt C++ 🙄



  • @TE: Schaue dir mal meinen Post weiter oben an, vielleicht hilft der.



  • Cyres schrieb:

    Zitat aus der Aufgabenstellung:

    KomplexeZahl* a = new KomplexeZahl(23.42, 42.23);
    KomplexeZahl* b = new KomplexeZahl(42.23, 23.42);
    KomplexeZahl* c = *a + *b;
    cout << a->toStr() << " + " << b->toStr() << " = " << c->toStr() << endl;
    

    Und sowas nennt sich Professor und lehrt C++ 🙄

    Warscheinlich durch Java durcheinandergekommen. Warum sollte ein Professor C++ können müssen?
    War vermutlich eine Idee der Uni C++ zu lehren.


Anmelden zum Antworten