Foro de Ayuda IntercambiosvirtualeS

Foro de Ayuda IntercambiosvirtualeS (https://www.intercambiosos.org/index.php)
-   Programación (https://www.intercambiosos.org/forumdisplay.php?f=45)
-   -   Numeros enteros a numeros romanos en Visual Studio (https://www.intercambiosos.org/showthread.php?t=20237)

Rekker 09-ago-2011 19:03

Numeros enteros a numeros romanos en Visual Studio
 
Buen dia chicos, como su nombre lo dice necesito hacer un programita que me permita colocar un numero entero y al dar clic a un boton me de el mismo numero, pero en numeros romanos

Ejemplo:
Se introduce por teclado el numero 6
Al dar clic al boton debe mostrar por pantalla el numero 6 en romano VI

Este es el codigo que tengo:
Código PHP:

Public Class Form1

    
Private Sub Form1_Load(ByVal sender As System.ObjectByVal e As System.EventArgsHandles MyBase.Load

    End Sub

    
Private Sub BtnSalir_Click(ByVal sender As System.ObjectByVal e As System.EventArgsHandles BtnSalir.Click
        Me
.Close()
    
End Sub

    
Private Sub BtnConvertir_Click(ByVal sender As System.ObjectByVal e As System.EventArgsHandles BtnConvertir.Click
        
Try
            
Dim numero As Integer
            numero 
TxtNumero.Text


            
If numero 10 Then
                
If numero 1 Then
                    MsgBox
("I")
                Else
                    If 
numero 2 Then
                        MsgBox
("II")
                    Else
                        If 
numero 3 Then
                            MsgBox
("III")
                        Else
                            If 
numero 4 Then
                                MsgBox
("IV")
                            Else
                                If 
numero 5 Then
                                    MsgBox
("V")
                                Else
                                    If 
numero 6 Then
                                        MsgBox
("VI")
                                    Else
                                        If 
numero 7 Then
                                            MsgBox
("VII")
                                        Else
                                            If 
numero 8 Then
                                                MsgBox
("VIII")
                                            Else
                                                If 
numero 9 Then
                                                    MsgBox
("IX")
                                                
End If
                                            
End If
                                        
End If
                                    
End If
                                
End If
                            
End If
                        
End If
                    
End If
                
End If
            ElseIf 
numero >= 10 And numero 20 Then
                
If numero 10 Then
                    MsgBox
("X")
                Else
                    If 
numero <= 11 Then
                        MsgBox
("El numero es mayor a 10 y es muy tedioso seguir programando :S")
                    
End If
                
End If
            
End If
        Catch 
ex As Exception
            MsgBox
("Debe digitar numeros enteros")
        
End Try
    
End Sub

    
Private Sub TxtNumero_TextChanged(ByVal sender As System.ObjectByVal e As System.EventArgsHandles TxtNumero.TextChanged

    End Sub
End 
Class 

Como se daran cuenta no son mas que if's anidados, pero el codigo que tengo unicamente va hasta el numero 10; ya que es muy tedioso tener que hacer cientos de if, por ejemplo que se introduzca el numero 400 :S

Por favor si alguien sabe de un metodo menos tedioso, (en internet encontre que con un switch case, pero la verdad no se como implementarlo :enojado: ) agradezco si me lo puede brindar :si:

PD: Saludos al viejo cristian si en su busqueda llega por aqui xD

baduser 09-ago-2011 19:20

Yo creo que para eso necesitas hacer una tabla en una base de datos con una columna con numero cardinal y otra columna con numero romano, y con programacion extraes la informacion.

mira estos links, es lo que necesitas:

http://www.vivir.com/vivir/universid...numromanos.htm

http://www.misosguar.com.ar/romanos/

http://www.mscperu.org/utiles/utilidades/num_roman.htm

salu2

wlsnch 10-ago-2011 04:00



CONVERTIR DE NÚMEROS ENTERO A NÚMEROS ROMANOS

En este caso vamos a convertir números romanos del 1 al 3999. Utilizamos este rango porque es más fácil de entenderlo, ya que de 4000 en adelante se coloca una línea horizontal por encima del número, para indicar que la base de la multiplicación es por 1.000. Esto no lo vamos a hacer para no crear demasiada confusión.



Los romanos no utilizaban el cero, ya que su defición era que los números era algo que se podía contar pero el cero no se puede contar.


Para no extendernos muchos repasas este link que te explica la teoría de los números romanos link wiki: http://es.wikipedia.org/wiki/Numeraci%C3%B3n_romana

Vamos al grano.

La idea es crear una matriz o array:


Entero ------>Romano----->Indice
1000--------> M---------->0
900--------> CM---------->1
500---------> D---------->2
400---------> CD---------->3
100---------> C---------->4
90----------> XC---------->5
50----------> L---------->6
40----------> XL---------->7
10----------> X---------->8
9----------> IX---------->9
5----------> V---------->10
4----------> IV---------->11
1----------> I----------->12


Crearemos matriz unidimensional de 13 elementos para los enteros
Dim Entero() As Integer = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}
matriz unidimensional de 13 elementos para los simbolos romanos
Dim Romano() As String = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"}
En indice nos indica que los arreglos comienza a partir del cero en adelante.

En el form tenemos un textbox, lo que escribamos dentro son texto para convertirlo a numero entero utilizaremos la función Val.
numero = Val(TxtNumero.Text)
Como queremos en ese mismo textbox convertir a numero enteros entonce, limpiamos el contenido, no te olvides que el valor ya está guardado en la variable número.

En esta línea verifica si se cumple la condición.

If ((numero >= 1) And (numero < 4000)) Then



En esta parte del codigo:

Código PHP:

  While (numero 0)
                    While (
numero >= Entero(indice))
                        
TxtNumero.Text TxtNumero.Text Romano(indice)
                        
numero numero Entero(indice)
                    
End While
                    
indice indice 1
              End 
While 

Para entenderlo pongamos un número que es 152:

152>=Entero(0) 152>=1000 NO entonces indice=0+1
152>= Entero(1) 152>=900 NO entonces indice=1+1
152>= Entero(2) 152>=500 NO entonces indice=2+1
152>=Entero(3) 152>=400 NO entonces indice=3+1
152>=Entero(4) 152>=100 SI entonces TxtNumero.Text=””+ ”C” numero=152-100 indice=4+1
52>= Entero(5) 52>=90 NO entonces indice=5+1
52>=Entero(6) 52>=50 SI entonces TxtNumero.Text=”C”+ ”L” numero=52-50 indice=6+1
2>=Entero(7) 2>=40 NO entonces indice=7+1
2>=Entero(8) 2>=10 NO entonces indice=8+1
2>=Entero(9) 2>=9 NO entonces indice=9+1
2>=Entero(10) 2>=5 NO entonces indice=10+1
2>=Entero(11) 2>=4 NO entonces indice=11+1
2>=Entero(12) 2>=1 SI TxtNumero.Text=”CL”+ ”I” numero=2-1
1>=Entero(12) 1>=1 SI TxtNumero.Text=”CLI”+ ”I” numero=1-1

Y finalmente se sale del bucle porque while(numero>0) While(0>0) entonces no cumple la condición y finalmente la variable TxtNumero.Text=”CLII”

En el siguiente está el código completo, no puse comentario para no confundirte. Solamente copia el código y pégalo en tu actual proyecto, ya que los nombres de las variables y los objetos, me base en el código que pusiste en tu mensaje.

Código PHP:

Public Class Form1

    
Private Sub Form1_Load(ByVal sender As System.ObjectByVal e As System.EventArgsHandles MyBase.Load
    End Sub

    
Private Sub BtnSalir_Click(ByVal sender As System.ObjectByVal e As System.EventArgsHandles BtnSalir.Click
        Me
.Close()
    
End Sub

    
Private Sub BtnConvertir_Click(ByVal sender As System.ObjectByVal e As System.EventArgsHandles BtnConvertir.Click
        
Try
            
Dim numeroindice As Integer
            Dim Entero
() As Integer = {1000900500400100905040109541}
            
Dim Romano() As String = {"M""CM""D""CD""C""XC""L""XL""X""IX""V""IV""I"}
            
numero Val(TxtNumero.Text)
            
indice 0
            TxtNumero
.Text ""
            
If ((numero >= 1) And (numero 4000)) Then
                
While (numero 0)
                    While (
numero >= Entero(indice))
                        
TxtNumero.Text TxtNumero.Text Romano(indice)
                        
numero numero Entero(indice)
                    
End While
                    
indice indice 1
                End 
While
            Else
                
MsgBox("Debe digitar numeros enteros de 1 al 3999")
            
End If
        Catch 
ex As Exception
            MsgBox
("Debe digitar numeros enteros")
        
End Try
    
End Sub
End 
Class 

Generando el ejecutable:

http://i.imgur.com/Wo83Q.jpg http://i.imgur.com/viDT9.jpg

NOTA: La etiqueta dice PHP, pero es código de visual Basic .net, ya que no hay etiqueta de Visual Studio.

Mil disculpas si hay errores, es que en mi país ahorita son la 3 de la madrugada, espero haberte ayudado.

Saludos,

carmen10 10-ago-2011 04:05

Gracias por compartir

Saludos

Rekker 10-ago-2011 14:33

Muchisimas gracias amigo wlsnch, efectivamente funciona, solo quiero preguntarte algo mas.
Dices:
En el form tenemos un textbox, lo que escribamos dentro son texto para convertirlo a numero entero utilizaremos la función Val.

numero = Val(TxtNumero.Text)


La funcion Val hace lo mismo que la funcion CInt? (Convertir a Integer) es decir colocar:
numero = Val(TxtNumero.Text) es igual a colocar numero = CInt(TxtNumero.Text)
La probre y el resultado es el mismo, solo quiero saber si las funciones Val y CInt son iguales.
Nuevamente muchas gracias :sonrisa:

Edito
Para las personas que no entendieron muy bien la explicacion, dejo una detallada paso a paso para entenderlo mejor, obviamente sin desmeritar TODO el trabajo del amigo wlsnch
http://i53.tinypic.com/2m28c3p.jpg

wlsnch 10-ago-2011 16:44



Hola Rekker:

Muchas gracias por la edición con más detalle en la explicación. Gracias


Me alegro que te haya funcionado.

La diferencia entre la función Val y la Cint.


Val(cadena) es una función que devuelve los números que se encuentra en una cadena, reconoce los signos de puntuación. Estos números convertidos pueden ser de Integer o Double.

Cint(cadena) es un función que redondea al número más cercano. Por lo tanto acepta Integer o Double.

http://i.imgur.com/tzwkL.png

Código PHP:

Public Class Form1
    
Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgsHandles Button1.Click
        Label3
.Text Val(TextBox1.Text)
        
Label4.Text CInt(TextBox2.Text)
    
End Sub
End 
Class 

Como podemos observar en el gráfico el Val("36.5"), esta función devolvio un Double que es 36.5, mientras que CInt("36.5") lo convirtió a un Integer pero con redondeo.

¿Qué pasaría si el usuario ingresa en vez de número un texto?

En el caso del Cint("Hola") generaría un error que hay que controlarlo. Igual error produciría si Cint("") estuviera vacio.


En el caso de Val("Hola") o Val("") la función val devuelve el valor de cero. El programador puede utilizar este valor para indicar que el usuario no ingreso ningún número.

http://i.imgur.com/fIsEt.jpg http://i.imgur.com/jvvYJ.jpg


Código PHP:

Public Class Form1
    
Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgsHandles Button1.Click
        Label3
.Text Val(TextBox1.Text)
    
End Sub
End 
Class 


Pero con el val("3Hola25") devuelve 3, la razón principal es que primero lee de izquierda a derecha busca un numero y en el momento de llegar a la letra 'H´y como no es número se detiene la conversión.



Como habrás visto , puedes usar el CInt pero no te olvides que controlar lo que ingrese el usuario en el textbox, ya que si ingresa texto generaría un error.


Saludos




wlsnch 10-ago-2011 17:03

Hola Rekker:

Muchas gracias por la edición para entender los while, así creo lo van a entender todo el mundo. Gracias.


Si vas a usar el Cint, hay que controlar los errores, usas la instrucción Try...Catch...End Try

Aquí te muestro el código


Código PHP:

Public Class Form1
    
Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgsHandles Button1.Click
        
Try
            
Label1.Text CInt(TextBox1.Text)
        Catch 
ex As Exception
            MsgBox
("Se ha producido el siguiente error: " ex.Message_
                       MsgBoxStyle
.Critical MsgBoxStyle.OkOnly)
            
MsgBox("Debe digitar numeros enteros")
        
End Try
    
End Sub
End 
Class 


http://i.imgur.com/dNc9f.jpg

Saludos,

Rekker 10-ago-2011 18:01

Muchas gracias por tu aclaracion, ahora entiendo la diferencia entre una funcion y la otra.
Por otro lado lo del Try catch lo habia implementado, solo que emplee la forma que conozco del MessageBox

Código PHP:

MessageBox.Show("Unicamente se permiten valores de tipo entero""Error"MessageBoxButtons.OKMessageBoxIcon.Error

http://i51.tinypic.com/27zkv3n.jpg

Nuevamente MUCHAS GRACIAS.

PD: Pueden cerrar el tema
:sonrojado:

gandre 04-jun-2017 15:52

si quisiera hacer un algortimo al reves??? pasar de romanos a enteros??? no se si podras darme una mano.. saludos


La franja horaria es GMT -4. Ahora son las 02:51.

Desarrollado por: vBulletin® Versión 3.8.1
Derechos de Autor ©2000 - 2025, Jelsoft Enterprises Ltd.

Ad Management by RedTyger