Last 10 Posts [ In reverse order ] |
gigio^ne | Posted: 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^ne | Posted: 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 "ATTENZIONE: non sbagliare ad immettere i numeri romani. Pena errore nella conversione." Nz = raw_input("Inserire un numero romano non superiore a MMMCMXCIX (3999): ") Rom = Nz.upper() print "Il numero decimale č = ",ConvRomToDec(Rom) def SelezTre(): 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)" 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 "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 "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......................." 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^ne | Posted: 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^ne | Posted: 9/1/2011, 00:53 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^ne | Posted: 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....... |
yareol | Posted: 25/12/2010, 15:19 Ma quella di scrivere la tua calcolatrice in C, naturalmente... |
gigio^ne | Posted: 25/12/2010, 10:38 |
yareol | Posted: 24/12/2010, 21:09 Un modo sottile per dire che accetti la sfida? |
gigio^ne | Posted: 24/12/2010, 20:58 |
yareol | Posted: 24/12/2010, 14:52 Sarebbe una buona idea |