Programma java

di il
18 risposte

Programma java

Buonasera, sono un principiante, la mia domanda è un pò vaga e prima di informazione però provo comunque a esporvi il mio problema

Devo gestire gli errori espliciti e non che posso verificarsi, esempio V L D non si posso inserire più di una volta 

Qualcuno a idee su come posso gestire gli errori che si posso presentare? 

Grazie!


import java.util.Scanner;
public class ConversioneRomanoDecimale {
    public static void main(String[] args) {
        Scanner lettore = new Scanner(System.in);
        final int ZERO = 0;
        final int UNO = 1;
        final int CINQUE = 5;
        final int DIECI = 10;
        final int CINQUANTA = 50;
        final int CENTO = 100;
        final int CINQUECENTO = 500;
        final int MILLE = 1000;
        int valorePrecedente = 0;
        int valoreDecimale = 0;
        int risultato = 0;
        boolean entra = true;

        System.out.println("Digita_finitum est_");

        while (entra) {
            System.out.print("Inserisci il numero romano da convertire: ");
            String numeroRomano = lettore.nextLine();
            if (numeroRomano.equalsIgnoreCase("finitum est")){
                entra = false;
            } else {
                numeroRomano = numeroRomano.toUpperCase();
                for (int i = ZERO ; i < numeroRomano.length(); i++) {
                    char digit = numeroRomano.charAt(i);
                    if (digit == 'I'){
                        valoreDecimale = UNO;
                    } else if (digit == 'V'){
                        valoreDecimale = CINQUE;
                    } else if (digit == 'X'){
                        valoreDecimale = DIECI;
                    } else if (digit == 'L'){
                        valoreDecimale = CINQUANTA;
                    }else if (digit == 'C'){
                        valoreDecimale = CENTO;
                    }else if (digit == 'D'){
                        valoreDecimale = CINQUECENTO;
                    } else if (digit == 'M'){
                        valoreDecimale = MILLE;
                    }
                    if (valorePrecedente < valoreDecimale){
                        risultato = risultato - valorePrecedente;
                        risultato = risultato + (valoreDecimale - valorePrecedente);
                    } else {
                        risultato = risultato + valoreDecimale;
                    }
                    valorePrecedente = valoreDecimale;
                }
                System.out.println("Equivalenza decimale del numero romano inserito: " + risultato);
                risultato = ZERO;   // Azzeramento output
            }
        }
    }
}

