Keresés


Toplista

Toplista
  • betöltés...

Magántanár kereső

Ha szívesen korrepetálnál, hozd létre magántanár profilodat itt.
Ha diák vagy és korrepetálásra van szükséged, akkor regisztrálj be és írd meg itt, hogy milyen tantárgyban!

Hexa atvaltasa c nyelven (beerkezo adatok rögtön feldolgozasa-->tömb nelkul)

229
Valaki help pls.
A feladatot c nyelven kell megoldani:
Írj programot, mely a bemeneten érkező hexadecimális számot tízes számrendszerben írja ki a képernyőre! A beérkező karaktereket egyesével dolgozhatja csak fel a program, kivételesen nem elfogadható megoldás, ha a scanf függvény az egész számot egyben beolvassa! (Ennek megkísérlése furcsa, megmagyarázhatatlan hibákat eredményez a tesztelés során.) A korábban megírt hexa_value függvényt érdemes használni a megoldásban.

Például: F81 -> 3969

Segítség: A szám hosszát nem ismerjük előre, így egy adott karakter beérkezésekor nem tudjuk azt a tizenhat megfelelő hatványával szorozni. Ehelyett vegyük észre, hogy mi a kapcsolat egy n és egy n+1 számjegyből álló tizenhatos számrendszerbeli szám között, ha utóbbi első n számjegye megegyezik az előbbi számmal!

Segítség 2: Ne használj tömböt, a bemenet tetszőlegesen hosszú lehet. Az előző segítségben leírtak alapján rögtön dolgozd fel a beérkező számjegyeket!

tehat tömb nelkül kene, tömbbel nem fogadta el nekem a test :/ ( gondolom a memoriaszemet miatt)...
Jelenleg 1 felhasználó nézi ezt a kérdést.
számrendszer, programmozás, c-nyelv
0
Felsőoktatás / Informatika

Válaszok

2
A kérdésből gondolva az elméleti részével van gondod.
Ha megérted, hogy mire gondol az első segítség, akkor meg van, hogy hogy kell megoldani. Az a lényeg, hogy a helyiértékek közt úgy lehet csúsztatni a számot, hogy a számrendszer értékével megszorzod. 10-es számrendszerben is akkor lesz a `11`-ből `110`, ha megszorzod a `11`-et `10`-zel.
Mondok egy 16-os számrendszerbeli példát.
Vegyük 16-os számrendszerben a `128_16`-at (`1*16^2+2*16+8=296`), ez 10-es számrendszerben `298`.
Amikor karakterenként olvasod be, akkor nem tudhatod, hogy lesz-e következő karakter, így amikor beolvasod először az `1`-est, akkor az egyes helyiértéken álló számnak veszed. Majd beolvasod a `2`-est. Ekkor már tudod, hogy az `1`-es az legalább 16-os helyiértéken van, ezért megszorzod `16`-tal, és ehhez a számhoz hozzáadod a `2`-t (`1*16+2=18`).
Majd beolvasod a következő számot, ami a `8`. Az előző lépéshez hasonlóan megint csúsztatni kell a helyiértékeken. Vagyis a tárolt számot megszorozzuk `16`-tal, `18*16=(1*16+2)*16=1*16^2+2*16=288` (egy kicsit átrendeztem, hogy jobban lásd mi történik). Ehhez pedig hozzáadjuk a `8`-at, ami az utolsó beolvasott szám, így kapjuk a `296`-t (`1*16^2+2*16+8`).
0

Istenem....
Szerinted a példámban, hogy jött ki a végeredmény?
Hogyan lehetséges, hogy az 1-est, amit `16^2`-nal kell megszorozni azt annyival szoroztam, és minden mást a neki megfelelő kitevőjű számmal? Úgy, hogy amit írtam az jó.

Mégegyszer, van a `128`, és van EGY darab változód, amiben az összeget tárolod (kezdetben ez nulla).
Amit meg kell valósítanod az annyi, hogy új szám beolvasásakor megszorzod az összeget 16-tal, és hozzáadod a beolvasott számot.
Vagyis, az összeget megszorzod 16-tal, ami még mindig nulla és az első beolvasott számot hozzáadod, az 1.
Majd megszorzod 16-tal, és hozzáadsz 2-t. Ez összesen 18.
Majd ezt megint megszorzod 16-tal, ami 288, és hozzáadsz 8-at, ami érdekes módon 298.

Ezt azért nem látod át, mert nem olyan átlátható a 16-os számrendszer mint a tízes, de a kedvedért ezt is leírom.
Szeretnénk karakterenként beolvasni a `128`-at. Mivel itt a számrendszer 10-es, ezért csak 10-zel szorzunk.
Beolvassunk az 1-est, ekkor az összeg 1.
Beolvassok a 2-est, akkor szorozzuk az összeget, ami így 10 lesz és hozzáadjuk a 2-est, ami 12.
Majd beolvassuk a 8-ast, ekkor az összeg 10-zal való szorzás után 120 lesz és hozzáadod a 8-at, ami 128.

A helyiértékeken való tolás megfelelője a számrendszerrel való szorzás.
0