Buenas.
No sé si el título está bien formulado , pero allá va mi cuestión.
Actualmente ando con los condicionales de vb.net , y tras empollarme la lección , me puse a intentar crear un código que , al introducir un número en un textbox te dijera si era mayor , menor , o igual que el número pi(Una tontería , pero algo tenía que hacer para practicar)
Total que me puse a ello y busqué mas información con respecto a los condicionales.
Observé en diversos sitios que añadían el else , y la última condición se "auto-completaba" por decirlo así.
Os pondré un ejemplo , este es el código que hice , se basa en un textbox y un button que al ser pinchado te dice si es mayor , igual o menor ;
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim mensaje1 As String
Dim mensaje2 As String
If txt1.Text < 3.14 Then
mensaje1 = "Es menor que pi"
MsgBox(mensaje1)
ElseIf txt1.Text = 3.14 Then
mensaje2 = "Es igual que pi"
MsgBox(mensaje2)
Else
MsgBox(" Es mayor que pi")
End If
End Sub
(También me di cuenta de que podía acortar bastante el código , como por ejemplo no declarar los mensajes que te tira al comprobar como string ya que directamente puedes ponerlo como msgbox en la condición)
Ahora viene mi duda , veréis que tanto para el if como para el elseif establezco por así decirlo la condición , tanto = 3.14 como < 3.14 , pero al poner el else , directamente interpreta que es mayor , y así lo comprobé al ejecutarlo , que directamente si ponías un número mayor te tiraba el mensaje de que era mayor , sin necesidad de establecer el >3.14
Mi pregunta es , ¿Esto por qué sucede así?¿Siempre es similar?¿Sirve para Strings y demás?Porque no acabo de entender su funcionamiento , busqué un par de ejemplos , e incluso en la página oficial de microsoft pero no sirvió demasiado para despejarme la duda.
Un saludo y muchas gracias , a pesar de que mis dudas sean tan imperdonables xD
Cita de: Orb en 22 Diciembre 2014, 03:18 AMMi pregunta es , ¿Esto por qué sucede así?¿Siempre es similar?
Sucede porque es la única posibilidad restante.
Es decir, tú has hecho una condición para cuando es Menor, y otra condición para cuando es Igual, entonces obviamente la última condición Else solo puede procesar los números que sean mayores, ya que no hay existe ninguna otra posibilidad.
La condicional que has mostrado
If + ElseIf + Else se puede traducir de la siguiente manera:
Si "x" es menor que "y", entonces...
Si "x" es igual que "y", entonces...
Si "X" no es menor ni igual que "y", entonces...
fín
Si las condiciones anteriores al Else no se cumplieron, entonces... solo puede ser Mayor.
Cita de: Orb en 22 Diciembre 2014, 03:18 AM¿Siempre es similar?
No se muy bien que estás preguntando, si en tu código quitas la condición de Igual (el ElseIf), y dejas el Else, entonces las instrucciones del bloque Else se procesarán cuando el valor sea Igual o Mayor, ya que existen esas 2 posibilidades.
Que lio te has montado, mira que es fácil de entender xD, aunque quizás yo no sé explicarme demasiado bien.
Por cierto, en las circunstancias en las que te encuentras, donde haces condiciones con valores "constantes", te sugiero utilizar un
Select Case:
Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) _
Handles Button1.Click
Dim pi As Double = CDbl(Math.PI.ToString("n2")) ' 3.14
Dim refValue As Double
Double.TryParse(Me.txt1.Text, refValue)
Select Case refValue
Case Is < pi
MessageBox.Show("Es menor que pi")
Case Is > pi
MessageBox.Show("Es mayor que pi")
Case Else
MessageBox.Show("Es igual que pi")
End Select
End Sub
saludos
EDITO:Cita de: Orb en 22 Diciembre 2014, 03:18 AMno acabo de entender su funcionamiento
Las instrucciones que escribas después de la declaración
Else, se ejecutarán si ninguna condición anterior se evaluó como
True.
Es tan simple como eso :P: http://msdn.microsoft.com/en-us/library/752y8abs.aspx
Dos ejemplos aleatorios que he escrito por si te ayudan a entenderlo:
If "str1".Equals("str2") Then ' No se cumple esta condición. Salta a la siguiente condición.
ElseIf "str1".Equals("str3") Then ' No se cumple esta condición. Salta a la siguiente condición.
ElseIf "str1".Equals("str4") Then ' No se cumple esta condición. Salta al Else.
Else ' Ninguna condición de arriba se cumplió. Por eso es que se procesa este bloque condicional.
MessageBox.Show("Ningua condición se cumplió!")
End If
If True = False Then ' Esta condición jamás se podrá cumplir.
MessageBox.Show(" True es igual que False ")
Else
' Como sabemos que la condición anterior no se cumple,
' y como sabemos que True solo puede ser True o False,
' entonces asumimos que True es igual a True, ya que no puede ser otra cosa llegados a este punto.
MessageBox.Show(" True es igual que True ")
End If
Pues sí , la verdad es que me monté un buen lío , pero al ser la primera vez que toco programación , intento comprender cada cosa lo máximo posible y quizás me como demasiado la cabeza xD
Es justo eso lo que me intrigaba , si al solo quedar una opción posible dentro de la condición el else asume la última.Con respecto a lo de siempre es similar me refería a si siempre se da ese caso , si siempre que solo quede una condición el else la asume sin necesidad de establecer nada.Siendo sincero , respecto al código que escribiste intentando aclararme hay bastantes funciones que no entiendo , o mas bien , no las he dado , ahora me pondré a documentarme sobre ellas.Por cierto , ¿es necesario declarar el la variable de pi?
Muchísimas gracias por tu respuesta Elektro , un saludo
Cita de: Orb en 22 Diciembre 2014, 12:50 PMCon respecto a lo de siempre es similar me refería a si siempre se da ese caso , si siempre que solo quede una condición el else la asume sin necesidad de establecer nada
No exactamente ya que la funcionalidad de la declaración Else no es "asumir", pero podriamos decir que sí, siempre que quede una única condición posible, el Else "la asume".
Cita de: Orb en 22 Diciembre 2014, 12:50 PMPor cierto , ¿es necesario declarar el la variable de pi?
En el código que mostré, estrictamente necesario no es, pero es lo correcto, ya que al declarar la variable puedo acceder directamente al valor en la memoria, en lugar de duplicar instrucciones innecesarias en el Select Case, puesto que es más rápido (y dinámico) acceder directamente a la variable que llamar a la función .ToString * 3 veces para que devuelva el mismo siempre el mismo valor y castearlo a
Double :-/, el tiempo de ejecución aumenta.
PD: De todas formas la diferencia del tiempo de ejecución es ínfima (quizás no llegue a 5-10 ms de diferencia), pero sigue siendo lo correcto, y yo soy bastante
maniático estricto con esas cosas xD.
EDITO: Si te referías a la variable '
refValue', entonces esa si que es totálmente necesaria, ya que la función .TryParse pide una variable referida como parámetro, pide una variable para modificarla y almacenar el resultado en caso de que la conversión del string tenga éxito,
por otro lado, en
otras circunstancias si que podrías evitar declarar la variable referida, usando el constructor (New):
If Double.TryParse("1", New Double) Then...
De todas formas esa parte del código era solo un control de errores (muy básico), así que puedes omitir la declaración de la variable 'refValue', y la utilización de TryParse.
Saludos
Vale , esta vez si que me ha quedado todo más claro.
Muchas gracias de nuevo Elektro¡