Palindrom



  • Hallo c++ Community
    Ich soll einen Programm schreiben, der Palindrom Text erkennt
    Der eingelesene Text :
    1.soll ohne Leerzeichen und Sonderzeichen ausgegeben.
    2. soll in der umgekehrte Folge ausgegeben.
    3. Nach reserve ,die neue Länge.
    4. Ob es sich um einen Palindrom handelt oder nicht.
    Alles hat funktioniert, außer die Länge des Textes nach reserve.
    Ich konnte die Länge der eingelesene Text ermitteln
    Habe auch gegoolt und habe nichts passendes gefunden.
    Ihr seid meine letzten Hoffnungen.
    Übrigens ich bin noch einen Anfänger
    Danke schon mal
    Hier ist mein Code

    #include <iostream>
    #include <string>
    #include <cctype>
    #include <bits/stdc++.h>
    
    using namespace std;
    string clean(const string& s);
    bool isPalindrome(const string& s);
    
    string clean(const std::string& s)
    {  string fixed=""; //initially empty
      char c; // a character to examine
      int sLength = s.length( );
      for (int i = 0; i < sLength; i++){
        c = s.at(i);
        if (!ispunct(c) && !isspace(c))
          fixed += c;
    
      }
      return fixed;
    
    }
    
    string reverse(const string& s)
    {
    	string rev = clean(s);
            reverse(rev.begin(), rev.end());
            return rev;
    }
    
    bool isPalindrome(const string& s){
       int i,j;
    
      i=0;
      j=s.length()-1;
    
      while(i<j)
      {
           //removing spaces and special characters
        while(i<j && isalnum(s[i])==0)
          i++;
        while(i<j && isalnum(s[j])==0)
          j--;
    
       //Checking if not palindrome
       if(toupper(s[i])!=toupper(s[j]))
        {
         return false;
        }
       else
       {
        i++;
        j--;
       }
    
      }
      return true;
    
    }
    
    
    int main( ){
      string str;
      string fixed;
    
      cout << "Geben Sie eine Zeile ein: \n";
      getline(cin, str);
    
      cout << endl;
      cout<<"Ohne Sonderzeichen: ";
      cout<<clean(str);
       cout << endl;
    cout<<"Laenge: ";
     cout<<str.length();
       cout << endl;
         cout << endl;
       cout<<"Umgekehrte Reihenfolge: ";
        cout << reverse(str);
           cout << endl;
         cout << endl;
       int ans=isPalindrome(str);
      if(ans==1)
       cout<<"Palindrom? Ja.";
      else
       cout<<"Palindrom? Nein.";
       cout << endl;
    
      return 0;
    }
    
    
    


  • Bearbeite bitte Deine Frage und rück' Deinen Code erstmal vernünftig ein. So will das niemand lesen.



  • @dooni sagte in Palindrom:

    reserve

    ? Oder doch reverse? Umdrehen ändert natürlich nicht die Länge. Das passiert höchstens bei ohne Leerzeichen und Sonderzeichen.



  • @manni66
    ja ich meinte reverse umdrehen
    Nach dem löschen der Sonderzeichen un Leerzeichen ändert sich die Länge des Satzes
    Das passiert bei string clean
    Wie kann ich es machen?



  • auto foo = reverse(str);
    std::cout << foo << '\n';
    std::cout << "Laenge: " << foo.length() << '\n';
    

    @Swordfish sagte in Palindrom:

    Bearbeite bitte Deine Frage und rück' Deinen Code erstmal vernünftig ein. So will das niemand lesen.



  • Die Palindrom-Check-Funktion kannst du drastisch kürzen. Sieh dir hierzu das Beispiel auf der Referenz an:

    https://en.cppreference.com/w/cpp/algorithm/equal



  • ...und auch das clean geht einfacher. Such einfach mal nach dem erase-remove-Idiom.

    std::string clean(std::string s) {
       s.erase(std::remove_if(s.begin(), s.end(),
                              [](char c){return ispunct(c) || isspace(c);}),
               s.end());
       return s;
    }
    


  • @wob sagte in Palindrom:

    [](char c){return ispunct(c) || isspace(c);}
    

    char ist eine schlechte Idee weil die is...() Funktionen aus <cctype> UB auf negative Werte haben und char auch signed sein kann.

    @wob sagte in Palindrom:

    ...und auch das clean geht einfacher.

    Klar ist die ganze Aufgabenstellung auch viel kürzer zu lösen

    Ich soll einen Programm schreiben, der Palindrom Text erkennt
    Der eingelesene Text:

    1. soll ohne Leerzeichen und Sonderzeichen ausgegeben [werden].
    2. soll in der umgekehrte Folge ausgegeben [werden].
    3. Nach reserve, die neue Länge. [*]
    4. Ob es sich um einen Palindrom handelt oder nicht.
    #include <cctype>
    #include <string>
    #include <algorithm>
    #include <iostream>
    
    std::string remove_space_and_punct(std::string str) noexcept
    {
    	str.erase(std::remove_if(std::begin(str), std::end(str),
    		[](char unsigned ch) { return std::isspace(ch) || std::ispunct(ch); }), std::end(str));
    	return str;
    }
    
    std::string reverse(std::string str) noexcept
    {
    	std::reverse(std::begin(str), std::end(str));
    	return str;
    }
    
    int main()
    {
    	std::string input;
    	std::getline(std::cin, input);
    	auto input_reversed{ reverse(input) };
    	auto input_stripped{ remove_space_and_punct(input) };
    	std::cout << "Original: \"" << input << "\"\n"
    	             "Whitespace and punctuation marks removed: \"" << input_stripped << "\" "
    	             "(Length: " << input_stripped.length() << ")\n"
    	             "Reversed: \"" << input_reversed << "\n"
    	             "It" << (input != input_reversed ? " is not" : "'s") << " a palindrome.\n\n";
    }
    

    ... ist nur die Frage, ob jemand der noch mit Variablen und Rückgabewerten strauchelt da noch durchblickt 🙄

    * ) Gibt keinen Sinn. Nach "reverse" ist der Text genau so lang wie zuvor.

    @dooni sagte in Palindrom:

    #include <bits/stdc++.h>

    Lass das. Das ist kein Standard-Header.


Anmelden zum Antworten