BTemplates.com

Diberdayakan oleh Blogger.

Pages

Pages - Menu

Popular Posts

Tampilkan postingan dengan label Menterjemahkan Angka Romawi. Tampilkan semua postingan
Tampilkan postingan dengan label Menterjemahkan Angka Romawi. Tampilkan semua postingan

Rabu, 07 November 2007

Menterjemahkan Angka Romawi dengan Visual Foxpro


&& FUNCTION Rom2Lat
&& PARAMETERS _cBil,_Mode
&& Function Rom2Lat
&& Untuk merubah angka romawi menjadi bilBulPos Latin
&& Parameter _cBil,_Mode
&&  _cBil Angka Romawi
&&  _Mode untuk menentuka Nlai Return, _Mode berupa 0 atau 1
&& Return : Jika _Mode=0, BilBulPos, -1 jika tak dapat diterjemahkan
&&               Jika _Mode=1, Expresi String dari Bil
&& Contoh :
&& Rom3Lat(XII) ==> 12
&& Rom2Lat("YZ") ==> -1
&& Rom2Lat("XII",1) ==>  "10+1+1"
&& Catatan : Function BacaDrKanan()

FUNCTION Rom2Lat
PARAMETERS _cBil,_Mode
IF VARTYPE(_cBil)<>"C"
        RETURN -1
ENDIF
IF LEN(_cBil)>99
        RETURN -1
ENDIF
IF VARTYPE(_Mode)="C"
        _Mode=VAL(_Mode)
ENDIF
IF VARTYPE(_Mode)<>"N"
        _Mode=0
ENDIF
IF _Mode<=0 .or. _Mode>1
        _Mode=0
ENDIF
_cBil=BacaDrKanan(HapusBlank(_cBil))
_ncBil=LEN(_cBil)
_BalikRom=""
FOR _kesekian=1 TO _ncBil
        _CharKei=SUBSTR(_cBil,_kesekian,1)
        _vKei=CharRom2Lat(_CharKei)
        IF _kesekian<_ncBil
                _NexChar=SUBSTR(_cBil,_kesekian+1,1)
                _vNexChar=CharRom2Lat(_NexChar)
                IF _vNexChar<_vKei
                        _BalikRom=_BalikRom+ALLTRIM(STR(_vKei))+"-"
                ELSE
                        _BalikRom=_BalikRom+ALLTRIM(STR(_vKei))+"+"
                ENDIF
        ELSE
                _BalikRom=_BalikRom+ALLTRIM(STR(_vKei))
        ENDIF
NEXT
IF _Mode=1
        RETURN _BalikRom
ENDIF
RETURN INT(Trump(_BalikRom))

&& FUNCTION Trump
&& Ini merupakan subfunction untuk function Rom2Lat
&& Untuk memnterjenahkan String berisi + dan - menjadi operasi &
&& Contoh :
&& Trump("11+10+2-2") ===> 21
&& Sama atrinya jika kita pakai & sbb :
&& xx="11+10+2-2"
&& ? &xx  ===> 21
&& Trump tidak dapat dipergunakan untuk string dengan operasi perkalian atau pembagian

FUNCTION Trump
PARAMETERS _BalikRom
_Kali=1000
_nBalik=0
_BalikRom=_BalikRom
DO WHILE _Kali>1
        _PosPlus=RAT("+",_BalikRom)
        _PosMin=RAT("-",_BalikRom)
        DO CASE
                CASE _PosPlus>_PosMin && Tanda + ada di belakang
                        _StringNBuncit=VAL(SUBSTR(_BalikRom,_PosPlus+1))
                        _nBalik=_nBalik+_StringNBuncit
                        _BalikRom=LEFT(_BalikRom,_PosPlus-1)
                CASE _PosPlus<_PosMin
                        _StringNBuncit=VAL(SUBSTR(_BalikRom,_PosMin+1))
                        _nBalik=_nBalik-_StringNBuncit
                        _BalikRom=LEFT(_BalikRom,_PosMin-1)
                CASE _PosPlus=0 .and. _PosMin=0
                        _StringNBuncit=VAL(_BalikRom)
                        _nBalik=_nBalik+_StringNBuncit
                        _BalikRom=""
                        EXIT
        ENDCASE
        _Kali=_Kali-1
ENDDO
RETURN _nBalik

&& Function CharRom2Lat
&& Untuk merubah 1 digit angka dasar romawi menjadi bilBulPos Latin
&& Parameter _cBil Angka Dasar Romawi (I,V,X, L,C,D,M)
&& Return : BilBulPos, 1 atau 5 atau 10, 50 atau 100 atau 500 atau 1000
&& Contoh :
&& Rom3Lat("C") ==> 100
&& Rom2Lat("c") ==> 100

FUNCTION CharRom2Lat
PARAMETERS _cBil
IF VARTYPE(_cBil)<>"C"
        RETURN -1
ENDIF
_cBil=UPPER(HapusBlank(_cBil))
DO CASE
        CASE _cBil="V"
                _Balik=5
        CASE _cBil="X"
                _Balik=10
        CASE _cBil="L"
                _Balik=50
        CASE _cBil="C"
                _Balik=100
        CASE _cBil="D"
                _Balik=500
        CASE _cBil="M"
                _Balik=1000
        OTHERWISE
                _Balik=1
ENDCASE
RETURN _Balik