XmX


 
Replying to Calcolatrice con numeri romani
Nickname
Post Icons
                                     

                                   

Code Buttons

         
           FFUpload  Huppy Pick colour HTML Editor Help
Enter your Post
(Check Message Length)

Clickable Smilies
:huh:^_^:o:;):P:D
:lol::B)::rolleyes:-_-<_<:)
:wub::angry::(:unsure::wacko::blink:
:ph34r::alienff::cry::sick::shifty::woot:
<3:XD:*_*:];P:XP:
(:=)X):D:>.<>_<
=_=:|:?3_3:p:;_;
^U^*^^*:=/::*::b::f:
:botte:     
Show All

File Attachments
ForumCommunity Hosting   jpg gif png zip ...

Descr.:
Image Hosting: host it!


  
 


Last 10 Posts [ In reverse order ]
gigio^nePosted: 14/2/2017, 10:05
Babba bia ho, in questo periodo di pausa mtb bdc, ho ricontrollato il codice di conversione romano decimale e c'č un bug grande quanto una casa in pratica eseguendo es: CM mi da 500 ovviamente sbagliato. Sto riprogrammando con gambas o glade mo vedo. Cmq ho risolto visto che il controllo del formato romano non č semplice, lo č invece in decimale. Bye bye.
gigio^nePosted: 19/5/2015, 10:51
^_^ della serie come ammazzare il tempo a casa
una versione della calcolatrice romana che non fa caso a lettere minuscole o maiuscole.

CODICE
# *** Convertitore da numeri romani a decimali e viceversa
# *** e calcolatrice con numeri romani
# *** in questa versione unicamente per python 2.7
# *** č possibile utilizzare sia lettere minuscole che maiuscole
# *** per digitare i numeri romani.
import sys
def SelezUno():
   Num = input("Inserire un numero decimale inferiore a 4000: ")
   print "Il numero romano č = ",ConvertNum(Num)
def SelezDue():
   print
   print "ATTENZIONE: non sbagliare ad immettere i numeri romani. Pena errore nella conversione."
   print
   Nz = raw_input("Inserire un numero romano non superiore a MMMCMXCIX (3999): ")
   Rom = Nz.upper()
   print "Il numero decimale č = ",ConvRomToDec(Rom)  
def SelezTre():
   print
   print "immettere i numeri romani da sommare, sotrarre, moltiplicare,o dividere max(MMMCMXCIX 3999)."
   print "Immettere l'espressione senza spazi."
   print "(Es: XXV+V e premere invio)"
   print
   Nz = raw_input("Immettere l'operazione Romana da eseguire -> ")
   N1 = Nz.upper()
   #*** Estrapola dalla stringa  primo secondo numero e l'operatore
   z = 0
   Nx = 0
   Ny = 0
   Risult = 0
   for z in range(len(N1)):
       if N1[z:z+1] == '+' or N1[z:z+1] == '-' or N1[z:z+1] == '*' or N1[z:z+1] == '/':
           p1 = N1[:z]     #* Estrae il primo numero
           op = N1[z:z+1]  #* Estrae l'operatore
           N2 = N1[z+1:]   #Estrae il secondo numero
   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
   print "Il risultato dell'operazione č = ",ConvertNum(Risult)    
def ConvRomToDec(Rom):
   x = 0
   x1 = 1
   t = ""
   dc = 0
   dc1 = 0
   dec = 0
   z = 0
   for z in range(len(Rom)):
       t = Rom[x:x1]
       dc = RomToDec(t)
       t = Rom[x1:x1 + 1]
       dc1 = RomToDec(t)
       if dc >= dc1:      
           dec += (dc + dc1) - dc1
       elif dc < dc1:    
           dec +=  (-dc * 2 + dc1) + dc - dc1
       x += 1
       x1 += 1
   return dec
def ConvertNum(Num):
   dgt = "IVXLCDM"      
   x = 0
   t = ""
   while Num > 0:      
       dg = Num % 10  
       Num = int(Num / 10)
       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
