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