Anfänger braucht Hilfe bei String-manipulation in C++



  • Hallo mal wider 😃
    Bin das mit den VB-Funktionen nochmal durchgegangen und das ist dabei rausgekommen:

    string vbmid(string quelle,int index,int laenge){
           string ergebnis = quelle.substr(index,laenge);
           return ergebnis;}
    
    string vbleft(string quelle,int laenge){
           string ergebnis = quelle.substr(0,laenge);
           return ergebnis;}
    
    string vbright(string quelle,int laenge){
           string ergebnis = quelle.substr(quelle.length()-laenge,laenge);
           return ergebnis;}
    

    Habe es in meiner Permutation noch nicht getestet...
    Freue mich aber schon auf euer Feedback 😃

    EDIT: Habe es mit meiner Permutation getestet...
    Funktioniert trotzdem nicht... 👎



  • Hat zwar nichts direkt mit deinem Problem zu tun, aber so eine Funktion

    string vbmid(string quelle,int index,int laenge){
           string ergebnis = quelle.substr(index,laenge);
           return ergebnis;}
    

    solltest du besser so schreiben:

    string vbmid(const string& quelle, int index, int laenge)
    {
       return quelle.substr(index,laenge);
    }
    

    Ich meine jetzt nicht die Einrückung und schlechte Lesbarkeit, sondern 1. die Übergabe als Const-Referenz und 2. die direkte Rückgabe, wodurch Optimierungen wie RVO (Return Value Optimization) besser möglich sind.



  • Danke Nexus.
    Hab anfangs gedacht das dadurch mein "Orginal"-String verändert wird...
    Aber du hast recht. Ich spare mir dadurch das hin und her kopieren im Speicher und mein Quellstring wird nicht verändert.
    Auf so Sachen muss man erstmal kommen...
    Habe übrigens einen Bug im in meinem Code gefunden.
    Muss aber erst noch prüfen ob das so stimmt bevor ich hier irgendetwas poste...



  • Jin86 schrieb:

    Hab anfangs gedacht das dadurch mein "Orginal"-String verändert wird...

    Dazu müsstest du eine Non-Const-Referenz oder einen Zeiger übergeben, dann kannst du direkt Manipulationen am übergebenen Objekt vornehmen.



  • Also ich frage mich, warum du für so etwas triviales und kurzes eine Funktion schreibst?! - Das wäre hier ohne die Funktion sogar einfacher zu benutzen..



  • drakon schrieb:

    Also ich frage mich, warum du für so etwas triviales und kurzes eine Funktion schreibst?! - Das wäre hier ohne die Funktion sogar einfacher zu benutzen..

    Vor allem die zweite und dritte Funktion haben schon ihre Berechtigung, wenn sie oft benötigt werden. Und damits einheitlich ist, auch die erste. :p

    Kritisier lieber die Leute, die zu wenig Funktionen machen. 😉



  • Nexus schrieb:

    drakon schrieb:

    Also ich frage mich, warum du für so etwas triviales und kurzes eine Funktion schreibst?! - Das wäre hier ohne die Funktion sogar einfacher zu benutzen..

    Vor allem die zweite und dritte Funktion haben schon ihre Berechtigung, wenn sie oft benötigt werden. Und damits einheitlich ist, auch die erste. :p

    Dann muss man sie aber wirklich in jeder zweiten Zeile brauchen. 😉

    Kritisier lieber die Leute, die zu wenig Funktionen machen. 😉

    Schon passiert. 🙂



  • Sooooo... 😃
    Es waren sogar 2 Bugs!
    1. In der Mid()-Funktion von VB beginnt der Index bei 1!!!
    -Substr() beginnt aber bei 0!
    => Eine "-1" an der richtigen Stelle bewirkt Wunder! 😉

    2. In der "Textverdreher()-Funktion habe ich anscheinend ein "i" mit einer "1" vertauscht... 🙄

    Wegen der Menge an Funktionen:
    Ich finde es einfach übersichtlicher...
    Das ist vorallem praktisch wenn man etwas verändern muss.

    Und jetzt funktioniert auch meine Permutation 😃
    naja... fast... irgendwie wird eine Runde übersprungen... 😞
    Aber das kriege ich auch noch hin 😃

    // Funktionen:
    void textverdreher(string x,string y){
      int i=1,j=0;
      j = y.length();
      if(j==1){
         string z = x + y;
         cout << z << "\n"; 
      }else{
      for(i=1;i<j;i++){
      textverdreher(x + vbmid(y,i,1),vbleft(y,i-1) + vbright(y,j-i));}}}
    
    string vbmid(const string& quelle,int index,int laenge){      
    return quelle.substr(index-1,laenge);}
    
    string vbleft(const string& quelle,int laenge){
    return quelle.substr(0,laenge);}
    
    string vbright(const string& quelle,int laenge){
    return quelle.substr(quelle.length()-laenge,laenge);}
    


  • Phu.. Einrücken solltest du aber auch anständig.. Im anderen Thread siehst du sonst, was draus wird. 😉



  • drakon schrieb:

    Phu.. Einrücken solltest du aber auch anständig.. Im anderen Thread siehst du sonst, was draus wird. 😉

    Ist klar...
    Das ist aber jetzt mein 😕 fünftes(?) Programm das ich geschrieben habe...
    Edit: Und die vorherigen habe ich geschrieben um cin, cout und substr zu testen!!!
    Du kannst von einem Lehrling auch nicht erwarten das gleich alles kann... :p
    Habt ihr irgendwo eine Anleitung wo gezeigt wird wie man Einrücken sollte?
    Ich habe es bis jetzt für mich recht übersichtlich gemacht 😃



  • Jin86 schrieb:

    Habt ihr irgendwo eine Anleitung wo gezeigt wird wie man Einrücken sollte?

    Das ist relativ einfach. 😉

    Rücke einfach eine Ebene weiter ein, wenn du eine öffnende geschweifte Klammer oder Sprungmarke in switch hast (oder auch nur eine einzelne Zeile bei if etc). Bei der schliessenden gehst du wieder zurück. Wenn eine Funktion langsam gross und unübersichtlich wird, kannst du über eine Aufteilung in mehrere Funktionen nachdenken.

    Das Weitere ist dann schon sehr subjektiver Codestil...



  • void textverdreher(string x,string y)
    {
      int i=1,j=0;
      j = y.length();
    
      if(j==1)
      {
         string z = x + y;
         cout << z << "\n";
      }
      else
      {
         for(i=1;i<j;i++)
         {
             textverdreher(x + vbmid(y,i,1),vbleft(y,i-1) + vbright(y,j-i));
         }
      }
    }
    
    string vbmid(const string& quelle,int index,int laenge){      //1. Variante
        return quelle.substr(index-1,laenge);
    }
    
    string vbleft(const string& quelle,int laenge) //2. Variante
    {
        return quelle.substr(0,laenge);
    }
    
    string vbright(const string& quelle,int laenge)
    {
        return quelle.substr(quelle.length()-laenge,laenge);
    }
    

    So würde ichs machen. Bei den unteren Funktionen siehst du beide Varianten. Aber etwas anderes habe ich nicht wirklich gesehen. Manchmal, wenn der nachfolgende Code sehr kurzt ist auch das hier:

    if ( meine_var == dasda ) irgendwas = 2;
    

    Es ist jetzt nicht so, dass es da einen Zwang gibt, aber das sind so die normalern Einrückungsarten, die man immer wieder sieht und eigentlich jeder (mehr oder weniger gut) lesen kann. Meistens helfen einem die IDE's ja bei der Einrückung und ich belasse es eigentlich so, wie es mir vorgegeben wird. (ausser bei ein paar Ausnahmen..). Wenn ich eine Bedinung sehe, dann will ich die nicht lesen müssen, sondern einfach sehen und verstehen. Wenn da irgendwas gewurschtelt ist, muss ich noch die Klammern zählen gehen und das ist nicht wirklich produktiv. (Darum neheme ich meist auch die 2. Variante, weil für mich die Blöcke viel offensichtilcher sind..)



  • Alles klar...
    Variante 2 gefällt mir wegen der Klammern 😃
    Aber ich finde das der Code dadurch irgendwie zu "flockig" wird...
    (Sorry.. habe mal in einer Confiserie gejobt)
    Ich brauche irgendwas Struckturiertes vor meinen Augen...
    Werde wohl die beiden Mixen wen das ok ist 😉



  • Jin86 schrieb:

    Aber ich finde das der Code dadurch irgendwie zu "flockig" wird...

    Der Code ist nicht mehr so kompakt, was aber auch einfacher zu lesen ist. Das wirst du früher, oder später merken. 😉

    Ich muss mich durch Code kämpfen, der in der Variante 1 geschrieben ist und ich darf oft feststellen, dass ich die Gliederung nicht sehe, weil ich die (manchmal recht langen Zeilen) nicht ganz durchlese und dam Ende das { nicht sehe nund schon ist das für mich ein Block und stelle dann erstaunt fest, wenn ich auf ein else stosse, dass das ja bedingt war.. 🙄

    Bei kurzen Funktionen mag das ja schön aussehn (mache ich da ja manchmal auch), aber in etwas grösseren Abschnitten einfach nur störend..



  • Ich bedanke mich bei euch allen!!
    Ihr habt mir wirklich weitergeholfen!
    Mein doffes Buch hat halt cstrings in den Vordergrung geschoben...
    Der Rest sollte auch machbar sein 😃
    oder hat jemand zufällig eine Idee??? 🙄
    Als nächstes muss ich mir eine Übung zum Thema Klassen überlegen 😉
    Achso...
    Beim lesen der FAQ habe ich was aufgeschnappt, was mich iritiert:
    Warum ist "using namespace std" "böse"???? 😕
    Diese Aussage kam von .filmor
    Was er meint ging da irgendwie nicht hervor....
    Edit: Gibt es irgendwo sowas wie eine Programmierer-Tastatur zu kaufen???



  • Das war wohl in den Headern gemeint.

    Man sollte das vermeiden, weil ein Header von anderen Files included wird und der unter umständen keinen Namensraum schon offen haben will, sondern seinen eigenen benutzen. Darum ist es in Headern "böse". In Quelldateien ist das aber ohne Probleme nutzbar und wird oftmals auch gemacht.



  • Jin86 schrieb:

    Edit: Gibt es irgendwo sowas wie eine Programmierer-Tastatur zu kaufen???

    Meinst du so eine? 😃



  • so in der Richtung 😃
    Das mit dem Alt+7, Alt+0, Shift+8 und Shift+9 geht mir gegen den Strich...
    Achso...
    Was haltet ihr von NetBeans6????



  • Du kannst die Tastenbelegung frei belegen..


Anmelden zum Antworten