segunda-feira, 31 de março de 2014

Numeração Romana

Vamos hoje fazer um pequeno programa que converte os números da numeração árabe para a numeração romana.

Segundo a Wikipédia "O sistema de numeração romana (ou números romanos) desenvolveu-se na Roma Antiga e utilizou-se em todo o seu Império."

Uma vez que os romanos não conheciam o 0 (zero) vamos limitar o nosso programa a valores entre 1 e 3999.



Para começar definimos dois vetores:

Dim valores As Integer() = New Integer() {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}
Dim romanos As String() = New String() {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"}

O primeiro tem os valores inteiros que correspondem a determinadas letras que se encontram no segundo.
O segundo vetor contém as letras que são combinadas, ou não, e que permitem representar os valores na numeração romana.

Para fazermos a conversão vamos criar uma função que recebe o valor inteiro árabe e devolve a string com o valor em numeração romana.

Public Function paraRomanos(numero As Integer) As String

Nesta função utilizamos um ciclo que vai percorrer os valores do primeiro vetor e enquanto o valor a converter for maior que o valor existente no vetor subtrai esse valor do valor original, ou seja, começa em 1000 e se o número é superior a 1000 subtrai este valor do original até restar um valor menor que 1000 para passar à segunda posição do vetor.
De cada vez que um valor é subtraído é adicionada a letra ou letras correspondentes a esse valor a uma string onde a numeração romana está a ser construída.

For i = 0 To 12
            Do While numero >= valores(i)
                numero -= valores(i)
                resultado.Append(romanos(i))
            Loop
Next

No final a função devolve a string com a numeração romana.

Return resultado.ToString()

A função completa fica assim:
    Public Function paraRomanos(numero As Integer) As String
        Dim valores As Integer() = New Integer() {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}
        Dim romanos As String() = New String() {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"}
        Dim i As Integer
        Dim resultado As New StringBuilder()

        If numero > 3999 Or numero < 1 Then
            MessageBox.Show("Erro! Deve introduzir valores entre 1 e 3999")
            Return ""
        End If
        For i = 0 To 12
            Do While numero >= valores(i)
                numero -= valores(i)
                resultado.Append(romanos(i))
            Loop
        Next
        Return resultado.ToString()
    End Function

O projeto em Visual Basic pode ser retirado aqui.

Sem comentários:

Enviar um comentário