def RomToDec(t):
   Y = 0
   I = 1
   V = 5
   X = 10
   L = 50
   C = 100
   D = 500
   M = 1000
   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
while 1:
   print
   print "BENVENUTI NELLA CALCOLATRICE ROMANA.     ver 1.04"
   print "--------------------------------------------------"
   print "1) = Convertitore da decimale a numero romano..."
   print "2) = Convertitore da romano  a numero decimale.."
   print "3) = Utilizza la calcolatrice romana............"
   print "4) = Uscita dal programma......................."
   print
   Qst = raw_input("Sciegliere un'opzione tra 1 e 4: ")
   try:
       if Qst == "1":
           SelezUno()
       elif Qst == "2":
           SelezDue()
       elif Qst == "3":
           SelezTre()
       elif Qst == "4":
           print "FINE. Grazie per aver usato CalcRoman.py"
           break
   except IOError as err:
       # Uso di IOError as an instance.come istanza
       print("Error:", err)
       print("Number:", err.errno)
gigio^nePosted: 7/10/2012, 19:16
Nella versione della calcolatrice romana dopo aver eseguito il progr su python con ubuntu ho trovato un errore
relativo all'utilizzo della codifica utf-8

l'errore si verifica alla riga 29 del listato, anche se con Geany il programma viene compilato correttamente.
ma nell'esecuzione viene restituito return 1

BUG FIX:
Da inserire nella prima riga del listato

CODICE
#!/usr/bin/python
# -*- coding: latin-1 -*-


