Ahoj, chtěl bych se zeptat, mohl by mi někdo prosím poradit s programem, který převádí čísla z obecné na desítkovou soustavu a naopak? Nejde mi o celý kód, spíše jenom o zápis samotného převodu (jelikož moc netuším co to je obecná soustava) používat můžu jenom příkazy DIV a MOD, pak WHILE, DO atd.
Případně díky moc za pomoc.
Fórum › Pascal
Převod mezi soutavami
To lotrman :
Urcite vis jak funguje 10kova- 5641 je 5*10E3+6*10E2+4*10E1+1*10E0 a podobne funguje i obecna- odzadu se zvetsuji mocniny obecneho cisla a ty se nasobi hodnotou v danem miste. tzn 421 v 5kove je 4*5E3+2*5E2+1*5E0. Tak pri prevodu z n do desitkove staci jit odzadu a pokazde znak vynasobit n(to je zakladni cislo te soustavy, prvni bude 1 protoze nE0 je 1), n vynasobit n (posunujes se na dalsi mocninu), pricist si to k vyslednemu cislu a toto delat tolikrat kolik ma vstup znaku(ve strungu je na 0 miste pocet znaku).tak dostanes cislo v 10kove.
Prevod z 10kove do n je mnohem slozitejsi na pochopeni- musis jit odzadu a sbirat zbytky po deleni(=MOD) nkem, ty pridavat na konec vystupu(ten ted musi byt string), a vstup delit nkem (toto je docela slozite na pochopeni) dokud neni vstup 0.
Postup co sem napsal funguje jenom pro obecne soustavy do 9, pro vetsi si musis udelat array znaku (protoze 5*D nejde) a s tema pocitat.
Tady je cast kodu prevodu z 10 do n, hlavne cast mezi repat a until. Nesnaz se to jenom skopirovat, protoze by ti to stejne neslo, je to psane v delphi,ale pro pochopeni zakladu to staci.
{doceho, x a vstup jsou celociselne, vystup1 je string}
doceho:=StrToInt(Edit3.Text);
vstup:=StrToInt(Edit1.Text);
vystup1:='';
repeat
x:=vstup mod doceho;
vystup1:=Inttostr(x)+vystup1;
vstup:=vstup div doceho;
until (vstup=0);
Edit2.Text:=vystup1;
krychlik obavam se ze to asi z takoveho popisu nepochopi :)
dulezity casti sou tam: jsou to pozicni soustavy - kazda pozice v cisle ma svoji urcitou vahu... v desitkove jsou pred desetinou carkou: jednotky, desitky, stovky......... tato vaha pozice se pak nasobi cislici ...
a tak dale....
Ok takže např. číslo 123 bude v desítkové: 1x100 + 2x10 + 3x1 ? A ve dvojkove bude
123:2=61 ---- 1
61:2=30 ----- 1
30:2=15 ----- 0 ----- \
15:2=7 ------ 1 ----- / 110111 ?
7:2 = 3 ------ 1
3:2 = 1 ------ 1
S tím, že když se budu chtět dostat na tu desítkovou tak dám (123 mod 2 * 100) - jak to udělat, aby program rozpoznal kolik má to číslo prvků? Když na dvojkovou tak dám (123 div 2 ..... a zbytek po tom děleni zapišu jak?)
Doufám že nejsem uplně vedle.
Zbytek po dělení získáš operátorem mod. "Zbytek po vydělení čísla A číslem B" se zapíše jako "A mod B".
Ten převod na dvojkovou soustavu máš skoro dobře, jenom zrcadlově obrácený.
Příklad se čtyřkou:
4 div 2 = 2, 4 mod 2 = 0 (4/2=2 a zbytek 0).
2 div 2 = 1, 2 mod 2 = 0
1 div 2 = 0, 1 mod 2 = 1
Výsledek je 100 dvojkově.
Převod čísla do obecné soustavy vypadá takhle:
* výsledek:=prázdný řetězec
* cyklus (opakuj tak dlouho, dokud číslo není 0):
- cifra:=číslo mod základ
- cifru zleva připiš k výsledku
- číslo:=číslo div základ
A to je celé.
Obráceně:
Postupuj zprava, tedy od nejnižších cifer. Algoritmus by mohl vypadat nějak takhle:
* výsledek:=0
* součinitel:=1
* cyklus (opakuj tak dlouho, dokud vstupní řetězec není prázdný):
- ze vstupního řetězce přečti znak nejvíc vpravo
- ten znak z něj umaž
- zjisti si, jakou ten znak má číselnou hodnotu (např. pro šestnáctkovou soustavu 9 = 9, A = 10 atd.)
- k výsledku přičti součin součinitele a hodnoty znaku
- součinitel vynásob základem soustavy
Toť vše.
Moje stránka.
Omlouvam se za mirnou zmatecnost prvniho vysvetleni.
To KIIV : Ano, cislo 123 v desitkove je skutecne 123, proto do desitkove nemusis z desitkove prevadet. A jak poznas kolikrat pri prevodu z obecne do 10- bud jak napsal Mircosoft umazavat, nebo jeste jednodusej- kdyz je vstup string tak vstup[0] je pocet znaku- to si uloz do promene a pak cyklus s "for...... downto 1" budes nacitat odkonce az po 1 coz je prvni znak vstupu.
To Krychlik : no ja vetsinou delal v C retezec o nejakej vhodne delce... na posledni pozici sem hodil 0 aby me to poznalo konec a pak sem odzadu zapisoval znaky pomoci ukazatele...
ale da se to udelat i jak si rikal... do retezce normalne a vypsat si ho po znacich pospatku.. u pascalu je u string ta delka pekne ulozena :D
norton neni nic jednodussiho nez prochazet ten retezec
hodnota = 0;
zaklad = 2;
v cyklu:
hznak = znak - '0'; // ale bude fungovat jen do 10tkove soustavy...
//pro vyssi je potreba osefovat i pismena
hodnota = hodnota * zaklad + hznak;
jen je to v C...
jen takovej test: retezec '11010'
1. znak = '1' hznak = 1 hodnota = 0*2 + 1 => 1
2. znak = '1' hznak = 1 hodnota = 1*2 + 1 => 3
3. znak = '0' hznak = 0 hodnota = 3*2 + 0 => 6
4. znak = '1' hznak = 1 hodnota = 6*2 + 1 => 13
5. znak = '0' hznak = 0 hodnota = 13*2 + 0 => 26
Pro převod z desítkové do libovolné soustavy:
A je původní číslo v desítkové soustavě, B je číslo v soustavě SOUSTAVA
načti A
B := 0
dokud A > 0 opakuj {
na začátek čísla B přidej číslici s hodnotou (A mod SOUSTAVA)
A := A div SOUSTAVA
}
Pro převod z libovolné do desítkové soustavy:
A je číslo v soustavě SOUSTAVA, B je výsledek v desítkové soustavě
načti A
B := 0
opakuj pro I := 1 do I = počet číslic A {
B := B + (hodnota číslice z A na I-té pozici zprava) * SOUSTAVA ^ (I - 1)
}
V kódu nejsou přímo příkazy, ale lze je už snadno doplnit, záleží na programovacím jazyku a také na tom, jak jsou uložena čísla v jiných soustavách (seznam, pole, řetězec, textový soubor...)
Podobně je možné převést číslo z libovolné soustavy do libovolné, pokud si jako mezisoustavu zvolíte desítkovou.
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 soustavami — založil edor
Převod mezi jednotkama — založil hajnis
Převod mezi číselnými soustavami — založil Alex
Převod mezi číselnými soustavami — založil Hnusný_Slimák
Výstup v programu pro převod mezi soustavami — založil Mordor
Moderátoři diskuze