Moduł Math::Roman
Uniwersytet Gdański - Instytut Matematyki - Zakład Informatyki - Strona domowaSpis treści
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 |
III | 3 |
XXX | 30 |
CCC | 300 |
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 Informatyki - Strona domowa - Perl - Wyklady