String umdrehen



  • Moin moin

    Ich komm bei einem Algorithmus gerade nicht so richtig weiter...

    ich wollte mal meine Fähigkeiten testen und habe mir ein (dachte ich) simples "Problem" ausgesucht:

    ich habe eine Funktion mit einem Array

    void namenUmdrehen(){
    String[] namensArray = new String[5];
    namensArray[0] = "Lieschen Mueller";
    namensArray[1] = "Peter Fleissig";
    namensArray[2] = "Achim Mustermann";
    namensArray[3] = "Anne Mayer";
    namensArray[4] = "Peter Pan";
    
    //...
    
    }
    

    , welches ich "umdrehen" möchte. Im Grunde soll am Ende, wenn ich das auf der Konsole ausgebe nicht "Lieschen Mueller" stehen, sondern: "Mueller, Lieschen".

    Muss ich jedes einzelne Zeichen überprüfen und wenn eine Leerzeile kommt vertausche ich das? Ich dachte erst, das wird ganz einfach, aber ich stehe im Moment auf'm Schlauch...^^

    Jemand eine Idee...?

    Gruß Zel



  • Wir nehmen an:
    a) ohne Komma ist die Struktur: Vorname Nachname
    b) mit Komma ist die Struktur: Nachname, Vorname

    - es gibt String-Tokenizer die den String anhand eines Trennzeichens (Komma, Leerzeichen, ...) in mehrere Strings (Array) teilen (entweder bietet deine String-Klasse die Funktion oder du machst es selbst)
    - dann von beiden Strings noch die Leerzeichen am Anfang/Ende wegnehmen (auch Funktion der String-Klasse)
    - neuen String zusammenbauen: stringNeu = stringTeil[1] + ", " + stringTeil[0]



  • Guuuuut...also ich habs geschafft...nur ist meine Lösung absolut unschön -.-

    Ich hab die jetzt von Hand getrennt...ich zeig einfach mal den Code... -.-

    const int size = 5;
    
    	string namensArray[size];
    
    	namensArray[0] = "Lieschen Mueller";
    	namensArray[1] = "Peter Fleissig";
    	namensArray[2] = "Achim Mustermann";
    	namensArray[3] = "Anne Mayer";
    	namensArray[4] = "Peter Pan";
    
    	string eins = namensArray[0];
    	string zwei = namensArray[1];
    	string drei = namensArray[2];
    	string vier = namensArray[3];
    	string fuenf = namensArray[4];
    
    	int pos = eins.find(" ");
    	string einsneu = eins.substr(0, pos);
    	string einsalt = eins.substr(pos + 1, eins.length());
    
    	int pos2 = zwei.find(" ");
    	string zweineu = zwei.substr(0, pos2);
    	string zweialt = zwei.substr(pos2 + 1, zwei.length());
    
    	int pos3 = drei.find(" ");
    	string dreineu = drei.substr(0, pos3);
    	string dreialt = drei.substr(pos3 + 1, drei.length());
    
    	int pos4 = vier.find(" ");
    	string vierneu = vier.substr(0, pos4);
    	string vieralt = vier.substr(pos4 + 1, vier.length());
    
    	int pos5 = fuenf.find(" ");
    	string fuenfneu = fuenf.substr(0, pos5);
    	string fuenfalt = fuenf.substr(pos5 + 1 , fuenf.length());
    
    	cout << "Folgende Namen werden umgedreht: " << endl;
    	cout << eins << endl;
    	cout << zwei << endl;
    	cout << drei << endl;
    	cout << vier << endl;
    	cout << fuenf << "\n" << endl;
    
    	cout << einsalt << ", " << einsneu << endl;
    	cout << zweialt << ", " << zweineu << endl;
    	cout << dreialt << ", " << dreineu << endl;
    	cout << vieralt << ", " << vierneu << endl;
    	cout << fuenfalt << ", " << fuenfneu << endl;
    

    Der Code funktioniert soweit, er macht das, was er machen soll... nur werdet ihr mir sicherlich zustimmen, dass die Lösung nicht optimal ist, sehr viel Schreibaufwand, ich wusste aber nich genau, wie ich das sonst machen sollte...kp, vllt Kopfblockade^^

    Hat jemand eine Idee/Vorschlag, wie man das besser macht?



  • Bist du sicher, daß du Sinn und Zweck von Funktionen verstanden hast? - du schreibst fünf mal den selben Code ...

    //edit: Deutsche Sprache ...



  • Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum C++ (auch C++0x und C++11) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Zel2491 schrieb:

    Hat jemand eine Idee/Vorschlag, wie man das besser macht?

    #include <string>
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    string drehUm(const string &name)
    {
    	int pos = name.find(" ");
    	string umgedreht = name.substr(pos + 1);
    	umgedreht.append(", ");
    	umgedreht.append(name.substr(0, pos));
    
    	return umgedreht;
    }
    
    int main()
    {
    	vector<string> namensArray;
    
    	namensArray.push_back("Lieschen Mueller");
    	namensArray.push_back("Peter Fleissig");
    	namensArray.push_back("Achim Mustermann");
    	namensArray.push_back("Anne Mayer");
    	namensArray.push_back("Peter Pan");
    
       vector<string> namensArrayumgedreht;
    
    	for(int i = 0; i < namensArray.size(); ++i)
    		namensArrayumgedreht.push_back(drehUm(namensArray[i]));
    
    	cout << "Folgende Namen werden umgedreht: " << '\n';
    
    	for(int i = 0; i < namensArray.size(); ++i)
    		cout << namensArray[i] << '\n';
    
    	cout << '\n';
    
    	for(int i = 0; i < namensArrayumgedreht.size(); ++i)
    		cout << namensArrayumgedreht[i] << '\n';
    
    	cout << '\n';
    }
    


  • Zel2491 schrieb:

    Hat jemand eine Idee/Vorschlag, wie man das besser macht?

    #include <algorithm> // copy
    #include <iostream>
    #include <iterator> // ostream_iterator
    #include <string>
    #include <boost/iterator/transform_iterator.hpp>
    
    std::string drehUm(const std::string &name)
    {
        const std::string::size_type pos = name.find(" ");
        return name.substr(pos + 1) + ", " + name.substr(0, pos);
    }
    
    int main()
    {
        using namespace std;
        string namensArray[] = {
            "Lieschen Mueller",
            "Peter Fleissig",
            "Achim Mustermann",
            "Anne Mayer",
            "Peter Pan"
        };
        string* const namensArrayEnd = namensArray + sizeof(namensArray)/sizeof(*namensArray);
    
        copy( namensArray, namensArrayEnd, ostream_iterator< string >( cout << "Folgende Namen werden umgedreht: \n", "\n" ) );
        cout << endl;
    
        copy( boost::make_transform_iterator( namensArray, &drehUm ), boost::make_transform_iterator( namensArrayEnd, &drehUm ),
            ostream_iterator< string >( cout, "\n" ) );
        cout << endl;
        return 0;
    }
    

    😉



  • Moin moin,

    ich hab mir eure Beispiele angeguckt und bedanke mich gaaaanz dolle für die Hilfe 😉

    Ich habs etwas abgedändert, jetzt sieht meins so aus:

    string dreheNamenUm(string namensArray[], const int size){
    
    	string umgedreht;
    
    	for(int i = 0; i < size; i++) {
    
    		int pos = namensArray[i].find(" ");
    		umgedreht = namensArray[i].substr(pos + 1);
    		umgedreht.append(", ");
    		umgedreht.append(namensArray[i].substr(0, pos));
    		namensArray[i] = umgedreht;
    
    	}
    
        return umgedreht; 
    
    }
    
    void gebeNamensFeldAus(string namensArray[], const int size){
    
        for(int i = 0; i < size; ++i) {
            cout << namensArray[i] << "\n";
    
    	}
    	cout << endl;
    
    }
    
    void namenUmdrehen() {
    
    	string namensArray[5];
    
    	namensArray[0] = "Lieschen Mueller";
    	namensArray[1] = "Peter Fleissig";
    	namensArray[2] = "Achim Mustermann";
    	namensArray[3] = "Anne Mayer";
    	namensArray[4] = "Peter Pan";
    
    	cout << "Folgende Namen werden umgedreht: " << '\n';
    
    	gebeNamensFeldAus(namensArray, 5);
    	dreheNamenUm(namensArray, 5);
    	gebeNamensFeldAus(namensArray, 5);
    

    eine etwas andere Variante, aber es funktioniert auch 😉

    Gruß Zel 😉



  • Hallo ich hab mir gerade mal die Lösungsansätze angesehen und ich versteh die letzte Lösung überhaupt gar nicht....hab versucht sie zu Kompilieren aber da kommen zeig Fehlermeldungen...?



  • Mollfred schrieb:

    Hallo ich hab mir gerade mal die Lösungsansätze angesehen und ich versteh die letzte Lösung überhaupt gar nicht....hab versucht sie zu Kompilieren aber da kommen zeig Fehlermeldungen...?

    ah ok habs schon gerraft war ja eh ein alter Post


Log in to reply