Wie könnte man das vereinfachen?
-
Hey Leute!
Ich hab folgende Funktion geschrieben die einen String auf Palindrome prüft:
int compare(char* satz) { int len = strlen(satz), j = 0; for(int i=0; i<len; i++) { if(satz[i] == satz[len-i-1]) { j++; } } if(j == len) { return 1; } else { return 0; } }
So wie die da jetzt steht funktioniert sie zwar, aber mir gefällt noch nicht wie ich das gelöst habe. Insbesondere die zweite if-Abfrage. Ich erkenn quasi ob j gleich len ist und wenn muss ein Palindrom vorliegen. Habt ihr Vorschläge wie ich das etwas "eleganter" hätte machen können?
-
int compare(char* satz) { int links=0; int rechts = strlen(satz)-1; for(; links<rechts; links++,rechts--) { if(satz[links] != satz[rechts]) { return 0; } } return 1; }
-
-
volkard schrieb:
int compare(char* satz) { int links=0; int rechts = strlen(satz)-1; for(; links<rechts; links++,rechts--) { if(satz[links] != satz[rechts]) { return 0; } } return 1; }
Die Lösung hat mir schon sehr gut gefallen, auch wenn ich nicht ganz verstehe was du da machst. Was bedeutet das ganz linke, leere Argument des Schleifenkopfes? Warum steht da nix drin? Was macht das dann?
Ich hab jetzt mal meine Funktion nach deinem Vorbild abgewandelt. Die sieht jetzt so aus:
int compare(char* satz) { int len = strlen(satz); for(int i=0; i<len; i++) { if(satz[i] != satz[len-i-1]) { return 0; } } return 1; }
Mein Programm funktioniert damit jetzt auch. Warum machst du das so kompliziert mit 'nem leeren Teilschleifenargument?
-
Warum machst du das so kompliziert mit 'nem leeren Teilschleifenargument?
Wenn das stört, ich kann sie auch zu einer while-Schleife umbasteln.
int compare(char* satz) { int links=0; int rechts = strlen(satz)-1; while(links<rechts) { if(satz[links] != satz[rechts]) { return 0; } links++,rechts--; } return 1; }
Das mache ich so, weil ich es als Mensch auch so mache. Linker und rechter Zeigefinger halt, die auf Buchstaben zeigen.
Und von allein hört das mit den Fingern auf, wenn sie sich in der Mitte treffen. Das entspräche bei Dir i<len/2.
-
Hm, ok. Du ahmst also quasi das nach, was eigentlich dahinter steckt. Ich hab das Beispiel von dir mit der for-Schleife jetzt verstanden. Ich hab trotzdem mal mein Beispiel noch verändert. Ich hab die Variable len weggelassen. Ist das jetzt schlecht? Ich weiß nicht ich hab mit Code noch nicht so viel Erfahrung.
int compare(char* satz) { for(unsigned int i=0; i<strlen(satz); i++) { if(satz[i] != satz[strlen(satz)-i-1]) { return 0; } } return 1; }
-
Wie volkard schon mehrmals schrieb:
Du brauchst nur bisstrlen(satz)/2
durchgehen, denn wenn die linke Seite gleich der rechten Seite ist, ist die rechte auch gleich der linken Seite.
-
Gut. Ich hab's vernommen. Aber: Es gibt Palindrome, die haben eine geradzahlige Anzahl an Buchstaben wie z.B. Otto, aber es gibt auch Palindrome, die haben eine ungeradzahlige Anzahl an Buchstaben wie z.B. Retsinakanister.
Bei einer geradzahligen Anzahl kann ich mir strlen(satz)/2 schon vorstellen, aber bei einer ungeradzahligen Anzahl eben nicht. Wie soll dann das da gehen?
-
vip@r schrieb:
bei einer ungeradzahligen Anzahl eben nicht. Wie soll dann das da gehen?
olllo
Letzter Vergleich:
r links o[l]l[l]o
Edit: Oder bei <= :
ol[[l]]lo
-
Bei ungerade Anzahlen ghilt: Die Mitte ist gleich der Mitte. Brauchste nicht zu testen.
Also while(links<rechts) und nicht if(links<=rechts), wobei <= auch geht. Dann zeigen halt die Finger auf den selben Buchstaben und ich schaue nach, ob der selbe zu sich gleich ist. Klingt zwar komisch, ist aber nicht falsch.Mit len ist mir die Argumentation zu schwierig. Bis auf viel Arbeit, mir aus i heraus die Finger vorzustellen, ist sie aber gleich.
-
Dann überleg mal mit welchem anderen Buchstaben du den mittleren vergleichen willst.
-
Verdammt ihr habt Recht. In der Mitte kann dann stehen was will und mag; das Palindrom ist dann ein Palindrom...
Danke danke!