Mi a baj a SzámjegyekÖsszege függvényemmel?
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?
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()));
}
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);
}
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');
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);
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.
háát, még így se 100% de már a nagyját értem :D
az én szintemhez ez még picit magas xD
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.
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
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!