Documentazione dell'errore:
www.python.org/dev/peps/pep-0263/
gigio^nePosted: 9/1/2011, 00:53
:gatto1vu7.jpg: Wowwwww!!!! Fine Calcolatrite romana in C. ed ora Beorn che ne pensi del linguaggio ruby? o crearci intorno un'interfaccia grafica in c?
La vedo dura!!!
CODICE
// ************* CalcRoman.c ver 1.00 *************
// ************** Compilato con g++ ***************
//*** Calcolatrice e convertitore numeri decimali in numeri romani e viceversa ***
//
//*** 09/01/2011 CalcRoman.c 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
//
#include <stdio.h>
#include <string.h>
//Costanti
#define I 1
#define V 5
#define X 10
#define L 50
#define C 100
#define D 500
#define M 1000
#define MAX 30
#define TRUE 1
#define FALSE 0
//Prototipi di funzioni
int ContConvDec();
int ConvDecToRom();
int SumRomanNumber();
char convert_dec();
int convert_rom();
int StrReverse();
int Unisci();
//Dichiarazione variabili globali
char dgt[] = "IVXLCDM";
char g[MAX],t[MAX],Rom[MAX],c;
int num = 0,dec = 0,s = 0,z = 0,x = 0,Y = 0;
int selezione = TRUE;
int choice;
//Corpo del programma
int main()
{
   while (selezione == TRUE)
   {
   printf("\nCALCOLATRICE E CONVERTITORE IN NUMERI ROMANI E VICEVERSA.");
   printf("\n");
   printf("\nMenu principale.\n");
   printf("----------------\n");
   printf("\n1) - Convertitore Decimale Romano.");
   printf("\n2) - Convertitore Romano Decimale.");
   printf("\n3) - Calcolatrice Romana.");
   printf("\n4) - Uscita dal programma.\n");
   printf("\n");
   printf("\nScegli un'opzione da tra (1 e 4) -> ");
   scanf("%d",&choice);
       if (choice == 1)
       {
       ContConvDec();        //Chiama la funzione di conversione decimale romano.
       }
       if (choice == 2)
       {
       printf("\nInserisci un numero Romano da I a MMMCMXCIX -> ");
       scanf("%­s", Rom);        //chiede un numero romano (Stringa).
       ConvDecToRom();        //Chiama la funzione di conversione romano decimale.
       printf("\nNUMERO DECIMALE = %d\n",dec);
       printf("----------------------\n\n");
       }
       if (choice == 3)
       {
       SumRomanNumber(); //Chiamata della calcolatrice romana.
       }
       if (choice == 4)
       {
               printf("\n\nGrazie per aver usato la Calcolatrice Romana!!\n");
               break;
       }
       if (choice <= 0 || choice >= 5)
       {
       printf("\n\nScelta non valida. Programma terminato!\n");
               selezione = FALSE;
       }
   }
return 0;
}
int ContConvDec()
{
       s = 0;
       z = 0;
       x = 0;
       printf("\nInserisci un numero decimale da 1 a 3999: ");
       scanf("%d", &num);        //chiede un numero decimale.
       convert_dec();        //Converte il decimale in numero romano
       StrReverse();        //Inverte il numero romano (o meglio lo radrizza)
       printf("\n\nNUMERO ROMANO = %­s\n",g);
       printf("-----------------------------\n");
}
char convert_dec()        //Funzione di conversione decimale romano.
{
   int dg = 0;
   do
   {
       dg = num % 10;
       num = num / 10;
       if (dg == 1)
       {
           Unisci();
       }
       if (dg == 2)
       {        
           Unisci();
           Unisci();
       }        
       if (dg == 3)
       {
           Unisci();
           Unisci();
           Unisci();
       }
       if (dg == 4)
       {
           t[s] = dgt[x+1];
           s++;
           Unisci();
       }
       if (dg == 5)
       {
           t[s] += dgt[x+1];
           s++;
       }
       if (dg == 6)
       {
           Unisci();
           t[s] = dgt[x+1];
           s++;
       }
       if (dg == 7)
       {
           Unisci();
           Unisci();
           t[s] = dgt[x+1];
           s++;
       }
       if (dg == 8)
       {
           Unisci();
           Unisci();
           Unisci();
           t[s]= dgt[x+1];
           s++;
       }
       if (dg == 9)
       {
           t[s] = dgt[x+2];
           s++;
           Unisci();
       }
       x += 2;
       }while (num != 0);
       s++;
       t[s] = '\0';
}
int StrReverse()        //Funzione di inversione stringa (numero romano)
{
int r;
for (r = s-2;r >= 0;r--)
       {
               g[z] = t[r];
               z++;
       }
       g[z] = '\0';
}
int Unisci()        //Funzione per assegnare il numero romano
{
       t[s] = dgt[x];
       s++;
}
int ConvDecToRom()        //Converte il romano in numero decimale
{
       Y = 0;
       dec = 0;
       int dc = 0;
       int dc1 = 0;
       int xx = 0;
       int x1 = 1;
       int r;
       for (r = 0;r < strlen(Rom);r++)
       {
               c = Rom[xx];
               dc = convert_rom();
               c = Rom[x1];
               dc1 = convert_rom();
               if (dc >= dc1)    
                           dec += (dc + dc1) - dc1;
               if (dc < dc1)    
                           dec +=  (-dc * 2 + dc1) + dc - dc1;
         xx++;
         x1++;
       }
       return dec;
}
int convert_rom()
{
   if (c == 'I')
       Y = I;
   if (c == 'V')
       Y = V;
   if (c == 'X')
       Y = X;
   if (c == 'L')
       Y = L;
   if (c == 'C')
       Y = C;
   if (c == 'D')
       Y = D;
   if (c == 'M')
       Y = M;
   return Y;
}
int SumRomanNumber()
{
   char N1[MAX],N2[MAX],N3[MAX],OP;
   int f = 0;
   printf("\n\nImmettere i numeri romani da sommare, sotrarre, moltiplicare,o dividere max(MMMCMXCIX 3999).");
   printf("\nImmettere l'espressione senza spazi.");
   printf("\n(Es: XXV+V e premere invio)");
   printf("\nRisultato esempio = XXX\n");
   printf("\nImmettere l'operazione Romana da eseguire -> ");
   scanf("%­s",N1);
   //Estrae l'operatore.
   // Estrapola dalla stringa  primo secondo numero e l'operatore
   z = 0;
   x = 0;
   int Nx = 0;
   int Ny = 0;
   int Risult = 0;
   for (z = 0; z < strlen(N1); z++)
       {
           if (N1[z] == '+' || N1[z] == '-' || N1[z] == '*' || N1[z] == '/')
           {
               OP = N1[z];  // Estrae l'operatore
               for(f = 0;f < z;f++)
                       Rom[f] = N1[f];     // Estrae il primo numero
               Rom[f] = '\0';
               ConvDecToRom();
               Nx = dec;
               for(f = z+1;f < strlen(N1);f++)
               {
                       Rom[x] = N1[f];     // Estrae il secondo numero
                       x++;        
               }        
               Rom[x] = '\0';
               ConvDecToRom();
               Ny = dec;
           }
       }
       
       if (OP == '+')
               Risult = Nx + Ny;
           if (OP == '-')
               Risult = Nx - Ny;
           if (OP == '*')
               Risult = Nx * Ny;
           if (OP == '/')
               Risult = Nx / Ny;
       num = Risult;        
       s = 0;
       z = 0;
       x = 0;
       convert_dec();        //Converte il decimale in numero romano
       StrReverse();        //Inverte il numero romano.
       printf("\n\nRisultato operazione = %­s\n",g);
       printf("------------------------------\n");
   
}


