Visual Basic - No consigo el error en esta rutina

Life is soft - evento anual de software empresarial
 
Vista:

No consigo el error en esta rutina

Publicado por ricardo (2 intervenciones) el 10/07/2009 04:54:24
Saludos.

Estoy haciendo una rutina para pasar de Binario a decimal y a mi parecer esta bien planteada pero no me da el resultado que deberia.

Aqui les dejo la rutina a ver si usteds ven el error.

Private Sub Optdec_Click()
numbin = CStr(Text1.Text)
nbits = Len(numbin)

For i = 1 To nbits + 1
aux1 = Mid(numbin, i)
If aux1 = "1" Then
numdec = numdec + 2 ^ (i - 1)
End If
Next
Text1.Text = numdec
End Sub

Sin más me despido dando gracias de antemano por su colaboracion.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:No consigo el error en esta rutina

Publicado por mauricio (3 intervenciones) el 10/07/2009 09:20:53
Te soy sincero, vi tu programa y como no entiendo bien los datos, me lié intentando resolver tu problema, pero recurri a los arreglos, espero te sirva y lo puedas acondicionar a tus necesidades, si necesitas agregar el cero como parte de la numeración solo quita lo que dice suma = 1,

si tienes problemas me avisas y le damos una checada. no te doy el correo por que entonces que caso tiene el foro ¿verdad?

Private Sub Optdec_Click()
DoEvents

Dim nbits As Integer
Dim datos1 As Variant
Dim suma As Long '(para valores menores a 16 bits, para mayores intenta con long,
'double etc.
suma = 1
datos1 = Array(12)
' hasta el momento solo se ha declarado el arreglo, pero como
' el valor binario puede ser de 1 bit hasta x bits falta redimensionar
' el arreglo para el tamaño adecuado
nbits = Len(Text1.Text)
ReDim datos1(nbits)
Text1.Text = StrReverse(Text1.Text) 'esto inverte los valores (para evitarnos trabajo)
'ya que de otra forma si ponemos 10000000 (osea 128), nos diria que tenemos 1,cosa que
'no queremos, quita esta sentencia y ve lo que pasa, tambien abajo la uso para regresar
'al valor original
'Listo! se ha redimensionado ahora sí tiene el valor de los bits
'que tiene nuestra casilla de texto, pero ahora llenemos el arreglo

For c = 0 To nbits - 1
datos1(c) = CInt(Mid(Text1.Text, c + 1, 1))
Debug.Print datos1(c)
If datos1(c) = 1 Then
suma = (2 ^ c) + suma
End If
Text2.Text = suma
'aqui ya se tienen los valores en la matriz
Debug.Print suma 'esta linea como ya has de saber (si no lo sabes te digo)
'solo es para hacer pruebas de escritorio por decirlo así
Next
Text1.Text = StrReverse(Text1.Text) 'regresa el valor a su estado original
End Sub



Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:No consigo el error en esta rutina

Publicado por Antoni Masana (79 intervenciones) el 10/07/2009 12:00:31
Esta es tu rutina corregida

Private Sub Boton_Click()
numbin = CStr(Text1.Text)
nbits = Len(numbin)
Pos = nbits <-------------------------------------------- ( A )
For i = 1 To nbits <------------------------------------- ( B )
aux1 = Mid(numbin, Pos, 1): Pos = Pos - 1 <----- ( C )
If aux1 = "1" Then
numdec = numdec + 2 ^ (i - 1)
End If
Next
Text1.Text = numdec
End Sub

Te explico los cambios que he realizado:

A.- Utilizo una variable para recorrer la tabla de elementos de derecha a izquierda
B.- Le quito el +1 al FOR por que solo debes tratar los digitos introduciros
C.- Al MID le pongo el parametro 1 para que tome los digitos uno a uno y voy restando 1 al puntero de la opcion A.

Tomemos un ejemplo para ver como funciona. Tenemos el input : 1 1 0 1

Lo describo por ciclos del FOR como si fuese un DEBUG

1.- Pos=4 : I=1 : aux1=1 : numdec = 0 + 2 ^ 0 --> 1
2.- Pos=3 : I=2 : aux1=0
3.- Pos=2 : I=3 : aux1=1 : numdec = 1 + 2 ^ 2 --> 1 + 4 --> 5
4.- Pos=1 : I=4 : aux1=1 : numdec = 5 + 2 ^ 3 --> 5 + 8 --> 13

Resultado: 13

Esta rutina se puede hacer de muchas formas, por ejemplo sin el IF y con un solo puntero y con menos variables pero eso es otro problema.

Saludos desde Barcelona, España.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:No consigo el error en esta rutina

Publicado por Ricardo (2 intervenciones) el 10/07/2009 16:48:13
Gracias por su ayuda ya puede solucionar mi problema.

Me gustaria saber como puedo hacer que esa rutina pase a ser una función.

Y donde colocaria el codigo en caso de que fuera una funcion.

Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:No consigo el error en esta rutina

Publicado por Antoni Masana (79 intervenciones) el 11/07/2009 18:24:09
CambiA estas cuatro lineas

Private Sub Boton_Click()
numbin = CStr(Text1.Text)
. . .
Text1.Text = numdec
End Sub

Por esto

Private Funtion Bin_Dec(Valor as string)
numbin=Valor
. . .
Bin_Dec = numdec
End Function

La funcion puede ser privada o publica depende del ambito que desees que se vea.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar