Kezdőoldal » Számítástechnika » Programozás » C anagramma készítés?

C anagramma készítés?

Figyelt kérdé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.


2018. dec. 16. 20:11
 1/8 tabaki ***** válasza:

„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.

2018. dec. 16. 21:02
Hasznos számodra ez a válasz?
 2/8 anonim ***** válasza:
Nem, ez nem anagramma készítés.
2018. dec. 16. 21:49
Hasznos számodra ez a válasz?
 3/8 tabaki ***** válasza:
55%
Meg kell mondjam, nekem tetszik ez a kód. Én ugyanis általában is a kisdedóvó szintjén művelem a programozást, nem beszélve a C-ről -- és most alkalmam volt rácsodálkozni, hogy egy-két fifikás aprósággal mennyivel tömörebben meg lehet írni, mint ahogyan én tettem volna. Ettől függetlenül nem vagyok benne biztos, hogy éppen ezen keresztül a leghasznosabb megismerkedned az alapokkal. Bár ez még aligha a programozás magasiskolája, de legalábbis valamilyen szinten trükkös, és túllép a kezdő szinten nyomban átlátható logikán. Amit eddig megláttál belőle, az egyrészt triviális („a memset 0-ra írja az összes 256 helyet”, pontosabban: egy általad még fel nem ismert feladatú karaktertömböt 0 értékekkel inicializál), másrészt nem igaz (nem számolja össze a nullákat). Maga a program által végzett tevékenység a jelek szerint egyelőre vakfoltra esik, még odáig se jutott a dolog, hogy megfogalmazható problémába akadj bele. Javaslom, hogy előbb próbáld megírni a saját elképzelésed alapján, akkor egyszerűbb lesz értelmezni, hogy ahhoz képest mit csinál a fenti program.
2018. dec. 17. 00:52
Hasznos számodra ez a válasz?
 4/8 anonim ***** válasza:

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.

2018. dec. 17. 11:25
Hasznos számodra ez a válasz?
 5/8 tabaki ***** válasza:

@#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.

2018. dec. 17. 12:01
Hasznos számodra ez a válasz?
 6/8 anonim ***** válasza:

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.

2018. dec. 17. 14:09
Hasznos számodra ez a válasz?
 7/8 tabaki ***** válasza:

@#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.

2018. dec. 17. 19:10
Hasznos számodra ez a válasz?
 8/8 tabaki ***** válasza:
Kész, ennyi volt a kérdés? Most már minden világos?
2018. dec. 21. 00:20
Hasznos számodra ez a válasz?

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!