Buscar este blog

viernes, 15 de abril de 2016

Smart-Table Había una Vez.....

Había una Vez.....

Este año 2016 por obligación del trabajo tuve que utilizar la herramienta AngularJS. Ya había escuchado comentarios sobre las bondades de este framework y les soy sincero no me llamaba la atención, hasta que comence a estudiarlo me dí cuenta que me estaba pérdiendo un manjar de google. Por cierto ya me volví adicto a AngularJS. mmmmmmm.... Vamos acabar con estas palabrería de Había una Vez y vamos a lo concreto, les parece bien?.

El tema es smart-table por cierto a todo principiante le recomiendo esta url:

The development of smart-table is sponsored by TropicalDev
http://lorenzofox3.github.io/smart-table-website/#section-intro

El código de una simple tabla en Smart-Table es la siguiente:

Paso 1 Crear modulo en angular y un controlador en un fichero js.

var app = angular.module('myApp', ['smart-table'])

app.controller('basicsCtrl', ['$scope', function (scope) {

    scope.rowCollection = [
        {name: 'Yeiniel Alfonso', birthDate: new Date('1985-06-01')},
        {name: 'Lisandra Polo', birthDate: new Date('1989-01-11')},
        { name: 'Daymaris Alfonso', birthDate: new Date('1992-01-07') },
        { name: 'Ismary de Jesus', birthDate: new Date('1965-08-25')},
        { name: 'Juana Palma', birthDate: new Date('1951-10-11')},
        { name: 'Lazaro Humberto', birthDate: new Date('1987-03-15')}
    ];

    scope.itemsByPage = 3;
}]);

Paso 2 HTML
    
        <div data-ng-app="myApp" data-ng-controller="basicsCtrl">
            < table data-st-table="rowCollection" class="table table-striped">
                <thead>
                    <tr>
                        <th scope="row">#</th>
                        <th scope="row">Name</th>
                        <th>Birth Date</th>
                   </tr>
                   <tr>
                    <td colspan="2"> 
                    <input st-search class="input-sm form-control" placeholder="Search" type="search">
                    </td>
                   </tr>
               </thead>
            <tbody>
            <tr data-ng-repeat="row in rowCollection">
            <td>{{$index+1}}</td>
            <td>{{row.name}}</td>
            <td>{{row.birthDate|date}}</td>
                            </tr>
                        </tbody>
            <tfoot>
            <tr>
            <td colspan="3" class="text-center">
            <div data-st-pagination="" data-st-items-by-page="itemsByPage" data-st-displayed-pages="3"></div>
                                </td>
                            </tr>
                        </tfoot>
                    </table>
            <script src="angular.min.js"></script>
            <script src="smart-table.js"></script>
            <script src="basicsCtrl.js"></script>
                </div>
    
Cuando hacía una búsqueda en google sobre smart-table siempre salían 
artículos con el ejemplo característico de mostrar una información 
en forma tabla. Me habían pédido mostrar contenido dentro
 de thumbnails en bootstrap. Y los hice con Smart-Table:

                <div data-ng-app="myApp" data-ng-controller="basicsCtrl">
                <h2 class="text-center">Smart-Table</h2>
                <div class="container-fluid" data-st-table="rowCollection">
                <div class="row">
                <form class="navbar-form" role="search">
                <input data-st-search class="form-control" placeholder="Search" type="search">
                        </form>
                     </div>
                <br />
                <div class="row">
                <div class="col-sm-6 col-md-4" data-ng-repeat="row in rowCollection">
                <div class="thumbnail2" data-ng-class="{'thumbnail1': $index % 2 == 0}">
                <div class="caption">
                <p class="title"> Card #{{$index+1}}</p>
                <hr />
                <p>Name: {{row.name}} </p>
                <p>birth Date: {{row.birthDate | date}} </p>
                                    </div>
                                </div>
                            </div>
                    
                        </div>
                <div class="row">
                <div class="text-center" data-st-pagination="" data-st-items-by-page="itemsByPage" data-st-displayed-pages="3">
</div> </div> </div>

Espero que les sea de utilidad

Best Regard

Descargar
https://github.com/sitieh2013/ExampleSmartTable.git

jueves, 14 de abril de 2016