18 Risposte

  • Re: Programma java

    03/01/2025 - Panda96 ha scritto:

    Devo gestire gli errori espliciti e non che posso verificarsi, esempio V L D non si posso inserire più di una volta 

    Non solo devi gestire i casi in cui un simbolo non si deve ripetere ma in generale devi gestire correttamente la logica dei numeri romani. Per 1, 2 e 3 si usa "I", "II" e "III" ma il quattro NON si scrive con 4 "I" ma bensì "IV". (tutta la spiegazione sulle regole la trovi su Wikipedia ;) )

    Insomma, devi implementare una (piccola) "macchina a stati" che verifica ciascun carattere ma si "ricorda" lo stato precedente in modo da fare le dovute logiche. Nella pratica, vuol dire che quella catena di if che hai scritto di fatto non "basta" e serve molto di più, almeno 3/4 volte di più di quello che hai scritto.

    Un'altra cosa che si può consigliarti è di separare la logica di conversione da tutta la parte di input/output da/verso l'utente. In pratica, dovresti fare un metodo, es.:

    public static int conversioneDaRomano(String stringa) {
        ............
    }

    E qui dentro ci metti solo la logica di conversione, senza preoccuparti qui di Scanner, nextLine, print, ecc... che invece vanno gestiti altrove più "a monte".

  • Re: Programma java

    Ti ringrazio, abbiamo ora iniziato a vedere i metodi, sto freguentando la scuola serale, studierò un pò per provare a implementare il tuo consiglio che mi sembra molto utile e funzionale. 

    Grazie ;) 

  • Re: Programma java

    Attenzione che i romani non conoscevano lo zero...

  • Re: Programma java

    Consiglio.
    Crea DUE funzioni:

    1. una che converte un numero romano a numero decimale
    2. una che converte un numero decimale a numero romano

    .

    Doppio lavoro? SI
    Doppia probabilita' di fare errori? SI

    MA ti serve per controllare SE le conversioni sono giuste:   

    MMXXV -> 2025 -> MMXXV
    4999 -> MMMMCMXCIX -> 4999


    E dimostri di non essere un "semplice" "pigiatasti" :-)

    Un metodo "semplice", una volta capito come funziona, NON E' quello di scrivere tonnellate di codice e di IF, MA quello di usare un "automa a stati finiti".
    (Ci saranno sempre tonnellate di iF, MA con una STRUTTURA ben definita :-) )
    Niente di "trascendentale" MA serve usare qualche neurone in piu.

    https://it.wikipedia.org/wiki/Automa_a_stati_finiti

    SEMBRA complicato, ma, accendendo i suddetti neuroni in piu', e' "facile".
    Tra l'altro, usando l'automa, hai praticamente "A GRATIS" la gestione degli errori :-)

    Nota: Mathematica converte zero in "N" :-)

    .

    Diciamo che DEVI potre convertire TUTTI i numeri interi da 0 (zero) a 4999.
    Per numeri >= 5000 servono dei simboli "dedicati". 
    Fondamentalmente I,V,X,L,C,D,M con delle "barrette" sopra: una fino a un milione, due fino a un milirado, 3 fino a mille miliardi, ecc.

  • Re: Programma java

    03/01/2025 - sihsandrea ha scritto:

    Attenzione che i romani non conoscevano lo zero...

    Ottima osservazione.. 

    Grazie 

  • Re: Programma java

    04/01/2025 - migliorabile ha scritto:

    Consiglio.
    Crea DUE funzioni:

    1. una che converte un numero romano a numero decimale
    2. una che converte un numero decimale a numero romano

    .

    Doppio lavoro? SI
    Doppia probabilita' di fare errori? SI

    MA ti serve per controllare SE le conversioni sono giuste:   

    MMXXV -> 2025 -> MMXXV
    4999 -> MMMMCMXCIX -> 4999


    E dimostri di non essere un "semplice" "pigiatasti" :-)

    Un metodo "semplice", una volta capito come funziona, NON E' quello di scrivere tonnellate di codice e di IF, MA quello di usare un "automa a stati finiti".
    (Ci saranno sempre tonnellate di iF, MA con una STRUTTURA ben definita :-) )
    Niente di "trascendentale" MA serve usare qualche neurone in piu.

    https://it.wikipedia.org/wiki/Automa_a_stati_finiti

    SEMBRA complicato, ma, accendendo i suddetti neuroni in piu', e' "facile".
    Tra l'altro, usando l'automa, hai praticamente "A GRATIS" la gestione degli errori :-)

    Nota: Mathematica converte zero in "N" :-)

    .

    Diciamo che DEVI potre convertire TUTTI i numeri interi da 0 (zero) a 4999.
    Per numeri >= 5000 servono dei simboli "dedicati". 
    Fondamentalmente I,V,X,L,C,D,M con delle "barrette" sopra: una fino a un milione, due fino a un milirado, 3 fino a mille miliardi, ecc.

    Prima di questo ho fatto l'inverso da decimale a romano ho già l'algoritmo potrei vedere di riuscire  a fare qualcosa ti ringrazio!

  • Re: Programma java

    I numeri romani vanno da 1 a 3999

    4000 è iIV con il periodico sopra che indica le migliaia e il ciclo si ripete

    Barra a dx e sx e sopra moltiplica per 1.000.000

    Dopoia barra sopra per 1.000.000.000

    3999 si scompone con 

    3.000+900+90+9

  • Re: Programma java

    Aggiornamento, sono riuscito a gestire l'input in modo che l'utente inserisca solo caratteri conformi per la composizione, ora , mi resta da esaminare gli altri casi es 

    IIII i numeri non si posso ripetere per piu di tre volte 

    IC 

    IL

    XD

    idee?? Devo consegnare l'esercizio entro stasera :/ 

    Grazie a tutti  

    import java.util.Scanner;

    public class ConversioneRomanoDecimale {

        public static void main(String[] args) {
            Scanner lettore = new Scanner(System.in);
            boolean entra = true;
            char digit = 0;
            System.out.println("Digita _finitum est_ per terminare il programma");

            while (entra) {
                System.out.print("Inserisci il numero romano da convertire: ");
                String numeroRomano = lettore.nextLine();

                if (numeroRomano.equalsIgnoreCase("finitum est")) {
                    entra = false;
                } else {
                    numeroRomano = numeroRomano.toUpperCase();
                    for (int i = 0; i < numeroRomano.length(); i++) {
                        if (!(numeroRomano.charAt(i) == 'I' || numeroRomano.charAt(i) == 'V' || numeroRomano.charAt(i) == 'X' || numeroRomano.charAt(i) == 'L' || numeroRomano.charAt(i) == 'C' || numeroRomano.charAt(i) == 'D' || numeroRomano.charAt(i) == 'M')) {
                            System.err.println("Errore: Inserisci solo caratteri validi per la composizione");
                            digit = numeroRomano.charAt(i);
                        }
                    }

                    int risultato = convertitoreRomano(numeroRomano);

                    System.out.println("Equivalenza decimale del numero romano inserito: " + risultato);
                }
            }
        }




        static int convertitoreRomano(String numeroRomano) {
            final int ZERO = 0;
            final int UNO = 1;
            final int CINQUE = 5;
            final int DIECI = 10;
            final int CINQUANTA = 50;
            final int CENTO = 100;
            final int CINQUECENTO = 500;
            final int MILLE = 1000;
            char digit;
            int valorePrecedente = 0;
            int valoreDecimale = 0;
            int risultato = 0;

            for (int i = ZERO; i < numeroRomano.length(); i++) {
                digit = numeroRomano.charAt(i);

                if (digit == 'I') {
                    valoreDecimale = UNO;
                } else if (digit == 'V') {
                    valoreDecimale = CINQUE;
                } else if (digit == 'X') {
                    valoreDecimale = DIECI;
                } else if (digit == 'L') {
                    valoreDecimale = CINQUANTA;
                } else if (digit == 'C') {
                    valoreDecimale = CENTO;
                } else if (digit == 'D') {
                    valoreDecimale = CINQUECENTO;
                } else if (digit == 'M') {
                    valoreDecimale = MILLE;
                }

                if (valorePrecedente < valoreDecimale) {
                    risultato = risultato - valorePrecedente;
                    risultato = risultato + (valoreDecimale - valorePrecedente);
                } else {
                    risultato = risultato + valoreDecimale;
                }

                valorePrecedente = valoreDecimale;
            }

            return risultato;
        }
    }

  • Re: Programma java

    04/01/2025 - migliorabile ha scritto:

    Consiglio.
    Crea DUE funzioni:

    1. una che converte un numero romano a numero decimale
    2. una che converte un numero decimale a numero romano

    .

    Doppio lavoro? SI
    Doppia probabilita' di fare errori? SI

    MA ti serve per controllare SE le conversioni sono giuste:   

    MMXXV -> 2025 -> MMXXV
    4999 -> MMMMCMXCIX -> 4999


    E dimostri di non essere un "semplice" "pigiatasti" :-)

    Un metodo "semplice", una volta capito come funziona, NON E' quello di scrivere tonnellate di codice e di IF, MA quello di usare un "automa a stati finiti".
    (Ci saranno sempre tonnellate di iF, MA con una STRUTTURA ben definita :-) )
    Niente di "trascendentale" MA serve usare qualche neurone in piu.

    https://it.wikipedia.org/wiki/Automa_a_stati_finiti

    SEMBRA complicato, ma, accendendo i suddetti neuroni in piu', e' "facile".
    Tra l'altro, usando l'automa, hai praticamente "A GRATIS" la gestione degli errori :-)

    Nota: Mathematica converte zero in "N" :-)

    .

    Diciamo che DEVI potre convertire TUTTI i numeri interi da 0 (zero) a 4999.
    Per numeri >= 5000 servono dei simboli "dedicati". 
    Fondamentalmente I,V,X,L,C,D,M con delle "barrette" sopra: una fino a un milione, due fino a un milirado, 3 fino a mille miliardi, ecc.

    Scusa se non sto seguendo il tuo consiglio, ho provato a dare una lettura a quello che mi hai consigliato di fare e devo dire che è davvero complicato, il che non si significha che in futuro non approfondirò l'argomento ti ringrazio ancora ;) 

  • Re: Programma java

    04/01/2025 - sihsandrea ha scritto:

    I numeri romani vanno da 1 a 3999

    4000 è iIV con il periodico sopra che indica le migliaia e il ciclo si ripete

    Barra a dx e sx e sopra moltiplica per 1.000.000

    Dopoia barra sopra per 1.000.000.000

    3999 si scompone con 

    3.000+900+90+9

    A quanto sembra, per il 4 ci sono diverse possibilita' in base al periodo storico.

    https://it.wikipedia.org/wiki/Sistema_di_numerazione_romano

  • Re: Programma java

    04/01/2025 - migliorabile ha scritto:

    04/01/2025 - sihsandrea ha scritto:

    I numeri romani vanno da 1 a 3999

    4000 è iIV con il periodico sopra che indica le migliaia e il ciclo si ripete

    Barra a dx e sx e sopra moltiplica per 1.000.000

    Dopoia barra sopra per 1.000.000.000

    3999 si scompone con 

    3.000+900+90+9

    A quanto sembra, per il 4 ci sono 2 possibilita' in base al periodo storico.
    Per esempio

    https://it.wikipedia.org/wiki/Sistema_di_numerazione_romano

    Esatto infatti pensavo di mettere un dominio di validità sull'input per non complicarmi la vita, però 

    più penso al metodo che hai citato prima e più mi incurioscisce, più che altro riesco veramente  a gestire gli errori 

    come posso fare puoi darmi qualche informazione in più io ho già un algortimo che converte numeri decimali in romani pero come posso passare un dato da un metodo a un altro? scusa la mia ignoranza e la mia poca capacità di dare informazioni, sono solo pochi mesi che studio informatica.. 

    la mia richiesta è puoi darmi una mano nel farlo? lo so che ti chiedo molto :/ 

  • Re: Programma java

    Forse qui ti viene l'ispirazione...

    https://www.youmath.it/lezioni/algebra-elementare/lezioni-di-algebra-e-aritmetica-per-scuole-medie/1609-numeri-romani.html

    Scomponi il numero e trova il corrispondente nella tabella (array)

    Le chiavi sono 

    Unità: I, V

    Decine: X, L

    Centinaia: C, D

    Migliaia fino a 3.000 M

    Controlli se <4000

    Se tra 4k e 3.999.999 metti la linea alla prima cifra (non ci sarà M) 

    Es. 4.000 =IV con la linea

    5.000 V con linea

    ....

    IX con linea 9.000

    10.000 xcon linea

    In pratica dividi per 1000 e rifai tutto con la linea finita quella ripeti per i valori da 3.999 a 1

    La versione inversa da romano a arabo devi leggere i singoli caratteri e dove la logica si ferma (I max 3 oppure IV cioè dopo I mi aspetto o due I o una V) come da regole del link.

  • Re: Programma java

    Osserva che i numeri vanno a 5 a 5 (i romani contavano con le mani

    Trovata l'unità verifichi se minore di 5 o di 9 i, ii, iii, iv, vi, vii, viii altrimenti li prendi dall' array alle loro posizioni (vedi tabella)

    La decina se minore di 50 e così via...

    Poi se hai fretta, carichi in un array le unità da 1 a 9

    Le decine da 10 a 90

    Le centinaia da 100 a 900

    E le migliaia da 1.000 a 9.000

    Poi il ciclo va moltiplicato per 1000 e si ripete facendo attenzione alle migliaia da 4 a 9 sempre prese da array o tabella

  • Re: Programma java

    04/01/2025 - sihsandrea ha scritto:

    Osserva che i numeri vanno a 5 a 5 (i romani contavano con le mani

    Trovata l'unità verifichi se minore di 5 o di 9 i, ii, iii, iv, vi, vii, viii altrimenti li prendi dall' array alle loro posizioni (vedi tabella)

    La decina se minore di 50 e così via...

    Poi se hai fretta, carichi in un array le unità da 1 a 9

    Le decine da 10 a 90

    Le centinaia da 100 a 900

    E le migliaia da 1.000 a 9.000

    Poi il ciclo va moltiplicato per 1000 e si ripete facendo attenzione alle migliaia da 4 a 9 sempre prese da array o tabella

    Ti ringrazio per il consiglio, pero non posso utilizzare ancora gli arrey perchè non li abbiamo ancora visti :/ 

Devi accedere o registrarti per scrivere nel forum
18 risposte