algorytm.org

Implementacja w Ada

Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Zamiana z i na system dziesiętny - Implementacja w Ada
Ocena użytkownikóww: *****  / 4
SłabyŚwietny
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;
Dodaj komentarz