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;
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.