Lisp »Tips 'n Tricks
»Roma2Inter
R2I converte numeri romani in numeri interi facendo uso dell'operatore logico OR.
R2I
;|
R2I.LSP (10 Luglio 2005)
Copyright (C) 2005 Claudio Piccini.
All rights reserved
www.cg-cad.com
Traduce un numero romano nel relativo numero intero
|;
(defun Roma2Inter ( str / x )
(cond
((= str "I")(setq x 1))
((= str "V")(setq x 5))
((= str "X")(setq x 10))
((= str "L")(setq x 50))
((= str "C")(setq x 100))
((= str "D")(setq x 500))
((= str "M")(setq x 1000))
)
(setq x x)
)
(defun c:r2i ( / str lstr
i c s
n1 n2
)
(setvar "cmdecho" 0)
(setq str (getstring "\nNumero romano: "))
(setq str (strcase str)) ; restituisce str in caratteri maiuscoli
(setq lstr (strlen str)) ; restituisce la lunghezza di str
(if (>= lstr 1)
(progn
(setq s 0)
(setq c (substr str 1 1))
(if (or (= c "I")(= c "V")(= c "X")
(= c "L")(= c "C")(= c "D")(= c "M")
)
(progn
(setq n1 (Roma2Inter c))
(setq i 2)
(while (<= i lstr)
(setq c (substr str i 1))
(if (or (= c "I")(= c "V")(= c "X")
(= c "L")(= c "C")(= c "D")(= c "M")
)
(progn
(setq n2 (Roma2Inter c))
(if (>= n1 n2)
(setq s (+ s n1))
(setq s (- s n1))
)
(setq n1 n2)
(setq i (1+ i))
)
(setq i (1+ lstr))
)
)
(setq s (+ s n1))
(setq str (strcat "\n" str "=" (itoa s)))
(princ str)
)
(progn
(setq str (strcat "\nERRORE: " str "?"))
(princ str)
)
)
)
)
(setvar "cmdecho" 1)
(princ)
)
;;;eof
|
Test del Lisp
Command: r2i
Numero romano: mmmmmmdccxli
MMMMMMDCCXLI=6741
Command: r2i
Numero romano: mmvzip
MMVZIP=2005
Command: r2i
Numero romano: zipmmv
ERRORE: ZIPMMV?
R2IM converte numeri romani in numeri interi facendo uso della funzione (member e lista).
Se e è presente nella lista restituisce una porzione della lista a partire da e, altrimenti restituisce nil.
Quindi se (if) (member e Lista) è diversa da nil il Lisp esegue le istruzioni e converte il numero.
R2IM
;|
R2IM.LSP (10 Luglio 2005)
Copyright (C) 2005 Claudio Piccini.
All rights reserved
www.cg-cad.com
Traduce un numero romano nel relativo numero intero
Fa uso della funzione (member e lista)
|;
(defun Roma2Inter ( str / x )
(cond
((= str "I")(setq x 1))
((= str "V")(setq x 5))
((= str "X")(setq x 10))
((= str "L")(setq x 50))
((= str "C")(setq x 100))
((= str "D")(setq x 500))
((= str "M")(setq x 1000))
)
(setq x x)
)
(defun c:r2im ( / Lista
str lstr
i e s
n1 n2
)
(setvar "cmdecho" 0)
(setq Lista (list "I" "V" "X" "L" "C" "D" "M"))
(setq str (getstring "\nNumero romano: "))
(setq str (strcase str)) ; restituisce str in caratteri maiuscoli
(setq lstr (strlen str)) ; restituisce la lunghezza di str
(if (>= lstr 1)
(progn
(setq s 0)
(setq e (substr str 1 1))
(if (member e Lista)
(progn
(setq n1 (Roma2Inter e))
(setq i 2)
(while (<= i lstr)
(setq e (substr str i 1))
(if (member e Lista)
(progn
(setq n2 (Roma2Inter e))
(if (>= n1 n2)
(setq s (+ s n1))
(setq s (- s n1))
)
(setq n1 n2)
(setq i (1+ i))
)
(setq i (1+ lstr))
)
)
(setq s (+ s n1))
(setq str (strcat "\n" str "=" (itoa s)))
(princ str)
)
(progn
(setq str (strcat "\nERRORE: " str "?"))
(princ str)
)
)
)
)
(setvar "cmdecho" 1)
(princ)
)
;;;eof
|
Test del Lisp
Command: r2im
Numero romano: MMMMMMMMMMMMMMMMMMMMMMMMMMMCMXCVIII
MMMMMMMMMMMMMMMMMMMMMMMMMMMCMXCVIII=27998
Lisp »Tips 'n Tricks
Ultimo Aggiornamento_Last Update: 10 Luglio 2005
|