Funza bene se non sbagliate a digitare i numeri romani.... ^_^
gigio^nePosted: 8/1/2011, 00:33
^_^ Fine... legna tutta tagliata, ora posso dedicarmi e continuare il progetto in sospeso della Calcolatrice romana in C. -_-
Uno spezzone che mi dava parecchi grattacapi č stato risolto, cioč la parte che convertiva i decimali in numeri romani.
A differenza di Vb e Python il linguaggio C si comporta in maniera a sč stante, e ho dovuto rivedere tutta la procedura di conversione
infatti a differenza di Vb e python in cui č bastato un semplice adattamento nella trasposizione da un linguaggio all'altro
senza sorprese, e con poche modifiche, con il C le cose sono cambiate dopo la trasposizione i numeri decimali
venivano si convertiti diritti ma al contrario, mi spiego meglio Es.numero decimale 1459 convertito con la trasposizione o adattamento (praticamente senza modificare il codice e adattandolo semplicemente)
al linguaggio C mi dava in conversione IXLCDM in pratica blocchi di numeri romani convertiti correttamente ma al contrario IX = 9 - L = 50 - CD = 400 - M = 1000
Quindi ho dovuto ''reinventare'' la conversione invertendo la seguenza di composizione dei numeri romani, e in seguito creare una funzione per invertire l'intera stringa
che per affetto lo chiamata come in vb6 StrReverse(), cmq ora funza bene.
Pure il menu principale faceva i capricci come ho scritto nel topic (programmazione bla.. bla.. bla..) non voleva saperne di tornare sui suoi passi.

Beh!!! per ora il convertitore Decimale romano e il menu in C funzano bene sempre con numeri inferiori a 4000.

