04/01/2025 - migliorabile ha scritto:
Consiglio.
Crea DUE funzioni:
- una che converte un numero romano a numero decimale
 - 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.
package edu.avogadro;
import java.util.Scanner;
public class ConversioneRomanoDecimale2 {
    public static void main(String[] args) {
        Scanner lettore = new Scanner(System.in);
        boolean entra = true;
        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")) {
                System.out.println("Programma terminato");
                entra = false;
            } else {
                numeroRomano = numeroRomano.toUpperCase();
                if (!numeroRomano.isEmpty()) {
                    int risultato = convertitoreRomano(numeroRomano);
                    String check = Main.convertiDecimaleARomano(String.valueOf(risultato)).toUpperCase();
                    if (numeroRomano.equals(check)) {
                        System.out.println("Equivalenza decimale del numero romano inserito: " + risultato);
                    } else {
                        System.out.println("Assicurati di inserire lettere valide per la composizione");
                    }
                }
            }
        }
    }
    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;
    }
}
Complimenti ottimo metodo, il migliore penso per questo esercizio, studierò meglio gli automi, sono sincero non l'ho fatto io