konvertierungsproblem von characterString auf enum



  • Hi Leute!

    Ich hoffe ihr könnt mir bei folgendem Problem helfen.
    Grundsätzlich ist die Aufgabenstellung ein Wort (wird hier gespeichert mittels einem Array von Characters, das ist auch vorgegeben) so zu sortieren, dass erst die Vokale in aufsteigender Reihenfolge und dann die Konsonanten in aufsteigender Reihenfolge ausgegeben werden.
    Beispiel:
    aus "keineahnung"
    wird "aeeiughknnn"

    Das Problem an dem ich nun hänge ist die Konvertierung eines Buchstaben meines Wortes auf eine enum Variabel.
    Das wird deshalb rüberkopiert, damit ich sie danach vergleichen kann.
    Das Variabel für das Wort heißt "string".

    Wäre echt super wenn mir jemand helfen könnte.
    Ich weis wo ich hänge (ich hab die Zeile kommentiert), aber ich weis nicht wie es richtig gehen würde.
    Er konvertiert zwar, aber der Wert der enum Variabel (namens "einBuchstabe") ist irgendein Schwachsinn.

    Ich poste mal den Code,
    danke schon mal für eure Hilfe!!

    void sort(int iLaenge){
    //Zuerst die Buchstaben auflisten
    enum buchstaben {a , e, i, o, u, b, c, d, f, g, h, j, k, l, m, n, p, q, r, s, t, v, w, x, y, z}einBuchstabe;
    
    //jetzt sortieren, = Min suchen und ganz nach links bewegen
    for(int durchlauf = iLaenge; durchlauf >= 0; durchlauf--){
            for(int position = iLaenge; position >=0; position--){
                    //kleinste Zahl nach links verschieben
    
                    //So, in der nächsten Zeile folgt das Konvertierungsproblem.
    
                    einBuchstabe = buchstaben (::string[position-1]);
                    int hilfsint = einBuchstabe;
    
                    //selbes Problem wie oben folgt gleich wieder...
    
                    einBuchstabe = buchstaben (::string[position]);
                    int hilfsint2 = einBuchstabe;
                    if(hilfsint2 > hilfsint){
                                        //tauschen
                                        ::string[position-1] = hilfsint;
                                        ::string[position] = hilfsint2;
                                        }
    
                    }
    
            }
    
    return;
    }
    


  • *schieb*



  • Also so geht das definitiv nicht. Der enum-Wert a hat nichts mit dem Zeichen 'a' zu tun (und die Umwandlung von int/char nach enum erzeugt dir einen Wert, der dem ASCII-Code des Zeichens entspricht). Da müsstest du dir ein eigenes Sortier-Kriterium definieren (am besten in einer Funktion ausgelagert).



  • *argh* Das hab ich schon befürchtet.
    Ich könnte das Umwandeln natürlich als eigene Funktion schreiben, am einfachsten mittels manuell Swicth/case Anmweisung.
    Aber gibts keine elegantere Lösung mittels enum? 😞



  • Flabian schrieb:

    ...Aber gibts keine elegantere Lösung mittels enum? 😞

    Hi,

    Du könntest eine map verwenden ....
    Ich sehe aber gar keinen Grund, Buchstaben auf enums zu mappen. Sortieren kannst Du auch so in Strings - am einfachsten suchst Du einfach alle Vokale ( find('a'), .... ) in einen String, alle Konsonanten in einen anderen (einfacher vielleicht: die Vokale aus dem string löschen. Danach kannst Du dann noch alphabetisch sortieren und hängst die beiden hinterher aneinander....

    Prinzipiell halte ich es übrigens für eine Stärke in C++, dass Variablennamen (z.B. a) nicht fest an strings ("a") gekoppelt sind.

    Gruß,

    Simon2.



  • Ich denke ich werds so wie vorgeschlagen machen, duerfte wohl am einfachsten sein. 😉

    Danke fuer die Hilfe. 🙂



  • Du brauchst nur eine eigene Vergleichsfunktion, dann kannst du das ganze entweder mit einem eigenen Bubblesort oder mit der STL machen:

    bool istVokal(char c) {
        c = tolower(c);    
        return (c=='a')||(c=='e')||(c=='i')
               (c=='o')||(c=='u');
    }
    
    bool istWichtiger(char lh, rh) {
        if(istVokal(lh) != istVokal(rh) {
            return istVokal(lh);
        }
        return lh < rh;
    }
    

    Dann machst du noch anstelle von

    if(hilfsint2 > hilfsint){
    

    das hier:

    if(istWichtiger(::string[positionen], ::string[positionen-1]))
    

    Alles ungetestet.


Anmelden zum Antworten