Kezdőoldal » Számítástechnika » Programozás » Mi a baj a SzámjegyekÖsszege...

Mi a baj a SzámjegyekÖsszege függvényemmel?

Figyelt kérdés

static int SzámjegyekÖsszege(int szám)

{

string számString = Convert.ToString(szám);

int összeg = 0;

for (int i = 0; i < számString.Length; i++)

összeg += Convert.ToInt32(számString[i]);

return összeg;

}

Valamiért hülyeségeket ír ki, pl 99-re 114, 0-ra 48...

Nem értem, elvileg jónak kellene lennie, mi a baja?



2015. nov. 21. 22:52
 1/8 anonim válasza:

A karakterek ASCII kódját adod össze.


Convert.ToInt32('9') == 57


Ezért adja a "99"-re a 2*57 = 114-et.


Ha előbb a karaktert stringgé konvertálod, jó lesz:


Convert.ToInt32(számString[i].ToString());


Illetve még pár jótanács:


- ne írj ékezeteket, se magyar nyelvű változóneveket a kódba, szörnyen néz ki. :)


- a típusokat ebben az esetben nem kötelező kiírni, a fordító képes kikövetkeztetni a változók típusát:


var számString = Convert.ToString(szám);

var összeg = 0;


- egy elegánsabb egysoros megoldás:


static int SzámjegyekÖsszege(int szám)

{

return szám.ToString().ToCharArray().Aggregate(0, (acc, a) => acc + Convert.ToInt32(a.ToString()));

}

2015. nov. 21. 23:35
Hasznos számodra ez a válasz?
 2/8 anonim válasza:

Egy még egyszerűbb :)


static readonly int asciiCodeOfZero = Convert.ToInt32('0');

static int SzámjegyekÖsszege(int szám)

{

return szám.ToString().ToCharArray().Aggregate(0, (acc, a) => acc + a - asciiCodeOfZero);

}

2015. nov. 21. 23:39
Hasznos számodra ez a válasz?
 3/8 anonim ***** válasza:

A számString[i] egy Char típusú érték (gyakorlatilag egy ascii kód ami egy szám), a Convert.ToInt32 String-et vár. Vagy alakítsd String-gé, vagy használj olyat ami Char-ral működik:


int szám = (int)Char.GetNumericValue(számString[i]);


Még egyszerűbb ha kivonod a '0' karaktert belőle, a különbség meg pont a számod lesz:


int szám = (int)(számString[i] - '0');

2015. nov. 22. 00:47
Hasznos számodra ez a válasz?
 4/8 A kérdező kommentje:

Köszi a segítségeket! :)

Mivel a többi dolgot nagyon nem értettem (az egysoros megoldást) így maradok annál hogy stringgé konvertálom, illetve találtam még tegnap egy még ugyanilyen egyszerűt (és azt értem is :D) : do {összeg+=szám%10} while ((szám/=10)>0);

2015. nov. 22. 09:27
 5/8 anonim válasza:

Ez az osztós is jó, egyszerű. :)

Az egysoros megoldás magyarázata:


szám.ToString().ToCharArray()


Eddig oké, karaktertömböt csinálsz a stringből.


A karaktertömbön meghívod az Aggregate függvényt:


.Aggregate(0, ...);


Ez vár egy kezdőértéket (ami most a nulla) és egy függvénydelegate-et.


A függvénydelegate-nek a következőt adtuk meg:


(acc, a) => acc + Convert.ToInt32(a.ToString())


Tehát ez egy kétparaméteres függvény(delegate), ami vesz egy számot (acc) és egy karaktert (a) és visszaadja a kettő "összegét".


Például: acc=9 és a='9'-re 18-at ad vissza.


Az Aggregate végigmegy a tömbön, és a kezdőértékkel (ami a nulla volt) elkezdi lefuttatni a függvénydelegate-et minden elemre, úgy, hogy a függvénydelegate által visszaadott érték lesz a következő hívás bemenő acc paramétere.


Magyarul az "acc" változó egy "akkumulátor", abba "gyűjti" az összeget.


Az Aggregate a végén a karaktertömb utolsó elemére is végrehajtja a megadott delegate-et, majd az így visszaadott érték lesz az Aggregate visszatérési értéke.


Az Aggregate arra jó, hogy "elrejtsd" a ciklust, és elég arra koncentrálnod, hogy milyen műveletet kell elvégezni az adott elemen. A ciklus megírásával nem kell bíbelődnöd.

2015. nov. 22. 16:13
Hasznos számodra ez a válasz?
 6/8 A kérdező kommentje:

háát, még így se 100% de már a nagyját értem :D

az én szintemhez ez még picit magas xD

2015. nov. 22. 17:10
 7/8 anonim válasza:

Az az előnye még ebben a példában, hogy így egy tetszőleges más függvénydelegate-et is beadhatsz az Aggregate-nek.


Ha egy szorzófüggvényt kap paraméterként, akkor összeszorozza a számjegyeket, stb. Az egy elemre elvégzendő műveletet és magát a ciklust így elválasztottad egymástól.

2015. nov. 22. 17:15
Hasznos számodra ez a válasz?
 8/8 A kérdező kommentje:
Majd akkor részletesebben megnézem ezeket a függvényeket és elsajátítom :)
2015. nov. 22. 17:22

További 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!