Rückgabeanweisung return
-
Oke...Das klappt schonmal!
Keiner ne Idee wegen der 1. Frage?

-
Poste mal einige Zeichenfolgen die das Programm nicht als Palindrom erkennt.
Bis auf das immer nur das letzte Zeichen der Eingabe in einen Kleinbuchstaben umgewandelt wird, ist das Programm doch ok ?!?
-
Das Programm erkennt so wies gerade ist GARKEIN Palindrom...Egal was ich eingebe, es kommt raus das es kein Palindrom ist!
Wenn ich aber in der C++ Datei mit den Methoden anstatt den return´s 0 & 1 einfach die cout´s einfüge...
// Wenn Ende größer als Anfang ist = KEIN Palindrom... if( ende > anfang ) { cout << "Kein Palindrom"; } // Ansonsten ist es ein Palindrom else { cout << "Ist ein Palindrom"; } }...dann klappt es einwandfrei!
1441, anna ist z.b. ein palindrom! 1234567 zeigt er als kein Palindrom an. Also alles richtig im Prinzip! Nur will ich wie gesagt die cout´s da raus kriegen und diese nur in der MAINDATEI verwenden

-
Ich wundere mich, warum du ein "Palindrom" gleich als Klasse definiert hast. Nach meinem Empfinden beschreibt ein Palindrom eine Eigenschaft eines Wortes oder eines Textes, die nur zwei Zustände zulässt:
a) Bei dem Wort/Text handelt es sich um ein Palindrom (wahr)
b) Bei dem Wort/Text handelt es sich nicht um ein Palindrom (falsch)Fazit:
Du testest, ob es sich bei einer Zeichenkette (std::string) um ein Palindrim handelt oder nicht:bool istPalindrom(const std::string&); // Gibt 'true' zurück, wenn es sich bei dem übergebenen // std::string um ein Palindrom handelt.In der aufrufenden Umgebung kannst du nun eine Zeichenkette prüfen und entsprechend reagieren (ist etwas unordentlich):
int main(int argc, char** args) { std::string test1 = "Palindrom"; std::string test2 = "aghjhga"; std::cout << "Bei \"" << test1 << "\" handelt es sich" << (istPalindrom(test1) ? "" : " nicht") << " um ein Palindrom" << std::endl; std::cout << "Bei \"" << test2 << "\" handelt es sich" << (istPalindrom(test2) ? "" : " nicht") << " um ein Palindrom" << std::endl; return EXIT_SUCCESS; }So kannst du beliebig Prüfen, ob es sich um ein Palindrom handelt oder eben nicht. Wenn du zwischen Groß- und Kleinschreibung nicht unterscheiden willst, dann kannst du die Zeichenketten vorher verändern (toupper, etc).
Zu guter letzt die Funktion (auch nicht gerade hübsch, weil kurzfristig zusammengekleistert):
bool istPalindrom(const std::string& s) { // Prüft die Zeichenkette zeichenweise von Anfang und vom // Ende an auf Gleichheit. Wird eine Ungleichheit // ermittelt, wird die Funktion mit 'false' beendet. for(size_t i = 0; i < s.size() / 2; ++i) { if( s.at(i) != s.at(s.size() - 1 - i) ) return false; } return true; }Grüße... Heiko
-
//----------------HAUPTPROGRAMM--------------------------------- int main(int argc, char* argv[]) { int j; string zeichen; bool meldung; palindrom meinpalindrom; cout << "Willkommen beim Palindrom Programm!"; cout << "\n" << "Bitte eine Zahl oder ein Wort eingeben: "; getline(cin, zeichen); meinpalindrom.setZeichenfolge( zeichen ); meldung = meinpalindrom.zeichenpalindrom(); if ( meldung == true ) cout << "\n" << meinpalindrom.getZeichenfolge() << "ist ein Palindrom!"; else cout << "\n" << meinpalindrom.getZeichenfolge() << "ist kein Palindrom!"; getch(); } //--------------------C++Datei mit Methoden etc.---------------------------- #include <conio.h> // für getch() #include <iostream.h> // für cout #include "Palin.h" void palindrom :: setZeichenfolge( string z ) { zeichenpalin = z; } string palindrom :: getZeichenfolge( void ) { return zeichenpalin; } bool palindrom :: zeichenpalindrom() { // Maximale Zeichenlänge maximum = zeichenpalin.length(); // Anfangsindex anfang = 0; // Endindex ende = maximum - 2; // Zeichen werden hochgezählt... for ( i = 0; i < ende + 1; i++) { // Umwandlung von Groß in Kleinschreibung if ( zeichenpalin[i] >= 'A' && zeichenpalin[i] <= 'Z' ) zeichenpalin[i] = 'a' + (zeichenpalin[i] - 'A' ); } // Leerzeichen werden "übersprungen" if ( zeichenpalin[i] == ' ' ) { i++; } while( ende > anfang ) { // Wenn das erste Zeichen nicht = das letzte Zeichen, dann brich ab! if( zeichenpalin[anfang] != zeichenpalin[ende] ) { break; } // Anfang wird um 1 erhöht anfang++; // Ende um 1 verringert ende--; } // Wenn Ende größer als Anfang ist = KEIN Palindrom... if( ende > anfang ) { return false; } // Ansonsten ist es ein Palindrom else { return true; } } //----------------------HEADERDATEI------------------- #ifndef PALINDROM_H #define PALINDROM_H #include <conio.h> // für getch() #include <iostream.h> // für cout class palindrom { public: void setZeichenfolge( string ); string getZeichenfolge( void ); bool zeichenpalindrom (); private: string zeichenpalin; int anfang, ende, maximum, i; }; #endif //---------------------------------------------------------------------------So das mit dem return klappt jetzt alles... :xmas1:
Jetzt habe ich noch ein letztes Problem! Ich möchte wenn ich einen Palindromsatz eingebe ALLE Leerzeichen im Prinzip "ausschneiden"! Bei manchen Sätzen wo die Leerzeichen von vorne gelesen nicht die gleichen sind wie von hinten gelesen klappt mein Programm noch nicht, z.b. bei EIN NEGER MIT GAZELLE ZAGT IM REGEN NIE!
Jmd ne Idee? Oo
-
entweder du löschst die Leerzeichen vor der Überprüfung (std::remove()) - oder du überliest sie beim Überprüfen (ersetze "anfang++" durch "do anfang++ while(!isalpha(*anfang);").
-
Blöde Frage!
"do anfang++ while(!isalpha(*anfang);").
Was bedeutet da dieses "isalpha" ?!
-
NephTis schrieb:
Was bedeutet da dieses "isalpha" ?!
Das ist eine Funktion der C-Lib, die angibt, ob das übergebene Zeichen ein Buchstabe ist (mit der Schleife überspringst du alles, was kein Buchstabe ist - inklusive Leerzeichen und Satzzeichen).
-
Alles klar klappt!

Vieeeeeeeeeelen Dank

-
Als kleiner Tip: lass dir nicht alles vorkauen. Bei isalpha haette z.B. eine einfache Google-suche nach isalpha() innerhalb von sekunden eine ausreichende Antwort gebracht. Bei C++-Funktionen und Klassen gerne auch mal nachschauen unter http://www.cppreference.com oder http://www.cplusplus.com/reference