XmX

Calcolatrice con numeri romani, tipo XX - IX = XI

« Older   Newer »
  Share  
gigio^ne
view post Posted on 15/12/2010, 23:51 by: gigio^ne
Avatar

Advanced Member

Group:
Member
Posts:
1,184
Location:
Sedna

Status:


:) Finita o quasi c'è solo qualche dettaglio da rivedere, ma nella versione in Vb6 sono certo che funzionerà perfettamente.
Per ora c'è solo questa in Python.
Esegue conversioni da Decimali a numeri romani
Da numeri romani a decimali
Esegue calcoli esclusivamente con numeri romani tipo XX + III = XXIII
fa somme, sottrazioni, moltiplicazioni, divisioni.
I limiti penso che siano noti niente numeri negativi, ne numeri che se convertiti o sommati diano un risultato superiore a 3999.
Le divisioni restituiscono solo interi.

Questo il codice di cui le funzioni di conversione sono gia state postate.
CODICE
#************* RomanCalc.py ver 1.00 *************
#************ Scritto in Python ver 2.7  *********
#*** Converte numeri decimali in numeri romani e viceversa ***

#*** 14/12/2010 RomanCalc.py is licenced under LGPL. ***
#*** http://www.gnu.org/licenses/lgpl.html ***

#*** I'd be happy to hear if you use this in your software. ***
# Copyright (C) 2010 xyzangelo@gmail.com
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
#
#*** programma testato unicamente su win seven 64bit.
#*** Funzione che trasforma numeri decimali in numeri romani
#*** Questa però presenta un limite numerico massimo che è 3999
#*** Numeri superiori non possono essere convertiti in quanto
#*** la numerazione romana comprende cifre fino alle migliaia simbolo (M)
#*** cifre superiori per poterle sommare, sotrarre, moltiplicarle etc.
#*** necessitano di caratteri non compresi nei 255 codici ASCII
#*** ATTENZIONE: oltre il 3999 il programma da i numeri nel vero senso
#*** della parola, es. digitate 5656 e vi esce XX.
import sys    #*** header di programma.
def ConvertNum(Num):
   dgt = "IVXLCDM"       #*** Costante dei numeri romani.
   x = 0
   t = ""
   while Num > 0:       #*** esegue un ciclo fino a che il numero delle cifre è finito
       dg = Num % 10    #*** trova il resto della divisione num / 10, o meglio è la funzione MOD di python
       Num = int(Num / 10) #*** divide e trasforma Num in un'intero
       #*** Procedura per la conversione in numero romano.
       if dg == 1:
           t = dgt[x:x+1] + t
       elif dg == 2:
           t = dgt[x:x+1] + dgt[x:x+1] + t
       elif dg == 3:
           t = dgt[x:x+1] + dgt[x:x+1] + dgt[x:x+1] + t
       elif dg == 4:
           t = dgt[x:x+2] + t
       elif dg == 5:
           t = dgt[x + 1:x+2] + t
       elif dg == 6:
           t = dgt[x + 1:x+2] + dgt[x:x+1] + t
       elif dg == 7:
           t = dgt[x + 1:x+2] + dgt[x:x+1] + dgt[x:x+1] + t
       elif dg == 8:
           t = dgt[x + 1:x+2] + dgt[x:x+1] + dgt[x:x+1] + dgt[x:x+1] + t
       elif dg == 9:
           t = dgt[x:x+1] + dgt[x + 2:x+3] + t
       x += 2
   return t
#*** Funzione che trasforma numeri romani in numeri decimali.
#*********************************************************************
#*** Bla... Bla... Bla!!! come listato conversione decimale a romano.
#*********************************************************************
#*** Questa però presenta un limite numerico massimo che è MMMCMXCIX (3999)
#*** Numeri superiori non possono essere convertiti in quanto
#*** la numerazione romana comprende cifre fino alle migliaia simbolo (M)
#*** cifre superiori per poterle sommare, sotrarre, moltiplicarle etc.
#*** necessitano di caratteri non compresi nei 255 codici ASCII
#*********************************************************************
#*** ATTENZIONE: oltre il MMMCMXCIX (3999) il programma da errore
#*********************************************************************
#*** Funzione per dichiarare e sostituire i numeri arabi o decimali a quelli romani
def RomToDec(t):
   Y = 0
   #*** Costanti dei numeri romani.
   I = 1
   V = 5
   X = 10
   L = 50
   C = 100
   D = 500
   M = 1000
   #*** Assegnazione dei numeri decimali
   if t == "I":
       Y = I
   elif t == "V":
       Y = V
   elif t == "X":
       Y = X
   elif t == "L":
       Y = L
   elif t == "C":
       Y = C
   elif t == "D":
       Y = D
   elif t == "M":
       Y = M
   return Y
   
