Ocena użytkownikóww: ***** / 3
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 delphi/systemy.dpr:
//
// Konwersja z i na system dziesietny
//
// www.algorytm.org
// (c)2006 by Tomasz Lubinski
//
program systemy;
{$APPTYPE CONSOLE}
uses
SysUtils;
const MAX_BASE: Integer = 36;
const pattern: String = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
//returns converted n or '' if an error occurs
function convertTo(n: Integer; base: Integer): String;
begin
result := '';
//base is too big or too small
if (base > MAX_BASE) or (base < 2) then exit;
//n is equal to 0, do not process, return "0"
if n = 0 then
begin
result := '0';
exit;
end;
//process until n > 0
while (n>0) do
begin
result := pattern[(n mod base) + 1] + result;
n := n div base;
end;
end;
//return value of x or -1 if an error occurs
function valueOf(x: Char; base: Integer): Integer;
var
i: Integer;
begin
result := -1;
for i:=1 to base do
begin
if x = pattern[i] then
begin
result := i - 1;
break;
end;
end;
end;
//returns converted n or 0 if an error occurs
function convertFrom(n: String; base: Integer): Integer;
var
i, x, p: Integer;
begin
p := 1;
result := 0;
//base is too big or to small
if (base > MAX_BASE) or (base < 2) then exit;
n := UpperCase(n);
for i:=length(n) downto 1 do
begin
x := valueOf(n[i], base);
if x < 0 then
begin
result := 0;
exit;
end;
result := result + (x * p);
p := p * base;
end;
end;
begin
writeln('3568 w systemie dwojkowym = ' + convertTo(3568, 2));
writeln('3568 w systemie trojkowym = ' + convertTo(3568, 3));
writeln('3568 w systemie osemkowym = ' + convertTo(3568, 8));
writeln('3568 w systemie szesnastkowym = ' + convertTo(3568, 16));
writeln('3568 w systemie dwudziestkowym = ' + convertTo(3568, 20));
writeln('100010010 w systemie dwojkowym to ' + IntToStr(convertFrom('100010010', 2)) + ' w systemie dziesietnym');
writeln('7542 w systemie osemkowym to ' + IntToStr(convertFrom('7542', 8)) + ' w systemie dziesietnym');
writeln('E854 w systemie szesnastkowym to ' + IntToStr(convertFrom('E854', 16)) + ' w systemie dziesietnym');
readln;
end.