Palindrome ermitteln
-
OK.....sorry wegen meiner Reaktion...aber deine Antwort war für mich eindeutig zweideutig.
Ich werde es auf jeden fall mal ausprobieren.
Was meinst du eigentlich mit: //laufen die indizes echt von 1 bis Length oder
{//von 0 bis Length-1?Trotzdem würde mich mal interessieren wieso ich die Zeichen nicht löschen kann!
vielen dank schon mal...und nochmal SORRY
-
nxer schrieb:
Was meinst du eigentlich mit: //laufen die indizes echt von 1 bis Length oder
{//von 0 bis Length-1?in den meisten c++-dialekten ist es üblich, daß die buchstaben eines strings str von str[0] bis str[str.leghth()-1] gehen. mich würde es gelinde gesagt wundern, wen borland einen sonderweg ginge und die buchstaben von str[1] bis str[length()] hätte. dein code scheint aber davon auszugehen, daß sie von 1 bis length gehen.
Trotzdem würde mich mal interessieren wieso ich die Zeichen nicht löschen kann!
kannste auch, jetzt wo ich es nochmal überlege.
dein suchen nach leerzeichen hat mich verwirrt. dachte, dann müssen man gleich auch noch nach rufzeichen, nach apostrophs und so weiter suchen. ist ja unfug.
einfach deinen weg gehen und löschen und sogar gar nicht nach leerzeichen gucken. einfach jeden nicht-buchstaben wegmachen. sei es apostropf oder leerzeichen oder sonstewas.void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString wort = edt_eingabe->Text ; wort = wort.UpperCase() ; AnsiString inv ; int test = wort.Length() ; for(int a=1;a<=test;a++) { if((wort[a]<65)||(wort[a]>90)) wort.Delete(wort[a],1); /* while(wort.Pos(' ')) diese schleife bringt nix (oder nicht genug) { wort.Delete(wort.Pos(' '),1) ; test = wort.Length() ; }*/ test = wort.Length() ; //und das hier muss aus der while-schleife raus! } for(int x=1;x<=test;x++) inv.Insert(wort[x],1) ; if(wort==inv) ShowMessage("Palindrom") ; else ShowMessage("Kein Palindrom") ; }
vielleicht war's das schon.
-
noch mal ich.....
hat ich sehr logisch angehört. Doch leider funktioniert das nicht. Die leerzeichen, geschweige denn Kommata oder Apostrophs werden nicht gelöscht.
Habe mal in einer ASCII Tabelle geschaut, dort sind auch keine leerzeichen aufgeführt.Habe noch mal probiert ein Komma direkt ohne Palindrom oder so zu löschen...No Chance
Noch irgendeine idee???
danke schon mal!
-
Hallo
Schau dir doch in der Hilfe mal die Memberfunktionen von AnsiString an.
Das Delete müsste in deiner Schleife so wort.Delete(a,1); aussehen. Desweiteren gibt es auch noch die schöne Funktion StringReplace. Da kannst du auch beliebige Zeichen gegen Nichts tauschen (sprich löschen). Vielleicht ist es hier besser diesen Post nach Borland C++ Builder zu verschieben.@volkard
Das mit dem Laufindex ist schon richtig. Der beginnt bei AnsiString bei 1. Das liegt an der Kompatibilität zur Klasse String bei Object Pascal (die VCL besteht ja daraus).Ciao
PS.
Wenn du innerhalb einer Schleife nach Length löschen willst, solltest du besser von hinten beginnen. Sprich rückwärts durchlaufen.
-
Es funktioniert einfach nicht. Die Kommatas und Apostrophs lassen sich einfach nicht löschen, hat jemand von euch noch eine idee???
Help....nxer
-
Mal ne ganz blöde Idee: kann es sein, dass deine Funktionen nur mit dem einfachen ASCII Zeichensatz was anfangen können? AnsiString kenn ich zwar net, hört sich aber so an. Dieser Zeichensatz nutzt lediglich 7 Bits. Dein Apostroph (schreibt man das noch so oder doch mit f) hat jedenfalls den Hexwert b4 und liegt damit ausserhalb des gültigen Bereichs. Ich nutze normalerweise den ' (hex 27) als Apostroph. Probiers einfach mal damit und guck ob's dann immer noch net geht.
-
ne hat nichts gebracht...die zeichen werden einfach nicht geloescht.
Müsste doch eigentlich mit der ASCII abfrage funktionieren!Vielen dank für dein Mühe
nxer
-
hallo.
hab auch mal versucht, sowas zu schreiben.
das mit komma bzw apostroph löschen klappt, in der palindrom-funktion ist ein fehler. war jetzt zu faul, mir alles durchzulesen, deshlab poste ich einfach mal das ganze programm, vielleicht könt ihr was davon gebrauchen.//palindrom.cpp #include <iostream.h> bool palindrom(int l, int r); void change(void); const int MAX = 40; char satz[MAX]; char satz2[MAX]; int main(void) { int i=0; //satz füllen if(palindrom(0,MAX)) cout << "Palindrom" << endl; else cout << "Kein Palindrom" << endl; return 0; }; bool palindrom(int l, int r) { if((r-l == 2) && (satz2[l] == satz2[r])) return true; else if(r-l < 2) return true; else if(satz2[l] == satz2[r]) { palindrom(l+1,r-1); } else return false; } //Leerzeichen etc. entfernen. void change(void) { int d = 0; char zeichen; for(int i = 0;i < MAX; i++) { if(((satz[i] >= 65) && (satz[i] <= 90)) | ((satz[i] >= 97) && (satz[i] <= 122))) { if((satz[i] >= 97) && (satz[i] <= 122)) zeichen = satz[i] - 32; else zeichen = satz[i]; satz2[d] = zeichen; d++; } } }
-
Ich würde das dann so machen:
#include <iostream> #include <string> std::string palindrom(std::string& text) { std::string newtext; for(unsigned int i = 0; i < text.length(); i++) { if(isalpha(text[i]) || text[i] == ' ') // wie Windalf newtext += text[i]; // wie volkard } return newtext; } int main() { std::string text = "m%$e$i096n n52a&/m§$e §$i45.,s342t <<|/*-t§$!e458s12?=)t}}"; std::cout << palindrom(text); }
-
Hi Leute,
hab mal eine Nacht drüber geschlafen, und siehe da auf einmal klappt es.
Wen es interessiert:
AnsiString wort = edt_eingabe->Text ; wort = wort.UpperCase() ; AnsiString inv ; AnsiString ewort ; for(int a=1;a<=wort.Length();a++) { if((wort[a]>='A')&&(wort[a]<='Z')) ewort+=wort[a]; } int test = ewort.Length(); for(int x=1;x<=test;x++) inv.Insert(ewort[x],1) ; if(ewort==inv) ShowMessage("Palindrom") ; else ShowMessage("Kein Palindrom") ;
Vielen dank für eure hilfe
Gruss
nxer