Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2017
    Messaggi
    27

    [C] - Numeri Romani in numeri arabi

    Ciao a tutti ragazzi, mi è stato assegnato di creare un programma capace di trasformare tutti i numeri Romani in numeri arabi utilizzando While e lo Switch.
    Ho pensato di impostare il programma in questo modo:

    codice:
    #include<stdio.h>
    #include<stdlib.h>
    #include<math.h>
    #include<string.h>
    
    
    
    
    int main()
    {
    int i=0,num_arabo=0,j=0;
    char numero_romano[8];
    printf ("Inserire numero romano\n");
    scanf ("%s",numero_romano);
    while(numero_romano[j]!='\0',j++)
    switch(numero_romano[j]){
            case'I': numero_romano[j]=1;break;
            case'V': numero_romano[j]=5;break;
            case'X': numero_romano[j]=10;break;
            case'L': numero_romano[j]=50;break;
            case'C': numero_romano[j]=100;break;
            case'D': numero_romano[j]=500;break;
            case'M': numero_romano[j]=1000;break;
        }
        i=0;
        while(numero_romano[i]!='\0')
        {
            if((numero_romano[i+1]<numero_romano[i])||i==j) 
            num_arabo=num_arabo+numero_romano[i];
            else 
            num_arabo=num_arabo-numero_romano[i];
        }
        printf("%d\n",num_arabo);
        
        system("PAUSE \n");
        return0;
    
    
    }
    

    ovviamente non parte e quindi sono qui a chiedere aiuto a voi Grazie

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Senza entrare nel merito del tuo algoritmo che non è corretto per calcolare il numero arabo (se la "cifra" in posizione i+1 è minore della "cifra" in posizione i allora somma, altrimenti sottrai... quindi, se io scrivo "II" il valore convertito è 0 visto che sono uguali... il confronto sugli indici non capisco che senso abbia e, comunque, i non viene mai incrementato... e quando raggiungo la fine (cioè mai) controllo comunque la cifra successiva alla fine, che non esiste...), vediamo un po' quel che stai cercando di fare dentro quello switch:

    numero_romano[j] è una locazione in memoria che contiene un carattere... come puoi pretendere (logicamente parlando) di assegnarci (memorizzarci dentro) un numero intero (1, 5, 10, 50, 100, 500, 1000)?


    Ciao.
    Ultima modifica di LeleFT; 19-04-2017 a 16:35
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2017
    Messaggi
    27
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    Senza entrare nel merito del tuo algoritmo che non è corretto per calcolare il numero arabo (se la "cifra" in posizione i+1 è minore della "cifra" in posizione i allora somma, altrimenti sottrai... quindi, se io scrivo "II" il valore convertito è 0 visto che sono uguali... il confronto sugli indici non capisco che senso abbia e, comunque, i non viene mai incrementato... e quando raggiungo la fine (cioè mai) controllo comunque la cifra successiva alla fine, che non esiste...), vediamo un po' quel che stai cercando di fare dentro quello switch:

    numero_romano[j] è una locazione in memoria che contiene un carattere... come puoi pretendere (logicamente parlando) di assegnarci (memorizzarci dentro) un numero intero (1, 5, 10, 50, 100, 500, 1000)?


    Ciao.
    hai assolutamente ragione...direi allora di modificare il codice inserendo una nuova variabile ed inserirla nello switch

    codice:
    switch (cifra_romana) {        case 'I': cifra_romana=1;break;
            case 'V': cifra_romana=5;break;
            case 'X': cifra_romana=10;break;
            case 'L': cifra_romana=50;break;
            case 'C': cifra_romana=100;break;
            case 'D': cifra_romana=500;break;
            case 'M': cifra_romana=1000;break;
    }
    in questo modo.. che dici?
    inoltre nell'algoritmo dovrei modificare il + col meno e dovrei risolvere il tutto, no?

  4. #4
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    E' un esercizio interessante proverò a risolverlo anche io
    Il problema che non ti porta alla soluzione è che l'algoritmo di conversione da numeri romani a numeri decimali è più complesso, diciamo molto più complesso.

    Alcuni suggerimenti
    1 se una numero a sinistra è più piccola di quella di destra va sottratta, se una numero a destra è più piccola di quello di sinistra va sommato.

    2 Ma un numero romano è composto da più cifre, quindi per sommare dovrai considerare almeno due caratteri successivi, esempio MXC , non puoi sommare 1000+10+100 ma dovrai fare 100-10+1000, quindi per la somma devi considerare almeno i due caratteri successivi, visto che in numeri romani si toglie uno a sinistra, esempio 80 LXXX XC 90, 900 CM 800 DCCC , QUINDI ti basta considerare due caratteri successivi, SE IL SECONDO successivo è maggiore esegui una sottrazione, ALTRIMENTI aggiungi semplicemente il suo valore in decimale.
    Tecnologia

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2017
    Messaggi
    27
    Quote Originariamente inviata da torn24 Visualizza il messaggio
    E' un esercizio interessante proverò a risolverlo anche io
    Il problema che non ti porta alla soluzione è che l'algoritmo di conversione da numeri romani a numeri decimali è più complesso, diciamo molto più complesso.

    Alcuni suggerimenti
    1 se una numero a sinistra è più piccola di quella di destra va sottratta, se una numero a destra è più piccola di quello di sinistra va sommato.

    2 Ma un numero romano è composto da più cifre, quindi per sommare dovrai considerare almeno due caratteri successivi, esempio MXC , non puoi sommare 1000+10+100 ma dovrai fare 100-10+1000, quindi per la somma devi considerare almeno i due caratteri successivi, visto che in numeri romani si toglie uno a sinistra, esempio 80 LXXX XC 90, 900 CM 800 DCCC , QUINDI ti basta considerare due caratteri successivi, SE IL SECONDO successivo è maggiore esegui una sottrazione, ALTRIMENTI aggiungi semplicemente il suo valore in decimale.
    bene, scusa se son così ingenuo, quindi una volta considerato il successivo, quindi i++, devo porre che se quest'ultimo è maggiore del precedente sottraggo, sennò sommo? giusto?

  6. #6
    magari conviene andare da dx verso sx. se il numero è minore del precedente sottraggo, se maggiore o uguale aggiungo. Ho fatto una rapida verifica con MCMXLIX e pare ok

  7. #7
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    Ciao

    Ciao, lo scopo dell'esercizio e che tu trovi la soluzione, in realtà l'esercizio non presenta nessun problema di programmazione "usa concetti base del linguaggio C", quindi l'essenza dell'esercizio è che tu trovi un ALGORITMO che risolva il problema.

    Non è prassi fornire codice già pronto, ma io ti voglio fornire la parte del programma che esegue la conversione, visto che dovrai implementare il resto del programma, se non capisci come funziona non puoi scrivere il resto del programma...

    DOVE ConvertiCifra() è una funzione che restituisce un numero intero da carattere romano
    Dove Decimale è un int inizializzato a zero

    codice:
    for (i = 0; NumRomano[i] != 0; ) { // Per tutto il numero romano 
    
    
    
    
                 /*Se la cifra è maggiore o ugguale della sucessiva */
    			if (ConvertiCifra(NumRomano[i]) >= ConvertiCifra(NumRomano[i + 1])) {
    				Decimale += ConvertiCifra(NumRomano[i]);
               /* se il numero+1 è minore di numero+2*/
    				if (NumRomano[i + 2] != '\0' && ConvertiCifra(NumRomano[i + 1]) < ConvertiCifra(NumRomano[i + 2])) {
    					sottrarre = (ConvertiCifra(NumRomano[i + 2]) - ConvertiCifra(NumRomano[i + 1]));
    					Decimale += sottrarre;
    					i += 3;
    				}
    				else {
    					i++;
    				}
    
    
    			} /* se la cifra è minore della sucessiva */
    			else if (ConvertiCifra(NumRomano[i]) < ConvertiCifra(NumRomano[i + 1])) {
    
    
    				Decimale += (ConvertiCifra(NumRomano[i + 1]) - ConvertiCifra(NumRomano[i]));
    				i += 2;
    			}
    		}
    Tecnologia

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2017
    Messaggi
    27
    Quote Originariamente inviata da torn24 Visualizza il messaggio
    Ciao, lo scopo dell'esercizio e che tu trovi la soluzione, in realtà l'esercizio non presenta nessun problema di programmazione "usa concetti base del linguaggio C", quindi l'essenza dell'esercizio è che tu trovi un ALGORITMO che risolva il problema.

    Non è prassi fornire codice già pronto, ma io ti voglio fornire la parte del programma che esegue la conversione, visto che dovrai implementare il resto del programma, se non capisci come funziona non puoi scrivere il resto del programma...

    DOVE ConvertiCifra() è una funzione che restituisce un numero intero da carattere romano
    Dove Decimale è un int inizializzato a zero

    codice:
    for (i = 0; NumRomano[i] != 0; ) { // Per tutto il numero romano 
    
    
    
    
                 /*Se la cifra è maggiore o ugguale della sucessiva */
                if (ConvertiCifra(NumRomano[i]) >= ConvertiCifra(NumRomano[i + 1])) {
                    Decimale += ConvertiCifra(NumRomano[i]);
               /* se il numero+1 è minore di numero+2*/
                    if (NumRomano[i + 2] != '\0' && ConvertiCifra(NumRomano[i + 1]) < ConvertiCifra(NumRomano[i + 2])) {
                        sottrarre = (ConvertiCifra(NumRomano[i + 2]) - ConvertiCifra(NumRomano[i + 1]));
                        Decimale += sottrarre;
                        i += 3;
                    }
                    else {
                        i++;
                    }
    
    
                } /* se la cifra è minore della sucessiva */
                else if (ConvertiCifra(NumRomano[i]) < ConvertiCifra(NumRomano[i + 1])) {
    
    
                    Decimale += (ConvertiCifra(NumRomano[i + 1]) - ConvertiCifra(NumRomano[i]));
                    i += 2;
                }
            }
    Vabene,grazie..Cerco di assemblare il tutto

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    torn24, non credo che quell'algoritmo sia corretto.
    Supponi di avere come input semplicemente "X". Abbiamo NumRomano composto in questo modo: ['X', '\0']
    La tua prima if è verificata (10 > 0), quindi entro... poi mi ritrovo a confrontare NumRomano[i+2] (che non si sa cosa sia, può valere qualunque cosa) con '\0'... direi di no.

    Questo è più semplice (da destra verso sinistra):

    codice:
    int len = strlen(NumRomano);
    Decimale = ConvertiCifra(NumRomano[len-1]);
    for(int i=len-2; i>=0; i--) {
       if (ConvertiCifra(NumRomano[i]) >= ConvertiCifra(NumRomano[i+1])) {
          Decimale += ConvertiCifra(NumRomano[i]);
       } else {
          Decimale -= ConvertiCifra(NumRomano[i]);
       }
    }
    E questo è "equivalente", ma gira al contrario:

    codice:
    int len = strlen(NumRomano);
    Decimale = ConvertiCifra(NumRomano[0]);
    for(int i=1; i<len; i++) {
       if (ConvertiCifra(NumRomano[i]) <= ConvertiCifra(NumRomano[i-1])) {
          Decimale += ConvertiCifra(NumRomano[i]);
       } else {
          Decimale -= ConvertiCifra(NumRomano[i-1]);
          Decimale += (ConvertiCifra(NumRomano[i]) - ConvertiCifra(NumRomano[i-1]));
       }
    }

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  10. #10
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551
    In effetti hai ragione, non tiene conto di un numero romano con un unica cifra.
    Ultima modifica di torn24; 21-04-2017 a 11:42
    Tecnologia

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.