Conversione Romano Decimale

di il
12 risposte

Conversione Romano Decimale

Salve, sono nuovo qui sul forum, potreste aiutarmi su un programma che effettua una conversione da romano a decimale in C?
A scuola abbiamo appena cominciato l'argomento degli array, non sono capace a gestire un'unica stringa che contiene il numero romano, bensì considero un input alla volta. Il problema è che non riesco a sottrarre nel caso in cui il secondo sia maggiore del primo (ad esempio I e V, si deve sottrarre 1 a 5). Il programma che ho scritto è sbagliato, ma se è necessario lo posto. Grazie in anticipo.

12 Risposte

  • Re: Conversione Romano Decimale

    Si dovresti, così almeno vediamo che metodo stai usando e ti diamo suggerimenti su quello
  • Re: Conversione Romano Decimale

    Va bene, posto il codice, so che ha molti errori, se potete aiutarmi vi ringrazio.
    #include <stdio.h>
    
    main () {
    	int i=0;
    	int cont=0;
    	char romano[7]={'I','V','X','L','C','D','M'};
    	char numero[10];
    	int decimale=0;
    	int numeri[7]={1,5,10,50,100,500,1000};
    	printf("Premi 0 per terminare ed effettuare la conversione\n");
    	do {
    	printf("Inserisci %d^ numero romano: \n",cont+1);
    	scanf("%s",&numero);
    	cont++;
    	if (numeri[i]<=decimale) {
    	if (numero[i]==romano[0])
    	decimale=decimale+numeri[0];
    	else if (numero[i]==romano[1])
    	decimale=decimale+numeri[1];
    	else if (numero[i]==romano[2])
    	decimale=decimale+numeri[2];
    	else if (numero[i]==romano[3])
    	decimale=decimale+numeri[3];
    	else if (numero[i]==romano[4])
    	decimale=decimale+numeri[4];
    	else if (numero[i]==romano[5])
    	decimale=decimale+numeri[5];
    	else if (numero[i]==romano[6])
    	decimale=decimale+numeri[6];
    		}
        else {
    	if (numero[i]==romano[0])
    	decimale=numeri[0]-decimale;
    	else if (numero[i]==romano[1])
    	decimale=numeri[1]-decimale;
    	else if (numero[i]==romano[2])
    	decimale=numeri[2]-decimale;
    	else if (numero[i]==romano[3])
    	decimale=numeri[3]-decimale;
    	else if (numero[i]==romano[4])
    	decimale=numeri[4]-decimale;
    	else if (numero[i]==romano[5])
    	decimale=numeri[5]-decimale;
    	else if (numero[i]==romano[6])
    	decimale=numeri[6]-decimale;
    		}
    	}
        while (numero[i]!='0');
        printf("%d",decimale);
    }
  • Re: Conversione Romano Decimale

    Ma scusa come dovrebbe funzionare? Mi sto trovando un po' in difficoltà a capirlo...
  • Re: Conversione Romano Decimale

    Ok penso di aver capito ahahahah era "i" Che mi mandava in confusione. Sinceramente non capisco a cosa serva
  • Re: Conversione Romano Decimale

    Tutta questa parte del codice non verra' mai eseguita perche' sempre falsa

     if (numeri[i]<=decimale) {
       if (numero[i]==romano[0])
       decimale=decimale+numeri[0];
       else if (numero[i]==romano[1])
       decimale=decimale+numeri[1];
       else if (numero[i]==romano[2])
       decimale=decimale+numeri[2];
       else if (numero[i]==romano[3])
       decimale=decimale+numeri[3];
       else if (numero[i]==romano[4])
       decimale=decimale+numeri[4];
       else if (numero[i]==romano[5])
       decimale=decimale+numeri[5];
       else if (numero[i]==romano[6])
       decimale=decimale+numeri[6];
          }
    numeri=1
    decimanle=0
    if(1<=0)
    in ogni caso dovresti confrontare tutti gli elementi di 'numero' con tutti gli elementi di 'romano' per effettuare una conversione non soltanto il primo elemento ('i' e' sempre 0)

    ps main ritorna un intero
    pss non sarebbe meglio usare un ciclo for
  • Re: Conversione Romano Decimale

    screative ha scritto:


    Tutta questa parte del codice non verra' mai eseguita perche' sempre falsa
    Veramente viene eseguita praticamente sempre, dal secondo passaggio in poi
    numeri=1;
    if(1<=decimale) mai al primo passaggio
    Esegue
    Else
    Esegue l'altra
    Ma poi decimale irrimediabilmente aumenta almeno di 1, quindi d'ora in poi potrà essere vero. Comunque l'ho provato e sbaglia nel fare le sottrazioni tipo X X I V lo mette 26, dovresti tenere traccia di due numeri alla volta, secondo me, anzi, dovresti effettuare il controllo proprio due cifre romane alla volta. Se quella di sinistra è maggiore dell'altra,decimale=decimale+cifra_convertita, sennò decimale=decimale+cifra_destra-cifra_sinistra
  • Re: Conversione Romano Decimale

    ANDPRI ha scritto:


    screative ha scritto:


    Tutta questa parte del codice non verra' mai eseguita perche' sempre falsa
    Veramente viene eseguita praticamente sempre, dal secondo passaggio in poi
    numeri=1;
    if(1<=decimale) mai al primo passaggio
    Esegue
    Else
    Esegue l'altra
    Ma poi decimale irrimediabilmente aumenta almeno di 1, quindi d'ora in poi potrà essere vero. Comunque l'ho provato e sbaglia nel fare le sottrazioni tipo X X I V lo mette 26, dovresti tenere traccia di due numeri alla volta, secondo me, anzi, dovresti effettuare il controllo proprio due cifre romane alla volta. Se quella di sinistra è maggiore dell'altra,decimale=decimale+cifra_convertita, sennò decimale=decimale+cifra_destra-cifra_sinistra


    si scusami hai perfettamente ragione, avevo dato una lettura superficiale, ha problemi anche nella ripetizione di simboli (II III XX ecc)
  • Re: Conversione Romano Decimale

    Sisi proprio per questo consiglio di confrontarlu due alla volta, finché non ne trovi uno di sinistra che sia più piccolo di quello di destra. A quel punto, da quel che credo, dovresti essere arrivato alla fine
  • Re: Conversione Romano Decimale

    Pensandoci bene in realtà no, perché potrebbero esserci dei casi in cui ci sono due valori minori del successivo in die situazioni diverse tipo qui MDCCCXLIX dove XL fermerebbe il mio procedimento, ma dovrebbe continuare. Ho scritto un programma ora che apparentemente funziona, ma visto che odio gli array di caratteri, l'ho scritto in c++ con le stringhe. Se ti interessa di posso dare qualche consiglio, è solo un pochino più articolato del tuo
  • Re: Conversione Romano Decimale

    Grazie a tutti dei consigli. Riguardo la ripetizione di simboli non mi sembra ci siano problemi, sia con un semplice "III" sia con un "XXVIII" ad esempio, mentre invece la sottrazione non funziona. Non ho capito cosa intendiate con il confronto di due cifre romane alla volta? Con il mio metodo confronto prima i caratteri e successivamente assegno loro il rispettivo valore decimale, come posso fare controlli su due cifre?

    ANDPRI ha scritto:


    Pensandoci bene in realtà no, perché potrebbero esserci dei casi in cui ci sono due valori minori del successivo in die situazioni diverse tipo qui MDCCCXLIX dove XL fermerebbe il mio procedimento, ma dovrebbe continuare. Ho scritto un programma ora che apparentemente funziona, ma visto che odio gli array di caratteri, l'ho scritto in c++ con le stringhe. Se ti interessa di posso dare qualche consiglio, è solo un pochino più articolato del tuo
    M'interessa il programma con le stringhe e accetto consigli. Anche per capire quali problemi si possono evitare utilizzando un altro metodo.
  • Re: Conversione Romano Decimale

    Beh io dico solo che il tuo metodo non funzionerà mai bene, perché devi cinfrontare due cifre alla volta per forza. Se ti capita XXXIV, devi vedere prima il rapporto tra la cifra 0 (X) e la cifra 1 (X) allora se sono 0>1 fai decimale=decimale+cifra0, se sono 0<1 fai decimale=decimale+(cifra1-cifra0), se sono uguali allora c'è un problema: devi controllare la terza cifra. Se si verifica la condizione 0==1&&2>1 (quindi 2>0) il numero è sbagliato, impossibile. Penso che questo sia l'unico modo
  • Re: Conversione Romano Decimale

    Posto la mia versione l'ho testata con un paio di conversioni sembrerebbe funzionare , se ci sono errori chiedo scusa ma l'ho scritta velocemente

    #include <stdio.h>
    #define dim 10
    
    
    int main (){
    
    int tabella_numeri[7]={1,5,10,50,100,500,1000};
    char tabella_romano[7]={'I','V','X','L','C','D','M'};
    char n_daconvertire[dim];
    int n_convertito[dim];
    int decimale=0;
    int pad=0;
    for(int i=0;i<dim;i++){
     n_daconvertire[i]='0';
     n_convertito[i]=0;
    }
    
    printf("inserisci numero romano da convertire\n");
      scanf("%s",n_daconvertire);
    int counter=-1;
    for(int i=0;i<dim && n_daconvertire[i]!='0';i++){
        for(int j=0;j<7;j++){
        if(n_daconvertire[i]==tabella_romano[j])
           n_convertito[i]=tabella_numeri[j];
    }
    counter++;
    
    }
    
    if(counter%2!=0)
    pad=1;
    {
    for(int i=counter-1;i>=pad;i=i-2){
     if(n_convertito[i]>n_convertito[i-1] && i!=0)
       decimale=decimale+n_convertito[i]-n_convertito[i-1];
    else decimale+=n_convertito[i]+n_convertito[i-1];
    }
    
    if(pad!=0)
     decimale+=n_convertito[0];
    
    
    
    
    }
    
    printf("il numero e' %d",decimale);
    
    return 0;}
Devi accedere o registrarti per scrivere nel forum
12 risposte