#*** Funzione di conversione
def ConvRomToDec(Rom):
   x = 0
   x1 = 1
   t = ""
   dc = 0
   dc1 = 0
   dec = 0
   z = 0
   for z in range(len(Rom)):       #*** esegue un ciclo fino a che il numero delle cifre romane è finito
       #*** Procedura per la conversione in numero decimale.
       #*** Prende ogni carattere o numero romano, e verifica che non sia inferiore al successivo
       #*** con uno shift da sinistra verso destra.
       #*** Se il carattere o 'numero romano' è maggiore del successivo lo somma,
       #*** altrimenti lo sotrae, con segno negativo per suplire la somma precedente.
       #*****************************************************************************************
       #*** Come prima cosa per sapere se un numero romano è inferiore al successivo, trasformo
       #*** i numeri romani in decimali.
       t = Rom[x:x1]
       dc = RomToDec(t)
       t = Rom[x1:x1 + 1]
       dc1 = RomToDec(t)
       if dc >= dc1:      #**** Converte i positivi tipo ( XXVIII ) = 28
           dec += (dc + dc1) - dc1 # lo sottrae per evitare somme doppie incrementali
       elif dc < dc1:     #**** Converte i negativi tipo (MCMXXX) = 1930 o (IV) = 4
           dec +=  (-dc * 2 + dc1) + dc - dc1
       x += 1
       x1 += 1
   return dec
while 1:
   print "Calcolatrice romana... ver 1.00"
   print
   print "1) = Convertitore Decimale Romano..."
   print "2) = Convertitore Romano Decimale..."
   print "3) = Calcolatrice Romana............"
   print "4) = Uscita dal programma..........."
   print
   Qst = input("Sciegliere un numero tra 1 e 4: ")
   if Qst == 1:
       Num = input("Inserire un numero decimale inferiore a 4000: ")
       if Num == 0:
           break
       print "numero romano = ",ConvertNum(Num)   # Stampa il numero romano.
   if Qst == 2:
       print "Premere e lasciare premuto (Caps Lock) per comodita."
       print "ATTENZIONE: non sbagliare ad immettere i numeri romani. Pena errore nella conversione."
       print
       #ERRORE o COSA? Se si seleziona dal menu la calcolatrice, il progr non dovrebbe dopo il calcolo saltare QUI!!! HELP ME PLEASE
           Rom = raw_input("Inserire un numero romano non superiore a MMMCMXCIX (3999): ")
           print "numero decimale = ",ConvRomToDec(Rom)   # Stampa il numero decimale.
   if Qst == 3:
       print
       print "immettere i numeri romani da sommare, sotrarre, moltiplicare,o dividere max(MMMCMXCIX 3999)."
       print "Il primo numero deve essere seguito dall'operatore."
       print "(Es: XXV+ e premere invio quindi Immettere XX e premere invio)"
       print "Risultato = XLV"
       N1 = raw_input("Primo numero Romano -> ")
       N2 = raw_input("Secondo numero Romano -> ")
       if N1 == "" or N2 == "":
           break
       #*** Estrapola dalla stringa il primo numero, l'operatore
       z = 0
       Nx = 0
       Ny = 0
       Risult = 0
       p1 = N1[z:len(N1)-1] #* Estrae il primo numero
       op = N1[len(N1)-1:]  #* Estrae l'operatore
       Nx = ConvRomToDec(p1)
       Ny = ConvRomToDec(N2)
       if op == '+':
           Risult = Nx + Ny
       elif op == '-':
           Risult = Nx - Ny
       elif op == '*':
           Risult = Nx * Ny
       elif op == '/':
           Risult = int(Nx / Ny)
       print "Risultato operazione = ",ConvertNum(Risult)   # Stampa il risultato in numero romano.3
   if Qst == 4:
       print "FINE. Grazie per aver usato CalcRoman.py"
       break
   Rom = raw_input("Inserire un numero romano non superiore a MMMCMXCIX (3999) (q) per uscire: ")
   
   print
   print "Premere e lasciare premuto (Caps Lock) per comodita."
   print "ATTENZIONE: non sbagliare ad immettere i numeri romani. Pena errore nella conversione."
   print
   print "numero decimale = ",ConvRomToDec(Rom)   # Stampa il numero decimale.


Ora in Vb6 sarà uno scherzo... :D :P
 
Top
20 replies since 6/12/2010, 21:08   8212 views
  Share