<< Operatorüberladung ohne die .cpp zu ändern



  • hustbear schrieb:

    Philipp2706 schrieb:
    Ich frage mich jetzt nur was ich mit der 2 in:
    C++:
    zahl.konvertiereNachBasis(2); // Berechne Binaerdarstellung

    anstellen soll 😕

    Ich werde morgen meinen Professor fragen, aber meint ihr ich muss die Zahl in beliebige Basen konvertieren?

    Ich würde sagen: von beliebiger Basis in beliebige Basis.

    Stimmt schon, eigentlich logisch 🙄

    hustbear schrieb:

    Diese Stellen musst du jetzt bloss noch von einem Integer (0...35) in ein Zeichen ('0'...'9', 'a'...'z') verwandeln,

    Dazu ist mir nur eingefallen ein enum mit den zeichen 0 bis z zu erstellen. Das sieht vieleicht etwas seltsam aus, aber es funktioniert (fast) 😃
    Kann man das so machen?

    Bei Basis 36 wird ZSI ausgegeben, es müsste aber YRI sein. Ich kann mir nicht erklären warum 😕 😕

    //Zeichen enum
    enum ZeichenTyp {
        Null,Eins,Zwei,Drei,Vier,Fuenf,Sechs,Sieben,Acht,Neun,
        A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z
    };
    typedef ZeichenTyp zeichen;
    string zeichenStr[] = {"0","1","2","3",
    "4","5","6","7","8","9","A","B","C","D","E","F","G",
    "H","I","J","K","L","M","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
    
    void GanzeZahl::konvertiereNachBasis(int basisKonv) 
    { 
         zeichen aktuellesZeichenEnum;   
         unsigned int faktor=1, dezimalInput;  
         string aktuellesZeichenStr="", aktuellesZeichenRichtig="";
         dezimalInput= dezWert; 
    
         while (dezimalInput) 
             { 
             aktuellesZeichenEnum= (zeichen) (dezimalInput % basisKonv);
             aktuellesZeichenStr += zeichenStr[aktuellesZeichenEnum];
    
             dezimalInput = dezimalInput / basisKonv;
             faktor *= 10;     
             } 
    
         //String umdrehen
    	for (int i =aktuellesZeichenStr.size(); i>0; i--)
    	{
            aktuellesZeichenRichtig = aktuellesZeichenRichtig + aktuellesZeichenStr[i-1];
    	}
    
         this ->ziffernBasis = aktuellesZeichenRichtig;
         } 
    /*
    

    Dieser schöne Ansatz mit stol ist leider nicht erlaubt. Wir sollen zuerst in eine Zehnerpotenz und danach in die beliebige Potenz umrechnen.

    ostream &operator<<(ostream &ostr, const GanzeZahl& Zahl) {
    ostr << stol(Zahl.ziffernBasis.c_str(), 0, Zahl.basis);       
        Zahl.dezWert =stol(Zahl.ziffernBasis.c_str(), 0, Zahl.basis);
            return ostr;}
    

    Dazu würde ich gerne das Horner-Schema implementieren. Und für die Koeffizienten mein enum von oben verwenden. Bzw den Typ zeichen.

    Ich habe ein bisschen herumexperimentiert aber ich bekomme immer eine Fehlermeldung. "invalid conversion from int to zeichen...."

    Ich habe gelesen dass die Konvertierung von string zu enum nicht so einfach möglich ist. Aber ich würde es praktisch finden wenn beide Methoden das enum verwenden können.
    Ist das irgendwie möglich?

    //Neue Operatorüberladung mit Hornerschema
        ostream &operator<<(ostream &ostr, const GanzeZahl& Zahl) {
    
        int n =Zahl.ziffernBasis.length();
        zeichen ergebnis;
        zeichen zeichenArr [n];
        zeichen basisZeich = (zeichen)Zahl.basis;
    
        //String in ein zeichen-Array kopieren 
        for (int i=0;i<Zahl.ziffernBasis.length();i++)
        zeichenArr [i]==Zahl.ziffernBasis[i];
    
        //Horner-Schema
        for(int i=n-1; i >= 0 ; --i)
        ergebnis = ergebnis * basisZeich + zeichenArr[i];
    
        return ergebnis;}
    


  • Philipp2706 schrieb:

    Dazu ist mir nur eingefallen ein enum mit den zeichen 0 bis z zu erstellen. Das sieht vieleicht etwas seltsam aus, aber es funktioniert (fast) 😃
    Kann man das so machen?

    Klar, kann man. Der enum bewirkt allerdings gar nix, das ist dir klar, oder?
    Und es geht einfacher. Guck dir mal die numerischen Werte der Zeichen '0'...'9' sowie 'a'...'z' an.

    Philipp2706 schrieb:

    Bei Basis 36 wird ZSI ausgegeben, es müsste aber YRI sein. Ich kann mir nicht erklären warum 😕 😕

    Was wäre die einfachste Erklärung? Dass du nen Buchstaben ausgelassen hast vielleicht? Und genau daran liegt es auch.

    Philipp2706 schrieb:

    Dieser schöne Ansatz mit stol ist leider nicht erlaubt.
    ...
    Dazu würde ich gerne das Horner-Schema implementieren. Und für die Koeffizienten mein enum von oben verwenden. Bzw den Typ zeichen.

    Auch hier der Tip: guck dir die numerischen Werte der verschiedenen Zeichen an. ASCII Tabelle und so.
    Ansonsten tut's aber auch ein switch:

    char ch = ...
    switch (ch) {
        case '0':
            ...
        case '1':
            ...
        case '2':
            ...
        ...
    

    Philipp2706 schrieb:

    Ich habe ein bisschen herumexperimentiert aber ich bekomme immer eine Fehlermeldung. "invalid conversion from int to zeichen...."

    Ja, das ist in C++ einfach so. Wenn du in dieser Richtung konvertieren willst musst du explizit casten.
    Der enum tut aber wie ich oben schon geschrieben habe nichts. Du scheinst aber anzunehmen dass er etwas tut. D.h. ich vermute dass du enums falsch verstanden hast 😉


Anmelden zum Antworten