PŘEVOD ŘÍMSKÝCH ČÍSEL NA DESÍTKOVÁ A NAOPAK

PROBLÉM
Pro dané římské číslo, jako je MDCCCIX, určit desítkový ekvivalent, v našem případě tedy 1809.

IMPLEMENTACE
Jednotka: vnitřní funkce nebo vnější, ale pak bez procedure příkazu
 
Parametr: řetězec Roman - zadané římské číslo
 
Vrací: desítkovou reprezentaci zadaného římského čísla
 


R2D: procedure
parse upper arg Roman .
RtoD.I = 1; RtoD.V = 5; RtoD.X = 10
RtoD.L = 50; RtoD.C = 100
RtoD.D = 500; RtoD.M = 1000
Decimal = 0; Rdigit = LEFT(Roman, 1)
Ddigit = RtoD.Rdigit
do J = 2 to LENGTH(Roman)
  Rdigit = SUBSTR(Roman, J, 1)
  Next = RtoD.Rdigit
  if Next > Ddigit
    then Decimal = Decimal - Ddigit
    else Decimal = Decimal + Ddigit
  Ddigit = Next
end
return Decimal + Ddigit

 

PROBLÉM
Zapsat římskými číslicemi zadané číslo z intervalu 1 až 3999.

IMPLEMENTACE
Jednotka: vnitřní funkce nebo vnější, ale pak bez procedure příkazu
 
Parametr: Decimal - dané desítkové číslo, 1<=Decimal<=3999
 
Vrací: číslo zapsané římskými číslicemi
 


D2R: procedure
parse arg Decimal
if (Decimal < 0) | (Decimal > 3999) | ^DATATYPE(Decimal, "W")
  then call ERROR,
     "D2R: Chyba - zadané číslo musí být 1 až 3999"
parse value RIGHT(FORMAT(Decimal, , 0), 4, 0),
  with A +1 B +1 C +1 D
parse value "1 1 1 1 3 4 4 4 4 7",
  with X.0 X.1 X.2 X.3 X.4 X.5 X.6 X.7 X.8 X.9
parse value "0 1 2 3 2 1 2 3 4 2",
  with Y.0 Y.1 Y.2 Y.3 Y.4 Y.5 Y.6 Y.7 Y.8 Y.9
R = "IIIVIIIXXXLXXXCCCDCCCMMM"
/*            1         2      */
/*   123456789012345678901234  */
return SUBSTR(R, X.A + 21, Y.A) || SUBSTR(R, X.B + 14, Y.B),
    || SUBSTR(R, X.C +  7, Y.C) || SUBSTR(R, X.D, Y.D)
 
ERROR: say ARG(1); exit

 

SPOLUAUTOR
Roderic A. Davis - funkce D2R


obálka obsah index hlavní

změněno 12. dubna 2018
Copyright © 2000-2018 Vladimír Zábrodský, RNDr.

mail