řeším následující problém.. Dejme tomu že chci převést číslo z desítkové soustavy do šestnáctkové, ale nechci použít klasicky výpis %x, jde to udělat i nějak jinak, jde nějak udat to, že pokud budu mít výsledek 10, tak se mi vypíše Ačko?? Chci se dostat k tomu, že si nakonec vytvořím vlastní číslenou soustavu.. diky za rady..
Fórum › C / C++
Převody mezi číselnými soustavami - vlastni implemetace
To cp.Hook : Asi před půl rokem jsem si psal program na převod mezi soustavami (Dec, Bin, Hex). Dělal jsem to tak, jako kdybych to "počítal" ručně. Třeba při převodu z Dekadické do Hexa Jsem dělil (celočísleně) 16^váhu. A výsledek poté zapsal (10 - 15 bylo nahrazeno A - F)... Pokud nevíš jak na to, zde je to srozumitelně vysvětleno http://programujte.com/index.php?akce=clanek&cl=2007102802-ciselne-soustavy
To KIIV : no ja to nejak porad nechapu... dam sem presne priklad ze vstupu (pomoci getchar) nactu znak A... z toho chci aby mi program pocital s hodnotou 10, ke ktere pak napr prictu cislo 5, tedy budu mit vysledek 15 a chci aby se mi na vystup (putchar) vytisklo F... stim switchem by to slo, ale pokud chci mit soustavu, kde je vetsi mnozstvi clenu, tak me to prijde hodne neprehledne, existuje nejake elegantnejsi reseni, popripade jak to myslis stim polem, nejak mi to furt nedochazi.. zkus mi to ukazat na tom mem prikladu, dik moc....
To cp.Hook : KIIV to myslel tak, že i. prvek reprezentuje číslo i
char prevod[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
i = 10;
cout << prevod[i]; // vypíše A
Aspoň tak jsem to tedy pochopil já :)
char prevod[] = "0123456789ABCDEFGH"; //.....
char out[200]; // vystupni buffer.. pri postupnem deleni nam vychazi cislo odzadu takze ho budem zapisovat do retezce
// tez odzadu
int cislo = 12424; // prevadene cislo (predpokladejme desitkove)
int zaklad = 16; // zaklad soustavy do ktere budeme prevadet
char * pos = out+199; // nahodime ukazatel na konec retezce
// EDIT: sem tam misto ukoncujiciho znaku \0 hodil ftipne \n :DD
*pos = '\0'; // na konec retezce taky hodime ukoncujici znak.. nechceme prece vypisovat pamet za nim
while ( cislo > 0 ) {
pos--; // posuneme se o jednu dopredu od konce retezce
*pos = prevod[ cislo % zaklad ]; // zbytek po deleni prelozime ... prevod[10] == 'A' atp.
cislo /= zaklad; // taky nechceme nekonecnou smycku... nedelalo by to dobre ani pameti pred promennou pos :D
}
printf("%s", pos);
To Bald3rr : jj super, nejak tak jsem to myslel, ale to mi stale resi jen polovinu problemu.. tedy vysledne cislo mi to prevede na pozadovany znak, ale jak docilim toho ze kdyz zadam napr znak A, tak budu pracovat s hodnotou 10.. nevim mozna to z toho nejak vypliva, ale ja jsem nejaky natvrdly...btw. 2KIIV: v tom kodu jsem se nejak ztratil...
To KIIV : no nejak s temi ukazateli, ktere davas na konec retezce atd.. taky prevadis tim kodem pouze cislo, jestli jsem to dobre pochopil...ale stejnak nevim jestli to ted momentalne vyresi muj problem, ktery uz vspociva jen vtom, abych konkretnimu znaku po nacteni ze vstupu udelil konkretni ciselnou hodnotu... pokud mozno co nejelegantnejsim zpusobem.. taky me napadlo nejak spolupracovat s ASCII tabulkou, ale nevim jestli je to prave orechove...
no tady to je z desitkovy do libovolny ...
pokud chces obracene tak budes muset udelat tabulku nejak takto:
unsigned char prevod[256] = {0};
prevod['0'] = 0;
prevod['1'] = 1;
...
prevod['F'] = 15;
...
pak jen blabla = prevod[(unsigned char) getchar()] ;
no leda jeste
if ( x < 10 ) {
out = x + '0';
} else {
out = x + 'A';
}
a naopak neco jako:
if ( x <= '9' ) {
out = x-'0';
} else {
out = x-'A'+10;
}
ale chce to poradne osetrit jeste ten vstup
To KIIV : no... me napaslo jeste jedno reseni, jak uz jsem tu nekde psal, pomoci ASCII tabulky... tedy reseni problemu znaku zadat urcitou cislenou hodnotu.. uvazujme ze na vstup budou povoleny jen velke znaky a cisla... takze napr. A je v ASCII tabulce cislo 65 (dekadicky) a ja chci aby cislo A melo hodnotu 10... takze bych napsal neco takoveho...
int znak;
znak = getchar();
znak = znak - 55;
a tim bych docili toho ze promenna znak bude mit hodnotu 10, se kterou pak muzu dal pracovat..nebo je to blbost?? jelikoz jsem v C zatim amater, tak je vice nez pravdepodobne ze tohle reseni je kravina:)
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Převod mezi číselnými soustavami — založil Hnusný_Slimák
Převod mezi číselnými soustavami — založil Alex
Chyba v kódu při převodu mezi číselnými soustavami — založil avalagne
Prevody mezdi číselnými sústavami — založil Kéfas
Převod mezi soustavami — založil edor
Moderátoři diskuze