Program naskrobałem w liceum, będąc jeszcze pięknym i młodym.
Napisany w Delphi, potrafi konwertować z i na systemy liczbowe od base2 do base16 włącznie.
Program jest ułomny (nie sprawdza poprawności podanych danych i wykrzacza się w takim wypadku) i brzydki, ale działa
Konwerter.exe
Grzebiąc po starych płytach, udało mi się znaleźć źródełka. Wyciąłem tylko najsmakowitsze kąski (dobre 60% kodu to tylko wymagane przez Delphi pierdoły)
Gwoli wyjaśnienia - program 'oszukuje', prezeliczając najpierw naszą liczbę podaną w dowolnym systemie na dziesiętny, a dopiero potem z dziesiętnego na docelowy:
Funkcja przeliczająca z baseX do base10:
[spoiler]
[/spoiler]
i druga fuinkcja, przeliczająca z base10 do baseY:
[spoiler]
[/spoiler]
Następnie wszystko ładnie wrapujemy w kolejną funkcję:
i wywołujemy, na przykład konwertując z trójkowego na dwunastkowy:
Napisany w Delphi, potrafi konwertować z i na systemy liczbowe od base2 do base16 włącznie.
Program jest ułomny (nie sprawdza poprawności podanych danych i wykrzacza się w takim wypadku) i brzydki, ale działa
Konwerter.exe
Grzebiąc po starych płytach, udało mi się znaleźć źródełka. Wyciąłem tylko najsmakowitsze kąski (dobre 60% kodu to tylko wymagane przez Delphi pierdoły)
Gwoli wyjaśnienia - program 'oszukuje', prezeliczając najpierw naszą liczbę podaną w dowolnym systemie na dziesiętny, a dopiero potem z dziesiętnego na docelowy:
Funkcja przeliczająca z baseX do base10:
[spoiler]
Code:
function XXX_na_DEC(value: String; system: Integer): String;
var i, suma, dlug: Integer;
{============================================}
function Zamien(znak: Char): Integer;
begin
if znak in ['a', 'A'] then Result := 10
else if znak in ['b', 'B'] then Result := 11
else if znak in ['c', 'C'] then Result := 12
else if znak in ['d', 'D'] then Result := 13
else if znak in ['e', 'E'] then Result := 14
else if znak in ['f', 'F'] then Result := 15
else Result := StrToInt(znak);
end;
{============================================}
begin
if value = '' then
begin
Result := '';
Exit;
end;
suma := 0;
dlug := Length(value) - 1;
for i := 0 to dlug do
suma := suma +
Zamien(value[i + 1]) * Round(IntPower(system, (dlug - i)));
Result := IntToStr(suma);
end;
i druga fuinkcja, przeliczająca z base10 do baseY:
[spoiler]
Code:
function DEC_na_XXX(value: String; system: Integer): String;
var liczba: Integer;
{=======================================}
function Zamien(licz: Integer): String;
begin
case licz of
10: Result := 'A';
11: Result := 'B';
12: Result := 'C';
13: Result := 'D';
14: Result := 'E';
15: Result := 'F';
else Result := IntToStr(licz);
end;
end;
{=======================================}
begin
if value = '' then
begin
Result := '';
Exit;
end;
Result := '';
liczba := StrToInt(value);
Repeat
Result := Zamien(liczba mod system) + Result;
liczba := liczba div system;
until liczba = 0;
end;
Następnie wszystko ładnie wrapujemy w kolejną funkcję:
Code:
function XXX_na_YYY(value: String; z_xxx, na_yyy: Integer): String;
begin
Result := DEC_na_XXX(XXX_na_DEC(value, z_xxx), na_yyy);
end;
Code:
Edit2.Text := XXX_na_YYY(Edit1.Text, 3, 12);
The #Starchasers designated translator.