cg-Cad

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