Zamiana liczby z systemu addywnego na system arabski

Dryobates

Prosta funcja konwertująca z systemu rzymskiego na arabski może wyglądać np. tak:

function RzNaAr(Liczba: string): Word; 
const 
  I = 1; 
  V = 5; 
  X = 10; 
  L = 50; 
  C = 100; 
  D = 500; 
  M = 1000; 
var 
  Najw, j, Cyfra, Suma: Word; 
begin 
  Suma := 0; 
  Najw := 0; 
  for j := Length(Liczba) downto 1 do 
  begin 
    case UpCase(Liczba[j]) of 
      'I': Cyfra := I; 
      'V': Cyfra := V; 
      'X': Cyfra := X; 
      'L': Cyfra := L; 
      'C': Cyfra := C; 
      'D': Cyfra := D; 
      'M': Cyfra := M; 
    end; 
    if Cyfra >= Najw then 
    begin 
      Najw := Cyfra; 
      Suma := Suma + Najw; 
    end 
    else 
      Suma := Suma - Cyfra; 
    end; 
  Result := Suma; 
end; 

Można ją troszkę przerobić, żeby była wygodniejsza w modyfikacji dla każdego systemu addywnego.

function AddNaAr(Liczba: string): Word;
type TCyfra = record
  Sym{bol}: Char;
  Wart{osc}: Word;
  end;
const
  Tab: array [0..6] of TCyfra = (
    (Sym:'I'; Wart: 1),
    (Sym:'V'; Wart: 5),
    (Sym:'X'; Wart: 10),
    (Sym:'L'; Wart: 50),
    (Sym:'C'; Wart: 100),
    (Sym:'D'; Wart: 500),
    (Sym:'M'; Wart: 1000)
    );
var
  Najw, i, j, Cyfra, Suma: Word;
begin
  Suma := 0;
  Najw := 0;
  for j := Length(Liczba) downto 1 do
  begin
    i := 0;
    while Tab[i].Sym <> UpCase(Liczba[j]) do
      Inc(i);
    Cyfra := Tab[i].Wart;
    if Cyfra >= Najw then
    begin
      Najw := Cyfra;
      Suma := Suma + Najw;
    end
    else
      Suma := Suma - Cyfra;
  end;
  Result := Suma;
end;

4 komentarzy

A te | to można zapisać. Niestety tego _ na górze to już nie...:-(

Do detoxa: mie wychodzi 1666 a nie 1888...

A skąd ty wziąłeś tą liczbę? Ograniczeniem tutaj jest liczba $FFFF czyli 65536 (Word ogranicza).
Ten rodzaj zapisu jest ograniczony względem oryginalnego zapisu rzymskiego. Rzymianie, aby oznaczyć wielokrotności dziesiątki stawiali kreski po obydwu stronach symbolu, aby określić liczbę 100 razy większą
|X| = 10*100 = 1000

oraz kreskę nad symbolem, aby określić mnożenie przez 1000:
_
X = 10000

Jednak trudno jest coś takiego zapisać.

Extra Dryobates, że dałeś tą funkcję do gotowców. Można by ją jeszcze poszerzyć, gdyz na razie to jest chyba do liczby 1888 (tak na oko mi się zdaje). Ale funkcja i tak fajna.