Goldspeak Community

Full Version: Konwerter systemów n-liczbowych.
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
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 Duży uśmiech
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;
[/spoiler]
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;
[/spoiler]
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;
i wywołujemy, na przykład konwertując z trójkowego na dwunastkowy:
Code:
Edit2.Text := XXX_na_YYY(Edit1.Text, 3, 12);