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;

