Anagramm
-
Hallo,
ich habe eine Frage an euch.
Ich habe ein Code geschrieben, das überprüft ob alle Buchstaben von satz1 auch in satz2 enthalten sind. Leerzeichen werden nicht berücksichtigt.Mein Code schaut so aus:
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> int main (void) { int i; int j; int gefunden; gefunden = 0; char *satz1 = "Subvention"; char *satz2 = "Venus in Beton"; for (i =0; toupper(satz1[i] != '\0'; i++){ for (j=0; toupper(satz2[j]) != '\0';j++){ if (satz1[i] == satz2[j]) { gefunden = 1; satz2[j] = ' '; }else{ gefunden = 0; } } printf("%i\n", gefunden); if( satz2[j] != ' '){ gefunden = 0; } if ( gefunden != 1){ printf("Es handelt sich um kein anagramm"); } else { printf("Alles super"); } return 0; } }
Könnt ihr mir helfen? WAs habe ich falsch gemacht?
-
Hi
sandra92 schrieb:
Könnt ihr mir helfen?
WAs habe ich falsch gemacht?Eine Klammer in der for-Schleife fehlt.
Die return-Anweisung in Zeile 38 beendet vermutlich das Programm schneller, als dir lieb ist.
Ein char*-String ist nur lesbar, nicht beschreibbar.
Darum kracht es in Zeile 21.
Bei der Prüfung auf Anagramm ist ein Beschreiben nicht nötig.
Wenns beschreibbar sein soll, dann deklariere:char satz1[] = "Subvention"; char satz2[] = "Venus in Beton";
Ansonsten ist immer eine kurze Beschreibung des Problems oder des Fehlers von Vorteil.
-
sandra92 schrieb:
for (i =0; toupper(satz1[i]); i++){
for (j=0; toupper(satz2[j]);j++){Selbst wenn du das so innerhalb des Bedingungteils der for-Schleife geschrieben hättest,
nützt dir das toupper nichts, weil es auf die Vergleiche innerhalb des Schleifenkörpers keinen Einfluss hat.Dann sind da noch einige logische Redundanzen in deinem Code enthalten.
Vereinfacht könnte das so aussehenint main (void) { int i, j; char *satz1 = "Subvention", *satz2 = "Venus in Beton"; size_t len1 = strlen(satz1), len2 = strlen(satz2); for ( i = 0; i < len1; i++ ) { for ( j = 0; j < len2; j++ ) if ( toupper ( satz1[i] ) == toupper ( satz2[j] )) break; // Der Buchstabe satz1[i] ist in Satz2 enthalten. Beendet die innere Schleife und macht mit der äußeren weiter. if ( j >= len2 ) i = len1 +1; // Der Buchstabe satz1[i] kommt nicht in Satz2 vor. Beendet die äußere Schleife if ( i == len1 - 1 ) break; // Der erste Satz wurde vollständig durchlaufen. Break verhindert ein i == len1 für die if-Anweisung unten. } if ( i < len1 ) puts ( "anna" ); else puts ( "no anna" ); getchar(); return 0; }
Ich weiß nicht ob die Anzahl der Zeichen bei einem Anagramm gleich sein muss, ggf. kann man am Anfang die String-Längen vergleichen.
Edit: Anna entfernt. :p
Edit-X: Edit Party