Ecco il Codice:
CODICE
// Calcolatrice romana in C. ver. 0.01
// Provata e funzionante su Ubuntu con g++ e su win seven con Dev-C++
#include <stdio.h>
//Costanti
#define MAX 30
#define TRUE 1
#define FALSE 0
//Prototipi di funzioni
int ContConvDec();
char convert_dec();
int StrReverse();
int Unisci();
//Dichiarazione variabili globali
char dgt[] = "IVXLCDM";
char g[MAX];
char t[MAX];
int num = 0;
int s = 0;
int z = 0;
int x = 0;
int selezione = TRUE;
int choice;
//Corpo del programma
int main()
{
   while (selezione == TRUE)
   {
   printf("\nCALCOLATRICE E CONVERTITORE IN NUMERI ROMANI E VICEVERSA.");
   printf("\n");
   printf("\nMenu principale.\n");
   printf("----------------\n");
   printf("\n1) - Convertitore Decimale Romano.");
   printf("\n2) - Convertitore Romano Decimale.");
   printf("\n3) - Calcolatrice Romana.");
   printf("\n4) - Uscita dal programma.\n");
   printf("\n");
   printf("\nScegli un'opzione da (1 a 4) -> ");
   scanf("%d",&choice);
       if (choice == 1)
       {
       ContConvDec();        //Chiama la funzione di conversione decimale romano.
       }
       if (choice == 2)
       {
               printf("\n\nFunzione non implementata!!!\n");
               break;
       }
       if (choice == 3)
       {
               printf("\n\nFunzione non implementata!!!\n");
               break;
       }
       if (choice == 4)
       {
               printf("\n\nGrazie per aver usato la Calcolatrice Romana!!\n");
               break;
       }
       if (choice <= 0 || choice >= 5)
       {
       printf("\n\nScelta non valida. Programma terminato!\n");
               selezione = FALSE;
       }
   }
return 0;
}
int ContConvDec()
{
       s = 0;
       z = 0;
       x = 0;
       printf("\nInserisci un numero decimale da 1 a 3999: ");
       scanf("%d", &num);        //chiede un numero decimale.
       convert_dec();        //Converte il decimale in numero romano
       StrReverse();        //Inverte il numero romano (o meglio lo radrizza)
       printf("\n\nNUMERO ROMANO = %­s\n",g);
       printf("-----------------------------\n");
}
char convert_dec()        //Funzione di conversione decimale romano.
{
   int dg = 0;
   do
   {
       dg = num % 10;
       num = num / 10;
       if (dg == 1)
       {
           Unisci();
       }
       if (dg == 2)
       {        
           Unisci();
           Unisci();
       }        
       if (dg == 3)
       {
           Unisci();
           Unisci();
           Unisci();
       }
       if (dg == 4)
       {
           t[s] = dgt[x+1];
           s++;
           Unisci();
       }
       if (dg == 5)
       {
           t[s] += dgt[x+1];
           s++;
       }
       if (dg == 6)
       {
           Unisci();
           t[s] = dgt[x+1];
           s++;
       }
       if (dg == 7)
       {
           Unisci();
           Unisci();
           t[s] = dgt[x+1];
           s++;
       }
       if (dg == 8)
       {
           Unisci();
           Unisci();
           Unisci();
           t[s]= dgt[x+1];
           s++;
       }
       if (dg == 9)
       {
           t[s] = dgt[x+2];
           s++;
           Unisci();
       }
       x += 2;
       }while (num != 0);
       s++;
       t[s] = '\0';
}
int StrReverse()        //Funzione di inversione stringa (numero romano)
{
int r;
for (r = s-2;r >= 0;r--)
       {
               g[z] = t[r];
               z++;
       }
       g[z] = '\0';
}
int Unisci()        //Funzione per assegnare il numero romano
{
       t[s] = dgt[x];
       s++;
}


Mo continuo....... :) :B):
yareolPosted: 25/12/2010, 15:19
Ma quella di scrivere la tua calcolatrice in C, naturalmente... :)
gigio^nePosted: 25/12/2010, 10:38
CITAZIONE (yareol @ 24/12/2010, 21:09) 
Un modo sottile per dire che accetti la sfida? :lol:

Quale sfida??? :huh: :huh: :huh:
yareolPosted: 24/12/2010, 21:09
Un modo sottile per dire che accetti la sfida? :lol:
gigio^nePosted: 24/12/2010, 20:58
CITAZIONE (yareol @ 24/12/2010, 14:52) 
Sarebbe una buona idea ;)

Arriverą tra un'acettata e l'altra ci penso. Poi chi lo są!!!
yareolPosted: 24/12/2010, 14:52
Sarebbe una buona idea ;)