XmX

Calcolatrice con numeri romani, tipo XX - IX = XI

« Older   Newer »
  Share  
gigio^ne
view post Posted on 8/1/2011, 00:33 by: gigio^ne
Avatar

Advanced Member

Group:
Member
Posts:
1,184
Location:
Sedna

Status:


^_^ 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):
 
Top
20 replies since 6/12/2010, 21:08   8215 views
  Share