Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Chequeo de parentesis

Estas en el tema de Chequeo de parentesis en el foro de Visual Basic clásico en Foros del Web. Hola estoy realizando una parte de un programa de vb6 que permite ingresar formulas personalizadas pero basicas + - * /. Estas incluyen operaciones combinadas ...
  #1 (permalink)  
Antiguo 18/05/2010, 07:55
 
Fecha de Ingreso: noviembre-2005
Mensajes: 24
Antigüedad: 18 años, 5 meses
Puntos: 0
Chequeo de parentesis

Hola estoy realizando una parte de un programa de vb6 que permite ingresar formulas personalizadas pero basicas + - * /. Estas incluyen operaciones combinadas con parentesis x ej:((123*43)/43)-5

El temas es como puedo chequear que se utilizaron bien los parentesis:
x ej: (()) o ()() y no )()( o ))((

Debe haber algun codigo en vb6 hecho por ahi que realize este chequeo, si alguno lo conoce por favor aviseme donde o cual es para reutilizarlo. Como sucede casi siempre en la programación uno a veces quiere "reinventar la rueda, sin saber que la rueda ya existe"

Muy agradecido estaré por la mano
  #2 (permalink)  
Antiguo 18/05/2010, 12:02
Avatar de pkj
pkj
 
Fecha de Ingreso: julio-2006
Ubicación: Órbita sincrónica
Mensajes: 899
Antigüedad: 17 años, 9 meses
Puntos: 29
Respuesta: Chequeo de parentesis

Ese tipo de fórmulas las resuelve VB usando una referencia al Microsoft Script Control 1.0

Lo de los paréntesis puedes probar algo como esto en el evento LostFocus del textbox:

Código vb:
Ver original
  1. Private Sub Text1_LostFocus()
  2.   MiraErrores Text1
  3. End Sub
  4.  
  5. Sub MiraErrores(TB As TextBox)
  6.   Dim F As Long
  7.   Dim Contador As Long
  8.   For F = 1 To Len(TB.Text)
  9.     If Mid$(TB.Text, F, 1) = "(" Then Contador = Contador + 1
  10.     If Mid$(TB.Text, F, 1) = ")" Then Contador = Contador - 1
  11.     If Contador < 0 Then Exit For
  12.   Next F
  13.   If Contador <> 0 Then GoTo HayError
  14.   Exit Sub
  15. HayError:
  16.   TB.SelStart = F - 1
  17.   TB.SelLength = 1
  18.   MsgBox "Los paréntesis no están usados correctamente en el TextBox " & TB.Name
  19. End Sub
Saludos
__________________
No hay preguntas tontas, solo gente estup..., ¡No!, ¿como era? No hay gente que pregunte a tontos... ¡Nooo!... ¡Vaya cabeza!
  #3 (permalink)  
Antiguo 18/05/2010, 12:10
Avatar de lokoman  
Fecha de Ingreso: septiembre-2009
Mensajes: 502
Antigüedad: 14 años, 7 meses
Puntos: 47
Respuesta: Chequeo de parentesis

Hola!!!

Yo lo hice de esta forma, ademas solo acepta numeros en el textbox:

Código vb:
Ver original
  1. Public Cont As Double
  2.  
  3. Private Sub Command1_Click()
  4.     MsgBox "Faltan " & Cont & " parentesis"
  5. End Sub
  6.  
  7. Private Sub Text1_Change()
  8.     If Text1.Text = Empty Then Cont = 0
  9. End Sub
  10.  
  11. Private Sub Text1_KeyPress(KeyAscii As Integer)
  12.     If Not KeyAscii = 40 Then 'KEYASCII=40 ES (
  13.        If Not KeyAscii = 41 Then 'KEYASCII=41 ES )
  14.            If Not KeyAscii = 8 Then 'KEYASCII=8 ES BACKSPACE
  15.                If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then
  16.                     KeyAscii = 0
  17.                 End If
  18.             End If
  19.         End If
  20.     End If
  21.    
  22.     If KeyAscii = 40 Then Cont = Cont + 1
  23.    
  24.     If Cont = 0 Then
  25.         If KeyAscii = 41 Then
  26.             KeyAscii = 0
  27.             MsgBox "Falta un '('"
  28.             Exit Sub
  29.         End If
  30.     Else
  31.         If Not KeyAscii = 40 Then 'KEYASCII=40 ES (
  32.            If Not KeyAscii = 41 Then 'KEYASCII=41 ES )
  33.                If Not KeyAscii = 8 Then 'KEYASCII=8 ES BACKSPACE
  34.                    If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then
  35.                         KeyAscii = 0
  36.                     End If
  37.                 End If
  38.             Else
  39.                 Cont = Cont - 1
  40.                 If Cont < 0 Then MsgBox "Faltan " & Abs(Cont) & " parentesis"
  41.             End If
  42.         End If
  43.     End If
  44. End Sub
  #4 (permalink)  
Antiguo 18/05/2010, 12:19
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 14 años, 5 meses
Puntos: 53
Respuesta: Chequeo de parentesis

Hola lokoman, en la rutina, deberías permitirle también la introduccion de los signos de operación que se tengan previstos ya que de lo contrario no podrá escribir expresiones matemáticas, sólo paréntesis y números.

Se me ocurre que lo mejor seria un Instr en una cadena de 0123456789-+/*^ y los simbolos que se le ocurran, incluso el . decimal

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #5 (permalink)  
Antiguo 19/05/2010, 07:05
 
Fecha de Ingreso: noviembre-2005
Mensajes: 24
Antigüedad: 18 años, 5 meses
Puntos: 0
Respuesta: Chequeo de parentesis

Atencion colegas ayer me mate pensando en mi casa con sacar de los parentesis y me salio les paso el codigo para que lo tenga manden opiniones!!!!

Private Function la_igualacion_de_parentesis_es_correcta() As Boolean
'debe chequear el orden de los parentesis
'se guardan en dos vectores las posiciones los parentesis abiertos y cerrado
'luego verifico la posiciones de los parentesis en los vectores
'siempre la posicion de los parentesis cerrados debe ser mayor que la de los abiertos
'si en algun momento la comparacion da falso indicar que estan mal los parentesis
'devolver true si el 'matching' de los parentesis que usa la formula es correcta

Dim abr() As Integer 'def vector para abierto
Dim cier() As Integer 'def vector para cerrados
Dim a As Integer 'def entero para recorrer formula
Dim b As Integer 'def entero para recorrer parentesis
Dim i_abr As Integer 'def indice pare contar abiertos
Dim i_cier As Integer 'def indice para contar cerrados
Dim tope As Integer 'def var para largo de la formula
Dim pos_abr As Integer 'def entero para recordar los parentesis
Dim pformula As String 'def para obtener la formula
Dim caracter As String 'def recorrer cada caracter

pformula = Me.TxtFormula.Text 'obtiene la formula de la ventana
tope = Len(pformula) 'def largo de la formula
ReDim abr(tope) 'redimenciona vector con largo de formula
ReDim cier(tope) 'redimenciona vector con largo de formula

i_abr = 0: i_cier = 0 'inicializa indice
la_igualacion_de_parentesis_es_correcta = True

For a = 0 To tope 'para recorrer los vectores
abr(a) = 0: cier(a) = 0 'inicializa posicion del vector
Next
For a = 0 To tope 'recorre la formula
caracter = MiD$(pformula, a + 1, 1) 'toma el caracter actual
If caracter = "(" Then 'chequea parentesis abierto
abr(i_abr) = a 'guarda la posicion actual
i_abr = i_abr + 1 'agrega uno al contador
End If
If caracter = ")" Then 'chequea parentesis cerrado
cier(i_cier) = a 'guarda la posicion actual
i_cier = i_cier + 1 'agrega uno al contador
End If
Next
tope = i_cier - 1
ReDim Preserve abr(tope)
ReDim Preserve cier(tope)
a = 0
Do While a <= tope 'recore los parentesis cerrados
If cier(a) = 0 Then Exit Do 'si no encuetra parentesis sale
For b = tope To 0 Step -1 'recorre los parentesis abiertos
If abr(b) < cier(a) And abr(b) <> 0 Then 'verifica con los cerrados
abr(b) = 0: cier(a) = 0 'inicializa si los encuentra
Exit For 'sale del for
End If
Next
a = a + 1 'incrementa el contador principal
Loop
For a = 1 To tope 'recorre lo parentesis abiertos
If abr(a) <> 0 Then 'si encuentra alguno entonces los parentesis esta mal
MsgBox "Parentesis mal utilizados!" 'muestra mensaje correspondiente
la_igualacion_de_parentesis_es_correcta = False 'retorna mal
Exit Function 'sale de la funcion
End If
Next
End Function


Saludos!!

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:42.