Bedingter Ausdruck



  • Kannst du dich mal verständlich ausdrücken? Was willst du genau erreichen?

    Was soll temp sein, wie gibst du es aus?


  • Administrator

    Ich nehme mal an, dass temp der std::string ist und words auch ein std::string ist, denn ein std::vector<std::string> oder ähnliches kann es nicht sein, da der Rückgabewert von Bedingtenanweisungen einheitlich sein muss. Dann ist aber wohl klar, dass dies nicht das gewünschte Ergebnis liefern wird:
    words[i] + words[i+1]
    Das ist eine Addition von char Werten. Das fügt die Dinger nicht zusammen.
    Vielleicht solltest du dieses seltsame und hässliche Konstrukt auseinander nehmen und daraus eine normale if-else Anweisung machen.

    Grüssli



  • Mh gibts keine Möglichkeit daraus einen String zu machen? Ich hab mal dass heir ausprobiert, funzt aber irgendwie nicht so ganz: strcat(words[i],words[i+1])

    MfG
    Stromberg


  • Administrator

    Ich halte dieses Elend nicht mehr aus:

    std::string temp;
    
    if(i < (words.size() - 1))
    {
      // Sofern words ein std::string ist.
      temp.append(words, i, 2);
    }
    else
    {
      temp = ' ';
    }
    

    Ist auch gleich viel leserlicher.

    Grüssli



  • Stromberg* schrieb:

    Mh gibts keine Möglichkeit daraus einen String zu machen? Ich hab mal dass heir ausprobiert, funzt aber irgendwie nicht so ganz: strcat(words[i],words[i+1])

    MfG
    Stromberg

    sollten word[i] und word[i+1] vom typ char sein gibt es einen konstruktor der string-klasse der daraus einen string macht

    std::string(1,word[i]) + std::string(1,words[i+1])
    


  • Oder auch words.substr(i,2) 😉



  • So, endlich ist es perfekt:

    if((temp = (i < (words.size()-1)) ? string(1,words[i])+string(1,words[i+1]) : " ") == "ff")
    {
           ++SPECIAL_letters[0];
    }
    else if(temp == "fl")
    {
           ++SPECIAL_letters[1];
    }
    else if(temp == "fi")
    {
           ++SPECIAL_letters[2];
    }
    

    Ich Zähle in einem Text die aufeinanderfolgenden Buchstaben Paare "ff" "fi" und "fl" (C++ Primer Übung 6.9).
    Findet ihr den Code mit "?"-Operator wirklich so umständlich?

    MfG
    Stromberg



  • Stromberg* schrieb:

    Findet ihr den Code mit "?"-Operator wirklich so umständlich?

    Wieso schreibst du nicht einfach lesbaren Code?

    Code Obfuscation ist nicht wirklich ein Zeichen guter Programmierung. 🙄



  • Stromberg* schrieb:

    Findet ihr den Code mit "?"-Operator wirklich so umständlich?

    Das nicht, aber in Kombination mit der Zuweisung im Ausdruck finde ich's schwierig lesbar. Folgendes würde mir wesentlich besser gefallen:

    std::string temp =  i<(words.size()-1)?  words.substr(i,2)  :  " ";
    if( temp == "ff")
        ...
    


  • Stromberg schrieb:

    Ich Zähle in einem Text die aufeinanderfolgenden Buchstaben Paare "ff" "fi" und "fl" (C++ Primer Übung 6.9).

    Badestrand schrieb:

    Stromberg* schrieb:

    Findet ihr den Code mit "?"-Operator wirklich so umständlich?

    Das nicht, aber in Kombination mit der Zuweisung im Ausdruck finde ich's schwierig lesbar. Folgendes würde mir wesentlich besser gefallen:

    std::string temp =  i<(words.size()-1)?  words.substr(i,2)  :  " ";
    if( temp == "ff")
        ...
    

    Ich finds immernoch hässlich - und vermutlich ist es auch sinnlos...

    if (words.empty ())
       return;
    
    for (std::string::const_iterator i(words.begin()), e(words.end()-1); i != e; ++i)
    {
      if (*i != 'f')
        continue;
      switch (*(i+1))
      {
        case 'f':
          ++SPECIAL_letters[0];
          break;
        case 'l':
          ++SPECIAL_letters[1];
          break;
        case 'i'
          ++SPECIAL_letters[2];
          break;
      }
    }
    

    oder allgemeiner:

    if ( words.size() < tosearch.size() )
       return;
    
    for (std::string::const_iterator i(words.begin()), e(words.end()-tosearch.size()); i != e; ++i)
    {
      std::string tmp (i, e);
      if (tmp == tosearch)
         ++SPECIAL_letters[0];
    }
    

    Geht bestimmt auch noch hübscher - aber kA...

    bb


Anmelden zum Antworten