Quote:
Originally Posted by Jeoni
Die Begründung, warum dein Programm nicht funktioniert, hat warfly schon gegeben. Präsentiert hat er aber eine Funktion, die man eher isPalindrome nennen sollte. Sie prüft nur auf einen Spezialfall eines Anagramms, nämlich dem des Palindroms.
|
Stimmt verwechsel die immer
Quote:
|
Ich dank euch Leute. Leider bin ich nicht auf dem selben Level eurer geposteten codes. So sehr wie ich es versuche sie zu verstehen, es gelingt mir nicht. Und c & p ist nicht der Sinn der Sache.
|
Dann versuche ich dir mal den Code von Jeoni zu erklären:
Die Idee ist, ein Ansistring besteht aus Charactern, Byte großen Zahlen von 0 bis 255 (Siehe ASCII Tabelle). Um rauszufinden ob das Wort ein Anagramm ist müssen wir nur überprüfen ob die anzahlen aller einzelnen Buchstaben bei beiden Wörtern gleich sind. Wir zählen also die A's, die B's, etc.
Dafür wird ein Array verwendet welches die Anzahlen sichert. Dieses Array benötigt 255 Felder (für die Zeichen 1..255, 0 darf sowieso nur einmal vorkommen am Ende eines Strings)
Code:
unsigned char chars[255];
der Datentyp unsigned char stellt Zahlen zwischen 0 und 255 dar, da du eh nicht mehr buchstaben in deinem Wort haben kannst reicht er völlig aus, der typ könnte natürlich auch int sein.
Nun hat sich Jeoni in seinem Code zunutze gemacht das ein 'A' letztlich nur eine Zahl ist (65), und man darüber dann auf ein Array Feld zugreifen kann
So würde
eine 3 in das 65te Feld des Arrays schreiben.
Nun wird einfach in einer Schleife über die Wörter gelaufen.
Um nur ein Array zu verwenden wird für jeden Buchstaben in Wort 1 der entsprechende Counter erhöht
und für jeden Buchstaben aus Wort 2 der Counter verringert
Somit, wenn die Wörter aus den selben Buchstaben bestehen muss der Counter in der Summe für jeden Buchstaben 0 ergeben.
das memset am Anfang ist nur dafür da um zunächst einmal alle Felder des Arrays zu nullen, bei Statischen Arrays ist der Speicher, welcher für das Array alloziiert wurde bereits beschrieben mit den werten die zuletzt dort lagen.
Ein kleiner Lauf mit den wörtern ABC und BCA:
Code:
1. Schleifendurchgang:
chars['A']++;
chars['B']--;
Damit ist:
chars[65] == 1
und
chars[66] == -1 (255)
2. Schleifendurchgang:
chars['B']++;
chars['C']--;
Damit ist:
chars[65] == 1
und
chars[66] == 0 (-1 + 1)
und
chars[66] == -1 (255)
3. Schleifendurchgang:
chars['C']++;
chars['A']--;
Damit ist:
chars[65] == 0 (+1 - 1)
und
chars[66] == 0 (-1 + 1)
und
chars[66] == 0 (-1 + 1)
Die anderen Felder wurden nie verwendet, daher sind alle Felder = 0 also ist es ein Anagramm
Code:
for (unsigned int i = 0; i < (sizeof(chars) / sizeof(chars[0])); i++)
if (chars[i])
return 0;
return -1;
Macht nichts anderes als zu überprüfen:
Gehe jedes Feld durch, ist das feld != 0 (kürzer mit if (chars[i])) dann ist es kein Anagramm, und return 0 (false)
Wenn für jedes Feld der Wert = 0 war so wurde kein false returned, also return -1 (true)