Moduł Math::Roman

Uniwersytet Gdański - Instytut Matematyki - Zakład Informatyki - Strona domowa

Spis treści

  1. Co to jest
  2. Krótki wstęp o liczbach rzymskich.
  3. Przydatne metody
    1. new()
    2. roman()
    3. error()
    4. bsrt()
    5. as_number()
  4. "Wszytsko-mający" przykład ;-)
  5. Tokeny
  6. Dodatkowe informacje (WAŻNE!!!)
  7. Autorka opisu

Co to jest

I 1
V 5
X 10
L 50
C 100
D 500
M 1000
II 2
XX 20
CC 200
IV 4
IX 9
XL 40
XC 90
CD 400
CM 900
III3
XXX30
CCC300

Moduł Math::Roman, dzięki któremu możliwe jest wykonywanie operacji na liczbach rzymskich, wraz z konwersja z i na arabskie.
Niezbędny do działania tego modułu jest moduł Math::BigInt.

Krótki wstęp o liczbach rzymskich.

Na początek krótkie przypomnienie o literach składowych rzymskich liczb, czyli która co oznacza w języku liczb arabskich (patrz tabelka). Jak widzimy zasada jest prosta, znana z podstawówki, wręcz intuicyjna, zatem nie będę się nad nią rozdrabniać ;-).


Przydatne metody

new()

Konstruktor. Tworzy nam nowy obiekt klasy Math::Roman.
Argumentem jest string - liczba rzymska np. 'MCMLXI' (arabskie 1961).

roman()

Dziala tak samo jak new(). Przydatne by pisac krótszy kod.

error()

Math::Roman::error();

Jak sama nazwa wskazuje zwraca bład ostatniej instrukcji, gdy zwrócone zostało 'NaN'

bsrt()

$roman->bstr();

Funkcja ta zwraca napis reprezentujący wewnętrzną wartość, jako liczbę rzymską.
Reprezentacją zera będzie pusty ciąg znaków: ".
Wynik będzie się składał jedynie z obowiązujących symboli, nie będzie natomiast zawierał w sobie znaku.
Jeśli natomiast potrzebujemy użyć znaku, należy skorzystać z funkcji as_number().
Wyniki zawsze są generowane w możliwie najkrótszej formie.

as_number()

$roman->as_number();

Funkcja ta zwraca napis reprezentujący wewnętrzną wartość, jako znormalizowaną liczbę arabską, włącznie z jej znakiem.

"Wszystko-mający" przykład ;-)

A teraz czas na przykład, który zilustruje działanie funkcji i chociaż po krótce pokaże możliwe operacje wykonywane na liczbach. A to i tak nie wszytskie możliwości:

#!/usr/bin/perl -wl use Math::Roman qw(roman); $a = new Math::Roman 'XXIII'; print "a rzymskie: $a\n"; print "a arabskie: ", $a->as_number," \n"; $b = roman('XIV'); print "b rzymskie: $b\n"; print "b arabskie: ", $b->as_number," \n"; print "a-b rzymskie: ", $a - $b," \n"; print "a-b arabskie: ", ($a - $b)->as_number," \n"; $d = Math::Roman->bzero(); print "d po bzero() rzymskie: $d \n"; print "d po bzero() arabskie: ", $d->as_number," \n"; $d++; print "d po ++: $d \n"; $d += 20; print "d po zwiekszeniu o liczbe arabska 20: $d \n"; $d -= 'X'; print "d po zmniejszeniu o liczbe rzymska X: $d \n"; $d = $d % 3; print "d modulo 3 : $d \n"; $d-=3; print "d = -1 rzymskie: $d \n"; print "d = -1 arabskie: ",$d->as_number();
Czego wynik jest następujący:

Opiszmy teraz co się właściwie dzieje?

Ładujemy moduł Math::Roman.

Tworzymy sobie nowy obiekt przy pomocy funkcji new() o wartości 'XXIII' - jest to teraz zawoartość zmiennej $a.
Wypisujemy wartość zmiennej $a jako liczby rzymskiej, oraz jej arabski odpowiednik, który otrzymaliśmy dzięki funkcji as_number().

Tworzymy sobie nowy obiekt przy pomocy funkcji roman() o wartości 'XIV' - jest to teraz zawoartość zmiennej $b. Widzimy, iż składniowo, zajmuje ten zapis zdecydowanie mniej miejsca.
Wypisujemy wartość zmiennej $b jako liczby rzymskiej, oraz jej arabski odpowiednik, który otrzymaliśmy dzięki funkcji as_number().

Dwie liczby rzymskie możemy od siebie odjąć, jak w przykładzie, dodać, czy też wykonywać inne operacje arytmetyczne.

Wartość zmiennej można wyzerowac przy pomocy funkcji bzero() - tutaj zerujemy zmienna $d.
Widzimy, iż w reprezentacji rzymskiej jest to pusty ciąg znaków, natomiast jako cyfra arabska jest to normalne 0 (ZERO).

Zmienną możemy poddawać operacjom dekrementacji i inkrementacji.

Możemy wykonywac na niej operacje arytmetyczne nie tylko z innymi liczbami rzymskimi, lecz także z liczbami arabskimi.

Można także wykonywać na tych liczbach operacje modulo.

Tokeny

A na koniec jeszcze którko o funkcji Math::Roman::tokens() dzięki której możemy określić wartości stosowanych przez nas syboli :-)
#!/usr/bin/perl -wl use Math::Roman; Math::Roman::tokens( qw(I 1 V 5 X 10 L 50 C 100 D 500 M 1000)); $a = Math::Roman::roman('XV'); print "'$a' = ",$a->as_number(),"\n"; $a = Math::Roman::roman('XIIII'); print "'$a' = ",$a->as_number(),"\n"; $a = Math::Roman::roman('XIIIIIII'); print "'$a' = ",$a->as_number(),"\n"; Math::Roman::tokens ( qw(I 20 J 3) ); $a = Math::Roman::roman('IIJ'); print "'$a' = ",$a->as_number();

Wynik będzie następujący:

Widzimy, iż możemy sami określić, które symbole mają mieć jakie wartości, jak również, że IIII da nam w wyniku 4, a np. IIIIIII = VII = 7, natomiast coś takiego jak IV otrzyma wartość NaN, bowiem nie jest zdefiniowane.

Dodatkowe informacje

Jako, że troszke namęczyłam się z przykładami, a raczej tym, żeby je URUCHOMIĆ, dla tych chętnych, którzy chcą korzystać z tego modułu zaznaczam - na mancie on nie ma racji bytu niestety, natomiast pod windowsem trzeba mieć wersję Perla min 5.7.1. Polecam ściągnąć ActivePerl, a następnie na stronie www.cpan.org odszukać moduł Math::Roman i plik Roman.pm skopiować do katalogu lib/Math - znajdującego się tam, gdzie zainstalowaliśmy Perla i gotowe :-).

Więcej na temat tego modułu dowiesz się odwiedzając stronę: http://search.cpan.org/~tels/Math-Roman-1.07/lib/Math/Roman.pm.

Autorka opisu

M.M.

Uniwersytet Gdański - Instytut Matematyki - Zakład Informatyki - Strona domowa - Perl - Wyklady
[c] Piotr Arłukowicz, materiały z tej strony udostępnione są na licencji GNU.