¿Se asume el valor del else?

Iniciado por Orb, 22 Diciembre 2014, 03:18 AM

0 Miembros y 1 Visitante están viendo este tema.

Orb

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 ;

Código (vbnet) [Seleccionar]
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

Eleкtro

#1
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:

Código (vbnet) [Seleccionar]
   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:

Código (vbnet) [Seleccionar]
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


Código (vbnet) [Seleccionar]
       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








Orb

#2
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

Eleкtro

#3
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):
Código (vbnet) [Seleccionar]
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








Orb

Vale , esta vez si que me ha quedado todo más claro.

Muchas gracias de nuevo Elektro¡