Vyrobíme si pythonovský program na převádění mezi číselnými soustavami.
Převody soustav je častý dotaz na fóru, tak jsem se rozhodl napsat na toto téma článek. Jako takový úvod by vám mohl posloužit tento článek. Já se budu zabývat pouze programovým řešením celého problému.
Program se bude skládat ze dvou částí:
- Převést číslo do desítkové soustavy
- Převést číslo z desítkové do zadané soustavy
Převádění čísla do desítkové soustavy
Tato část je výrazně jednodušší než druhá. Celá se dá vyřešit jedním příkazem, a to int(x, soustava)
. Tento příkaz vám převede jakékoliv číslo ze zadané soustavy do soustavy desítkové:
>>> int("10",10)#10 v desítkové soustavě je 10
10
>>> int("10",16)#10 v hexadecimální soustavě je 16
16
>>> int("10",2)#10 v binární soustavě je 2
2
Převádění číslo do zadané soustavy
Tato část je o trochu složitější než ta první. Postup převádění je popsaný v článku, na který jsem odkazoval ze začátku.
cislo=10#budeme převádět číslo 10 z desítkové soustavy do dvojkové
soustava=2#označuje dvojkovou soustavu
seznam=[]
while cislo > 0:
seznam.insert(0,cislo%soustava)#na první pozici vlož zbytek po celočíselném dělení
cislo=cislo/soustava
print seznam
Výstup z toho programu bude [1, 0, 1, 0]
, což už je konečný výsledek. Problém by ale mohl nastat, pokud bychom převáděli do soustav vyšších než desítková (např. hexadecimální). Vyzkoušejte dosadit v našem programu za proměnnou cislo hodnotu 30 a za proměnnou soustava hodnotu 16. Výstup v tomto případě bude [1, 14]
. To ovšem není správně, protože 14 v hexadecimální soustavě je E
, proto musíme kód trochu upravit.
cislo=30#budeme převádět číslo 10 z desítkové soustavy do dvojkové
soustava=16#označuje dvojkovou soustavu
seznam=[]
while cislo > 0:
seznam.insert(0,cislo%soustava)#na první pozici vlož zbytek po celočíselném dělení
cislo=cislo/soustava
slovnik={10:"A",11:"B",12:"C",13:"D",14:"E",15:"F",16:"G"}
for x in range(len(seznam)):
if slovnik.has_key(seznam[x]):#pokud je číslo ve slovníku, tak ho nahraď
seznam[x]=slovnik[seznam[x]]
else:#pokud není, udělej z hodnoty seznam[x] řetězec
seznam[x]=str(seznam[x])
print seznam
Nyní je již výstup ['1', 'E']
, což je konečně správně. Abychom mohli s programem lépe pracovat, měli bychom vytvořit funkci preved(cislo, odkud, soustava)
. Tato funkce by také neměla vracet seznam, ale řetězec.
# -*- coding: cp1250 -*-
def preved(cislo, odkud, soustava):
cislo=int(cislo,odkud)#převeď číslo do desítkové soustavy
seznam=[]
while cislo > 0:
seznam.insert(0,cislo%soustava)#pa první pozici vlož zbytek po celočíselném dělení
cislo=cislo/soustava
slovnik={10:"A",11:"B",12:"C",13:"D",14:"E",15:"F",16:"G"}
for x in range(len(seznam)):
if slovnik.has_key(seznam[x]):#pokud je číslo ve slovníku, tak ho nahraď
seznam[x]=slovnik[seznam[x]]
else:#pokud není, udělej z hodnoty seznam[x] řetězec
seznam[x]=str(seznam[x])
return "".join(seznam)#udělej ze seznamu řetězec
if __name__ == "__main__":
print preved("30",10,16)#převeď číslo 30 z desítkové do hexadecimální soustavy
Tím je náš program hotov. Snad poslední věcí, která by se dala udělat, je kontrola uživatelského vstupu (zda zadal číslo apod.), ale to již nechám na vás.