Numeración Romana con C Sharp

Anteriormente explicabamos los numeros romanos con JAVA 

(C#) Convertir de números romanos a enteros


    private static int GetNumber(char roman)
    {
        return roman == 'M' ? 1000 :
               roman == 'D' ? 500 :
               roman == 'C' ? 100 :
               roman == 'L' ? 50 :
               roman == 'X' ? 10 :
               roman == 'V' ? 5 :
               roman == 'I' ? 1 : 0;
    }
                            
Es un método que se utiliza en los siguientes ejemplos:

Ejemplo 1

Un ejemplo muy simple. Se utiliza una iteración.
        public static int Number1(string romano)
        {
            var total = 0; var number = 0;
            foreach (var numberActual in romano.Select(GetNumber))
            {
                if (number == 0)
                {
                    number = numberActual;
                    continue;
                }
                if (number < numberActual)
                    number = -number;
                total += number;
                number = numberActual;
            }
            return total + number;
        }
                            

Ejemplo 2

Se utiliza dos iteraciones.
        public static int Number2(string romano)
        {
            var array = new int[romano.Length];
            for (var i = 0; i < romano.Length; i++)
            {
                var n1 = GetNumber(romano[i]);
                
                if (i == 0)
                {
                    array[i] = n1;
                    continue;
                }
                var n0 = array[i - 1];
                if (n0 < n1)
                    array[i - 1] = -n0;
                array[i] = n1;
            }
            return array.Sum();
        }
                            

Ejemplo 3

        public static int Number3(string romano)
        {
            var letter = new List { "M", "D", "C", "L", "X", "V", "I" };
            int[] value = { 1000, 500, 100, 50, 10, 5, 1, 0 };
            romano = romano.ToUpper();
            if (letter.Contains(romano[romano.Length - 1].ToString()) == false)
                return 0;
            var number = value[letter.IndexOf(romano[romano.Length - 1].ToString())];
            if (romano.Length > 1)
                for (var i = romano.Length - 2; i >= 0; i--)
                {
                    if (letter.Contains((romano[i].ToString())))
                    {
                        if (value[letter.IndexOf((romano[i].ToString()))] < value[letter.IndexOf((romano[i + 1].ToString()))])
                            number -= value[letter.IndexOf((romano[i].ToString()))];                 
                        else                                                                                         
                            number += value[letter.IndexOf((romano[i].ToString()))];                   
                    }
                    else
                        return 0;
                }
            return number;
        }
                            

Ejemplo 4

       public static int Number4(string romano)
        {
            var number = 0;
            var back = 0;
            for (var j = romano.Length - 1; j >= 0; j--)
            {
                int compare = GetNumber(romano[j]);
                if (compare < back)
                    number -= compare;
                else
                    number += compare;
                back = compare;
            }
            return number;
        }

(C#) Convertir de números enteros a romanos

 

        private static string GetRomans1(int num)
        {
            switch (num)
            {
                case 1: return "I";
                case 2: return "II";
                case 3: return "III";
                case 4: return "IV";
                case 5: return "V";
                case 6: return "VI";
                case 7: return "VII";
                case 8: return "VIII";
                case 9: return "IX";
                case 10: return "X";
                case 20: return "XX";
                case 30: return "XXX";
                case 40: return "XL";
                case 50: return "L";
                case 60: return "LX";
                case 70: return "LXX";
                case 80: return "LXXX";
                case 90: return "XC";
                case 100: return "C";
                case 200: return "CC";
                case 300: return "CCC";
                case 400: return "CD";
                case 500: return "D";
                case 600: return "DC";
                case 700: return "DCC";
                case 800: return "DCCC";
                case 900: return "CM";
                case 1000: return "M";
                case 2000: return "MM";
                case 3000: return "MMM";
                default: return "";
            }
        }
        private static string GetRomans2(int num)
        {
            switch (num)
            {
                case 1: return "I";
                case 4: return "IV";
                case 5: return "V";
                case 9: return "IX";
                case 10: return "X";
                case 40: return "XL";
                case 50: return "L";
                case 90: return "XC";
                case 100: return "C";
                case 400: return "CD";
                case 500: return "D";
                case 900: return "CM";
                case 1000: return "M";
                default: return "";
            }
        }

        private static int GetMiles(int natural, out int centena, out int decena, out int unidad)
        {
            var miles = natural / 1000;
            var resto = natural % 1000;
            centena = resto / 100;
            resto = resto % 100;
            decena = resto / 10;
            resto = resto % 10;
            unidad = resto;
            return miles;
        }

            

Ejemplo 1

Un ejemplo muy simple. Se utiliza solo iteraciones.
    public static String Roman6(int natural)
    {
        public static string Roman6(int natural)
        {
            var romano = "";
            int[] numbers = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
            foreach (var number in numbers)
            {
                while (natural >= number)
                {
                    romano += GetRomans2(number);
                    natural -= number;
                }
            }
            return romano;
        }
            

Ejemplo 2

Pueden observar que se utiliza las potencias y la recursividad.
        public static string Roman5(int natural)
        {
            return (natural >= 1000
                    ? Roman5(natural, 1000)
                    : (natural >= 100
                        ? Roman5(natural, 100)
                        : (natural >= 10 ? Roman5(natural, 10)
                        : GetRomans1(natural))));
        }
        private static string Roman5(int natural, int potencia)
        {
            var entero = natural / potencia;
            var romano = entero * potencia;
            var resto = natural - romano;
            return GetRomans1(romano) + Roman5(resto);
        }
            

Ejemplo 3

Pueden observar que se utiliza las potencias y una sola iteración.
         public static string Roman4(int natural)
        {
            var romano = "";
            var cadena = natural.ToString(CultureInfo.InvariantCulture);
            for (int i = 0, j = cadena.Length - 1; i < cadena.Length; i++, j--)
            {
                var num = Convert.ToInt32(cadena[i].ToString(CultureInfo.InvariantCulture));
                var potencia = (int)Math.Pow(10, j);
                var valor = num * potencia;
                romano += GetRomans1(valor);
            }
            return romano;
        }
            

Ejemplo 4

        public static string Roman3(int natural)
        {
            var romano = "";
            int[] portencia = {1000, 100, 10, 1};
            foreach (int p in portencia)
            {
                var entero = (natural/p)*p;
                natural -= entero;
                if (entero <= 0) continue;
                romano += GetRomans1(entero);
            }
            return romano;
        }
            

Ejemplo 5

Un ejemplo utilizando solo las unidades de medidas. Muy simple para explicarlo.
    public static String Roman2(int natural)
    {
            string[][] lista =
           {
               new[] {"","M","MM","MMM"},
               new[] {"","C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"},
               new[] {"","X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"},
               new[] {"","I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"}
           };
           int centena;
           int decena;
           int unidad;
           var miles = GetMiles(natural, out centena, out decena, out unidad);
            return lista[0][miles] + lista[1][centena] + lista[2][decena] + lista[3][unidad];
    }
            

Ejemplo 6

Muy simple para explicarlo.
    public static String Roman1(int natural)
    {
           var romano = "";
            int centena;
            int decena;
            int unidad;
            var miles = GetMiles(natural, out centena, out decena, out unidad);
            //Miles
            romano += miles == 1 ? "M" :
                      miles == 2 ? "MM" :
                      miles == 3 ? "MMM" : "";
            //Centena
            romano += centena == 1 ? "C" : 
                      centena == 2 ? "CC":
                      centena == 3 ? "CCC":
                      centena == 4 ? "CD":
                      centena == 5 ? "D":
                      centena == 6 ? "DC":
                      centena == 7 ? "DCC":
                      centena == 8 ? "DCCC":
                      centena == 9 ? "CM" : "";
            //Decena
            romano += decena == 1 ? "X" :
                      decena == 2 ? "XX" :
                      decena == 3 ? "XXX" :
                      decena == 4 ? "XL" :
                      decena == 5 ? "L" :
                      decena == 6 ? "LX" :
                      decena == 7 ? "LXX" :
                      decena == 8 ? "LXXX" :
                      decena == 9 ? "XC" : "";
            //unidad
            romano += unidad == 1 ? "I" :
                      unidad == 2 ? "II" :
                      unidad == 3 ? "III" :
                      unidad == 4 ? "IV" :
                      unidad == 5 ? "V" :
                      unidad == 6 ? "VI" :
                      unidad == 7 ? "VII" :
                      unidad == 8 ? "VIII" :
                      unidad == 9 ? "IX" : "";
            
            return romano;
    }
Descarga 
https://github.com/sitieh2013/numerosromanosCSharp.git

Numeración Romana con Java

CoAutores: Conrado Rodríguez, Omar Guerra y Alejandro Moreno

Los números enteros en la numeración romana se representa de la siguiente forma:
I V X L C D M
1 5 10 50 100 500 1000

Podemos escribir números romanos mayores de cero y menores de 4000. Pueden repetirse hasta tres veces las cifras (I, X, C, M) ejemplo: el número 30 es XXX, si representamos el 40 su escritura sería XL en vez de XXXX.

En la numeración romana, una cifra menor puede estar a la izquierda del mayor. Ejemplo: el número 150 es CXL = 100 - 10 + 50. En este caso la menor se adiciona al mayor.

A continuación se muestran ejemplos en Java de distintas formas de codificar, de números naturales a romanos y viceversa.

(JAVA) Convertir de números romanos a enteros


    private static int GetNumber(char roman)
    {
        return roman == 'M' ? 1000 :
               roman == 'D' ? 500 :
               roman == 'C' ? 100 :
               roman == 'L' ? 50 :
               roman == 'X' ? 10 :
               roman == 'V' ? 5 :
               roman == 'I' ? 1 : 0;
    } 
Es un método que se utiliza en los siguientes ejemplos:

Ejemplo 1

Un ejemplo muy simple. Se utiliza una iteración.

    public static int Number1(String numberRoman)
    {
        int total = 0, number = 0;
        
        for (int i = 0; i < numberRoman.length(); i++) {
            int numberNow = GetNumber(numberRoman.charAt(i));
            
            if (number == 0){
                number = numberNow; continue;}
            if (number < numberNow)
                number = -number;
            total += number;
            number = numberNow;
        }
        return total + number;
    }
                            

Ejemplo 2

Se utiliza dos iteraciones.

    public static int Number2(String numberRoman)
    {
        int[] array = new int[numberRoman.length()];
        for (int i = 0; i < numberRoman.length(); i++)
        {
            int n1 = GetNumber(numberRoman.charAt(i));
                
            if (i == 0){
                array[i] = n1; continue;
            }
            int n0 = array[i - 1];
            if (n0 < n1)
               array[i - 1] = -n0;
            array[i] = n1;
        }
        int total = 0;
        for(int i : array){ total += i;}
        return total;
    }
                            

Ejemplo 3

        public static int Number3(String numberRoman)
        {
            int number = 0;
            int back = 0;
            for (int j = numberRoman.length() - 1; j >= 0; j--)
            {
                int compare = GetNumber(numberRoman.charAt(j));
                if (compare < back)
                    number -= compare;
                else
                    number += compare;
                back = compare;
            }
            return number;
        } 
 

(JAVA) Convertir de números enteros a romanos 

    private static String getRomans1(int number)
    {
        switch (number)
        {
            case 1: return "I";
            case 2: return "II";
            case 3: return "III";
            case 4: return "IV";
            case 5: return "V";
            case 6: return "VI";
            case 7: return "VII";
            case 8: return "VIII";
            case 9: return "IX";
            case 10: return "X";
            case 20: return "XX";
            case 30: return "XXX";
            case 40: return "XL";
            case 50: return "L";
            case 60: return "LX";
            case 70: return "LXX";
            case 80: return "LXXX";
            case 90: return "XC";
            case 100: return "C";
            case 200: return "CC";
            case 300: return "CCC";
            case 400: return "CD";
            case 500: return "D";
            case 600: return "DC";
            case 700: return "DCC";
            case 800: return "DCCC";
            case 900: return "CM";
            case 1000: return "M";
            case 2000: return "MM";
            case 3000: return "MMM";
            default: return "";
        }
    }
    private static String getRomans2(int number)
    {
        switch (number)
        {
            case 1: return "I";
            case 4: return "IV";
            case 5: return "V";
            case 9: return "IX";
            case 10: return "X";
            case 40: return "XL";
            case 50: return "L";
            case 90: return "XC";
            case 100: return "C";
            case 400: return "CD";
            case 500: return "D";
            case 900: return "CM";
            case 1000: return "M";
            default: return "";
        }
    }
            
Pensaron que sería simple. A continuación se muestran ejemplos que utilizan los métodos anteriores getRomans1 y getRomans2

Ejemplo 1

Un ejemplo muy simple. Se utiliza solo iteraciones.
    public static String Roman6(int natural)
    {
        String numberRoman = "";
        
        //Inicializar un arreglo con los números enteros esenciales para convertir a romano
        int[] numbers = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
        
        for (int i = 0; i < numbers.length; i++)
        {
            int number = numbers[i];
            
            //si natural es 2000 y number es 1000
            while (natural >= number)
            {
                //Busca el número romano M y lo concatena a
                //variable numberRoman
                numberRoman += getRomans2(number);
                
                //natural = 2000-1000 = 1000
                natural -= number;
            }
        }
        return numberRoman;
    }
            

Ejemplo 2

Pueden observar que se utiliza las potencias y la recursividad.
    // Se verifica si es un número entero de cuatro, tres, dos o una cifra.
    public static String Roman5(int natural)
    {
        return (natural >= 1000
                ? Roman5(natural, 1000)
                : (natural >= 100
                ? Roman5(natural, 100)
                : (natural >= 10 
                ? Roman5(natural, 10)
                : getRomans1(natural))));
    }
    //Se tranforma a número romano
    private static String Roman5(int natural, int pow)
    {
        // si natural es 150 la variable pow es 100
        // integer = 150/100 = 1
        int integer = natural / pow;
        
        // roman = 1*100 = 100
        int roman = integer * pow;
        // rest = 150 - 100 = 50
        int rest = natural - roman;
        //Recursividad
        // return "C" + Roman5(50)
        return getRomans1(roman) + Roman5(rest);
    }
            

Ejemplo 3

Pueden observar que se utiliza las potencias y una sola iteración.
     public static String Roman4(int natural)
    {
        String numberRoman = "";
        
        //Convertir el número entero a texto
        String textNatural = String.valueOf(natural);
        
        //Recorrer el texto y la variable j sería la potencia.
        // textNatural = 150
        for (int i = 0, j = textNatural.length() - 1; i < textNatural.length(); i++, j--)
        {
            //cuando i=0, num = 1
            int num = Integer.parseInt(String.valueOf(textNatural.charAt(i)));
            
            //cuando i = 0 en este caso j = 2 , potencia = 100
            int potencia = (int)Math.pow(10, j);
            
            // valor = 1*100 = 100
            int valor = num * potencia;
            //adiciona ese valor equivalente a la numeración romana
            //numberRoman = C
            numberRoman += getRomans1(valor);
        }
        
        return numberRoman;
    }
            

Ejemplo 4

Otro ejemplo que se utiliza las potencias y una sola iteración, pero mucho más simple que el ejemplo anterior.
    public static String Roman3(int natural)
    {
        String numberRoman = "";
        
        // una lista de las potencias
        int[] pow = new int[]{1000, 100, 10, 1};
        
        // Recorrer cada una de las potencia
        //natural = 240
        for(int p : pow )
        {
            //Caso que p = 100
            // integer = (140/100)*100 = 200
            int integer = (natural / p) * p;
            
            // natural = 240 - 200 = 40
            natural -= integer;
            //Si integer es menor o igual a cero sigue 
            //con la iteración en caso contrario busca el número romano
            if (integer <= 0) continue;
            numberRoman += getRomans1(integer);
        }
        return numberRoman;
    }
            

Ejemplo 5

Un ejemplo utilizando solo las unidades de medidas. Muy simple para explicarlo.
    public static String Roman2(int natural)
    {
        String[][] list =
        {
            new String[] {"","M","MM","MMM"},
            new String[] {"","C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"},
            new String[] {"","X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"},
            new String[] {"","I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"}
        };
        //thousand
        int unitThousand = natural / 1000;
        int unit = natural % 1000;
       //hundred
        int unitHundred = unit / 100;
        unit = unit % 100;
        //dozen
        int unitDozens = unit / 10;
        unit = unit % 10;
        return list[0][unitThousand] + list[1][unitHundred] + list[2][unitDozens] + list[3][unit];
    }
            

Ejemplo 6

Muy simple para explicarlo.
    public static String Roman1(int natural)
    {
        String numberRoman = "";
        
        //thousand
        int unitThousand = natural / 1000;
        int unit = natural % 1000;
        numberRoman += unitThousand == 1 ? "M" :
                 unitThousand == 2 ? "MM" :
                 unitThousand == 3 ? "MMM" : "";
        
        //hundred
        int unitHundred = unit / 100;
        unit = unit % 100;   
        numberRoman += unitHundred == 1 ? "C" : 
                  unitHundred == 2 ? "CC":
                  unitHundred == 3 ? "CCC":
                  unitHundred == 4 ? "CD":
                  unitHundred == 5 ? "D":
                  unitHundred == 6 ? "DC":
                  unitHundred == 7 ? "DCC":
                  unitHundred == 8 ? "DCCC":
                  unitHundred == 9 ? "CM" : "";
        
        //dozen
        int unitDozens = unit / 10;
        unit = unit % 10;
        numberRoman += unitDozens == 1 ? "X" :
                  unitDozens == 2 ? "XX" :
                  unitDozens == 3 ? "XXX" :
                  unitDozens == 4 ? "XL" :
                  unitDozens == 5 ? "L" :
                  unitDozens == 6 ? "LX" :
                  unitDozens == 7 ? "LXX" :
                  unitDozens == 8 ? "LXXX" :
                  unitDozens == 9 ? "XC" : "";
        
        return numberRoman += unit == 1 ? "I" :
                  unit == 2 ? "II" :
                  unit == 3 ? "III" :
                  unit == 4 ? "IV" :
                  unit == 5 ? "V" :
                  unit == 6 ? "VI" :
                  unit == 7 ? "VII" :
                  unit == 8 ? "VIII" :
                  unit == 9 ? "IX" : "";
    }
            

Ejemplo 7

        public static String Roman7(int natural)
        {
            String[] letter = new String[] { "M", "D", "C", "L", "X", "V", "I" };
            int[] value = { 1000, 500, 100, 50, 10, 5, 1, 0 };
            int meter;
            int rest = natural;
            String roman = "";
            for (int i = 0; i < 7; i++)
            {
                if (rest >= value[i])      
                {                       
                    meter = rest / value[i];  
                    if (rest >= value[i + i % 2] * (4 + (4 * (i % 2) + i % 2)))
                    { 
                        roman += letter[i + (i % 2)] + letter[i - 1]; 
                        rest += i % 2 * (value[i + 1] - value[i]);   
                    }
                    else
                        for (int j = 0; j < meter; j++)  
                            roman += letter[i];
                }
                rest %= value[i];
            }
            return roman;
        }
            

Ejemplo 8

        public static String Roman8(int natural)
        {
            String[] romans = new String[] { "I", "V", "X", "L", "C", "D", "M" };
            String romano = String.valueOf(natural);
            String roman = "";
            int s = 4;
            for (int i = 6; i >= 0; i -= 2)
            {
                if (romano.length() == s)
                {
                    char value = romano.charAt(0);
                    int back = i;
                    switch (value)
                    {
                        case '1': { roman += romans[i]; } break;
                        case '2': { roman += romans[i] + romans[i]; } break;
                        case '3': { roman += romans[i] + romans[i] + romans[i]; } break;
                        case '4': { roman += romans[i] + romans[i + 1]; } break;
                        case '5': { roman += romans[i + 1]; } break;
                        case '6': { roman += romans[i + 1] + romans[back]; } break;
                        case '7': { roman += romans[i + 1] + romans[back] + romans[back]; } break;
                        case '8': { roman += romans[i + 1] + romans[back] + romans[back] + romans[back]; } break;
                        case '9': { roman += romans[i] + romans[i + 2]; } break;
                        default: { roman += ""; } break;
                    }
                   
                    romano = romano.substring(1);
                }
                s--;
            }
            return roman;
        } 
Gracias por dedicarle tiempo al artículo. Aceptamos comentarios y críticas.
 
 Que tenga un buen día.
  YAM
 
Dercarga
https://github.com/sitieh2013/numerosromanosjava.git