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);
}
}
Le opere pubblicate in questo blog sono sotto la licenza Creative Commons. Attribuzione- No commerciale e no derivate.
Nessun commento:
Posta un commento