Nadesłany przez Tomasz Lubiński, 23 listopada 2006 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
Systemy.adb:
-- -- Konwersja z i na system dziesietny -- -- www.algorytm.org -- (c)2006 by Tomasz Lubinski -- with Text_IO; use Text_IO; with GNAT.Case_Util; use GNAT.Case_Util; procedure Systemy is MAX_BASE: Integer := 36; pattern: String := "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; -- returns converted n or "" if an error occurs function convertTo(n: Integer; base: Integer) return String is result : String (1..100); curr : Integer := 100; number : Integer := n; begin -- base is too big or too small if base > MAX_BASE or else base < 2 then return ""; end if; -- n is equal to 0, do not process, return "0" if n = 0 then return "0"; end if; -- process until number > 0 while (number>0) loop result(curr) := pattern((number mod base) + 1); curr := curr - 1; number := number / base; end loop; return result(curr+1 .. 100); end; -- return value of x or -1 if an error occurs function valueOf(x: Character; base: Integer) return Integer is begin for i in 1..base loop if x = pattern(i) then return (i - 1); end if; end loop; return -1; end; -- returns converted n or 0 if an error occurs function convertFrom(n: String; base: Integer) return Integer is x: Integer; p: Integer := 1; result: Integer := 0; number: String := n; begin -- base is too big or too small if base > MAX_BASE or else base < 2 then return 0; end if; To_Upper(number); for i in reverse number'First .. number'Last loop x := valueOf(number(i), base); if x < 0 then return 0; end if; result := result + (x * p); p := p * base; end loop; return result; end; begin Put_Line("3568 w systemie dwojkowym = " & convertTo(3568, 2)); Put_Line("3568 w systemie trojkowym = " & convertTo(3568, 3)); Put_Line("3568 w systemie osemkowym = " & convertTo(3568, 8)); Put_Line("3568 w systemie szesnastkowym = " & convertTo(3568, 16)); Put_Line("3568 w systemie dwudziestkowym = " & convertTo(3568, 20)); Put_Line("100010010 w systemie dwojkowym to " & Integer'Image(convertFrom("100010010", 2)) & " w systemie dziesietnym"); Put_Line("7542 w systemie ósemkowym to " & Integer'Image(convertFrom("7542", 8)) & " w systemie dziesietnym"); Put_Line("E854 w systemie szesnastkowym to " & Integer'Image(convertFrom("E854", 16)) & " w systemie dziesietnym"); end;