C anagramma készítés?
#include <stdio.h>
#include <string.h>
int isAnagram(unsigned char *s1, unsigned char *s2)
{
char c[256];
memset(c, 0, 256);
for (int i = 0; s1[i]; ++i)
{
if (isalpha(s1[i]))
++c[tolower(s1[i])];
}
for (int i = 0; s2[i]; ++i)
if (isalpha(s2[i]))
--c[tolower(s2[i])];
for (int i = 0; i < 256; ++i)
if (c[i] != 0)
return 0;
return 1;
}
int main()
{
puts(isAnagram("Ab", "Ba") ? "OK, anagramma.\n" : "Nem anagramma.\n");
system("pause");
printf("\n");
printf("\n");
return 0;
}
Nem igazán értem a kód lényegét, addig világos hogy a memset 0-ra írja az összes 256 helyet, majd valahogy megszámolja a nullákat.
„Nem igazán értem a kód lényegét, addig világos hogy a memset 0-ra írja az összes 256 helyet, majd valahogy megszámolja a nullákat.”
Amíg megelégszel ennyi világossággal, nem is fogod megérteni a lényegét.
Egyébként meg: Ez mitől „készítés”? Nem próbáltam még ki, hogy működik-e, de a szándék láthatólag csak annyi, hogy eldöntse két bevitt szóról, hogy anagrammák, vagyis azonos betűhalmazok-e.
Az isAnagram függvény tuképpen megvizsgálja, hogy a két string paraméter azonos betűkből áll-e, tehát hogy ugyanazon betűkészlet átrendezésével egyikből előállítható-e a másik. (Így első blikkre ez az angol betűkkel működik, karakterkódolástól függően, bár lehet, hogy UTF-8-cal is értelmes eredményt ad.)
Először csinál egy karakter darabszám gyűjtő tömböt (c[]), amiben a karakterek előfordulását tárolja. Az első for ciklus a tömbben az első szöveg betűinek számát rögzíti, a második for ciklus ugyanezt teszi, csak a második szövegben lévő karakterek számát levonja belőlük. Vagyis ha egy karakter mondjuk kétszer szerepelt az első és második szövegben is, akkor a c[] tömb megfelelő eleme nulla lesz. (Az első ciklus kétszer növelte, a második kétszer csökkentette.) A harmadik for ciklus már csak azt ellenőrzi, van-e a tömbben nullától különböző érték. Ha igen, akkor a két karakter "kupac" nem egyezik meg.
@#4:
Hát, nem tudom, ezzel a poéngyilkossággal érdemes volt-e elrontani a felfedezés örömét... Az egész kalandból jóformán csak olyan együgyű tisztázni valók maradtak, hogy mi az isalpha() meg a tolower() szerepe. Szerencsésebb lenne, ha legalább a
for (int i = 0; s1[i]; ++i){...}
ciklus működését Kérdező magyarázhatná meg, mielőtt minden érdekességet kiherélünk a programból.
Na tessék, ha nem a kérdésre válaszolok, az a baj, ha a kérdésre válaszolok, az a baj... :))
Amúgy én sem szeretek ennyire a közepébe vágni, de gondoltam itt nem feladat megoldásról van szó, hanem egy kész kód értelmezéséről.
@#6:
Nem tagadhatom az igazadat, mi több, lehet, hogy Kérdező is éppen ezt várta, de akkor is úgy érzem, oda a fejtörő sava-borsa. Mert, ha úgy explicite kimondja, hogy nem akar foglalkozni vele... de mindegy is, a kérdésben eleve benne foglaltatott a kockázat, hogy kiveszed a kezéből a munkát, vagy mitt'omén, a fejéből a gondolkodást. Hogy ezt eddig nem kérte ki magának, máris arra utal, hogy helyes döntés volt a magyarázat beküldése, szerencsére az én mulatságomat már nem rontotta el.
Ami a #3 hozzászólásom lepontozását illeti, szívből fájlalom, hogy valaki már megint kevésnek érezte magát az eltérő álláspontjának artikulálására. Ha ugyanis magam próbálom meg pontról-pontra kiértékelni, mennyire vállalható az álmosító éjhomályban született véleményem, én nem látom olyan rossznak ezt az elfogult statisztikát.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!