Palindrom
-
Hallo,
ein Programm das überprüft ob ein word vor und rückwärts gelesen identisch ist.
Das Programm hat nur einen kleinen Hacken.
Es funktioniert nur wenn das Wort eine grade Anzahl von Buchstaben hat.
Also bei ABBA,ANNA usw funktioniert es.
Bei UHU hingegen nicht. Kann mir einer sagen warum?#include <stdio.h>
#include <string.h>
int i;
int a;
int anzahl=0;
char satz[80];
printf("Satz: ");
scanf("%s",satz);
a=strlen(satz);for(i=0; i<=a; i++) {
if(satz[i]==satz[--a])
anzahl++;if(anzahl==a)
printf("Satz ist Palindrom\n");
}Vielen Dank
-
Bei UHU gilt: satz[0]='U', satz[1]='H', satz[2]='U'
For-Schleife wird betreten:
- i=0, a=3: Hier ist satz[0]==satz[2], also anzahl=1
- i=1, a=2: Hier ist satz[1]==satz[1], also anzahl=2, aber a nur noch 1. Jetzt vergleichst Du a mit anzahl, und dieser Vergleich ist offensichtlich falsch.
-
Ich habe auch gerade so eins Programmiert für die Schule. Hier mal der Quellcode. Die Variablen Feld und Pali sind als Globale Variable gemacht darum stehen sie da nicht drin.Sonst eigentlich recht simpel
void palindrom (void) { int i,p,z; p=0; z=0; i=0; do { i=i+1; } while (feld[i] != '\0'); // Die Zeichen wurden gezählt do { if (feld[p]==pali[p]) { p=p+1; } else { printf("Es ist kein Palindrom\n"); system("pause"); return; } } while (p!=i); if (p==i) { printf("Es ist ein Palindrom\n"); } }
-
Es wäre schon sinnvoll eine Funktion zu schreiben der ein String übergeben wird und die dann einen (pseudo)boolschen Wert zurückgibt.
int is_palindrom(char *);
-
ihr müsst nur bis zur mitte gehen, also nicht alles vorwärts und rückwärts vergleichen:
int is_palindrom (char *str) { int len = strlen(str); int s; for (s=0; s<len/2; s++) if (str[s] != str[len-s-1]) return 0; return 1; }
-
Mein Vorschlag für "", "u", "Uu", "Uhu" und "Lagerregal":
int ist_palindrom(char *s) { char *e = s+strlen(s)-1; while(s < e) if (tolower(*s++) != tolower(*e--)) return 0; return 1; }
-
am besten noch noch spaces entfernen sonst klappt folgendes nicht:
Ein Neger mit Gazelle zagt im regen nie
-
servus... schrieb:
am besten noch noch spaces entfernen sonst klappt folgendes nicht:
Ein Neger mit Gazelle zagt im regen nieso ungefähr
int is_palindrome (char *s) { char *e = s+strlen(s)-1; while (s < e) { while (*s == ' ') s++; while (*e == ' ') e--; if ((*s++ ^ *e--) & 0xdf) return 0; } return 1; }
-
@ten: ähm, eher isspace( ) (tabs und so
)
Greetz, Swordfish
-
int is_palindrom(char *s) { int vergleichflag; char *e = s+strlen(s)-1; vergleichflag = 0; do { while(isspace(*s)) s++; while(isspace(*e) && e > s) e--; if (s >= e) return vergleichflag; vergleichflag = 1; /* mindestens ein Vergleich */ } while(tolower(*s++) == tolower(*e--)); return 0; }
-
wozu dieses vergleichsflag?
ich wette das bekommste mit eibem geschickt platzierten 'goto' wech...
-
Du wirst doch kein goto an die Wand malen wollen...
a) Kein Flag mehr
b) Für "", "u" und "uu" ReturnWert 0#include <conio.h> #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> char *list[] = { "", " ", " ", "u", "u ", " u", "uu", "u u", " uu ", " u\tu", " u u ", /* Palindrom */ "Uhu", "Uhu ", " Uhu ", "U h u", "U hu", "Anna", " anna", " a nn A", " a n\tn a", "\ta n n a ", "Lagerregal", "Ein Neger mit Gazelle zagt im Regen nie", /* kein Palindrom */ " a n n e ", " a h n e \t ", 0 }; int is_palindrome(char *s) { char *e = s+strlen(s); do { while(isspace(*s)) s++; while(s < e-1 && isspace(*(e-1))) e--; if (s >= e-1) /* fertig, mit e zurück zum Stringende */ { if (s == e-1) /* Uhu, ungerade Buchstabenanzahl */ { while(*e) if (!isspace(*e++)) /* 'u' */ return 1; } else /* s > e-1, Anna, gerade Buchstabenanzahl */ while(*e) if (!isspace(*e++)) /* 'n' */ while(*e) if (!isspace(*e++)) /* 'a' */ return 1; return 0; } } while(tolower(*s++) == tolower(*--e)); return 0; } int main() { int i; for (i = 0; list[i]; i++) { if (i) printf("\n"); printf("\"%s\" %u", list[i], is_palindrome(list[i])); } getch(); return 0; }
Ausgabe
"" 0 " " 0 " " 0 "u" 0 "u " 0 " u" 0 "uu" 0 "u u" 0 " uu " 0 " u u" 0 " u u " 0 "Uhu" 1 "Uhu " 1 " Uhu " 1 "U h u" 1 "U hu" 1 "Anna" 1 " anna" 1 " a nn A" 1 " a n n a" 1 " a n n a " 1 "Lagerregal" 1 "Ein Neger mit Gazelle zagt im Regen nie" 1 " a n n e " 0 " a h n e " 0
-
In [49]: def is_palindrom(s): ....: if s.replace(' ', '') == s[::-1].replace(' ', ''): return True ....: return False ....: In [50]: is_palindrom('ein neger mit gazelle zagt im regen nie') Out[50]: True In [51]: is_palindrom('python') Out[51]: False
-
def is_palindrom(s): s = s.replace(" ", "") return s == s[::-1]
is_palindrom = (lambda s: (lambda t: (t == t[::-1]))(s.replace(" ", "")))
welches bevorzuge ich wohl?
-
c.rackwitz schrieb:
welches bevorzuge ich wohl?
skriptsprachen bevorzugst du...
-
keksekekse schrieb:
b) Für "", "u" und "uu" ReturnWert 0
Randfrage: Warum sollte man sowas nicht als Palindrom auffassen? Wenn man rein nach der Definition geht, sind das Palindrome.
-
"u", "uu" und "Üü" sind jetzt drin. TODO: "Eine güldne, gute Tugend: Lüge nie!"
int tolower_ger(int ch) { switch(ch) { case 'Ä': return 'ä'; case 'Ö': return 'ö'; case 'Ü': return 'ü'; case 'ß': return 'ß'; /* TODO */ } return tolower(ch); } int is_palindrom(char *s) { char *e = s+strlen(s); if (*s == 0) /* ist 'non' ein Palindrom? */ return 0; /* eine Frage für filosofische Fische */ do { while(isspace(*s)) s++; while(s < e-1 && isspace(*(e-1))) e--; if (s >= e-1) /* fertig, ist Palindrom */ return 1; } while(tolower_ger(*s++) == tolower_ger(*--e)); return 0; /* kein Palindrom */ }
Ferner existieren noch Datums-Palindrome, z.B. der 20.02.2002.
an diesem Tag war mein 34. Geburtstag. Heute habe ich 2 CD's von ABBA gekauft und bekam 22.02 € zurück. Wobei 22.02 am heutigen Valentinstag auch noch eine besondere Bedeutung hat.
-
keksekekse schrieb:
an diesem Tag war mein 34. Geburtstag. Heute habe ich 2 CD's von ABBA gekauft und bekam 22.02 € zurück.
ich glaub' du hast 2.43 € zurückgekriegt
-
Nö, auf dem Zettel steht 22.02 € Rückgeld. Und wenn ich mit einem 30€-Schein gezahlt hätte, dann hätte ich 2.02 € zurückbekommen...
EDIT Zum Nachrechnen: 16.99 und 10.99 = 27.98 €
-
also wer sich cd's von abba kauft, muss schon palindrom-fan sein, anders kann man das nicht erklären