mercoledì 17 giugno 2026

C# convertire un numero romano in numero

Di seguito viene illustrata una tecnica per convertire un numero romano in numero arabo, il tutto nel linguaggio di programmazione C# in un progetto Windows Forms e .NET 10.

Si creano due variabili array a livello di classe di tipo string e int, di seguito il frammento di tale dichiarazione.



C#

private static readonly int[] valori =

     {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};

 private static readonly string[] simboli =

     {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};


Si crea una funzione che converte un numero in numero romano, questa funzione ci permette di verificare la corretta conversione .


C#

public static string ConvertiInNumeriRomano(int numero)

 {

     if (numero < 1 || numero > 2100)

         throw new ArgumentOutOfRangeException(nameof(numero),

             "Il numero deve essere compreso tra 1 e 2100.");

 

     var risultato = string.Empty;

 

     for (int i = 0; i < valori.Length; i++)

     {

         while (numero >= valori[i])

         {

             numero -= valori[i];

             risultato += simboli[i];

         }

     }

 

     return risultato;

 }



Si crea la funzione che utilizzeremo per convertire il numero romano in numero. Di seguito tale frammento di codice.


C#

public static int ConvertiRomanoInNumero(string romano)

 {

     if (string.IsNullOrWhiteSpace(romano))

         throw new ArgumentException("Il numero romano non può essere vuoto.");

 

     romano = romano.ToUpper();

 

     //Associo simboli a numeri

     var mappa = new Dictionary<char, int>

 {

     {'I', 1}, {'V', 5}, {'X', 10}, {'L', 50},

     {'C', 100}, {'D', 500}, {'M', 1000}

 };

 

     int totale = 0;

     int valorePrecedente = 0;

 

     foreach (char c in romano)

     {

         if (!mappa.ContainsKey(c))

             throw new ArgumentException($"Simbolo romano non valido: {c}");

 

         int valore = mappa[c];

 

         //Se il valore attuale è maggiore del precedente, significa sottrazione

         if (valore > valorePrecedente)

         {

             totale += valore - 2 * valorePrecedente;

         }

         else

         {

             totale += valore;

         }

 

         valorePrecedente = valore;

     }

 

     //Valido se la conversine è andata a buon fine, trasformandolo in numero romano

     string ricostruito = ConvertiInNumeriRomano(totale);

     if (ricostruito != romano)

         throw new ArgumentException("Numero romano non valido o formato scorretto.");

 

     return totale;

 }



Ora non resta che scrivere il codice, che dato un valore di un numero romano, lo converte in un numero.

C#

private void BtnConvertRomanoToNumero_Click(object sender, EventArgs e)

 {

     try

     {

 

 

              

         int numero = ConvertiRomanoInNumero(TxtNumeri.Text);

         MessageBox.Show($"Numero convertito: {numero}");

 

 

     }

     catch (ArgumentOutOfRangeException ex)

     {

         MessageBox.Show("Errore:" + ex.Message);

     }

     catch (Exception ex)

     {

         MessageBox.Show("Errore:" + ex.Message);

     }

 }

Nessun commento: