Páginas (2): 1 2   
Shell   25-10-2021, 20:31
#1
Buenas!.

Estoy realizando un ejercicio con JavaScript en el que se hace uso de este bucle.
Aunque Gambas carece de el, se puede emular con Do Loop Until

El problema que me encontraba es el planteamiento del ejercicio que puede llevar a confusión.
Por ejemplo, dice el enumciado.
Cita:Para solicitar el nombre: repite la petición y no continúa si se introduce un número.

Es que eso de no continua si se introduce un número me quede a cuadros.

En JavaScript es algo como esto:

Código:
<script>            
           var nombre;
            do {
                // La segunda cadena se mostrará dentro de la casilla donde se introduce los datos
                nombre = prompt('Ingrese su nombre','Escribir aquí su nombre');
            } while(!isNaN(nombre));
</script>

La instrucción isNaN, ¿ es número ?. Como está negada se cumpliría la condición cuando no lo sea, una cadena por ejemplo
De ahí al enunciado. Suena raro.

En Gambas es algo como esto:

Código:
Public Sub Ejemplo5()

  Dim nombre As Variant

  Do
    Print ("Ingrese su nombre")
    Input nombre
    'Cuando es un número. La función da True y not la invierte haciendola False
    'Cuando es un caracter o cadena de caracteres. La función da False y not la invierte haciendola True.
  Loop Until Not IsNumber(nombre) 'Cuando es True Termina el bucle

End

La idea es hacerlo con este tipo de bucle. Aprender a usar el bucle.

Otros ejemplos:

En este caso no se cumple
Código:
Public Sub EjemploBucle2()

  Dim x As Integer = 4

  Do
    Print "x vale " & x
    x += 1
  Loop Until Not (x <= 10)

End

En este si, con ayuda del NOT.

Código:
Public Sub EjemploBucle2()

  Dim x As Integer = 4

  Do
    Print "x vale " & x
    x += 1
  Loop Until Not (x <= 10)

End

Os propongo un ejercicio. ¿ Es posible en el "Until" sin un if (claro) hacer la comprobación de esta condición que incluyo en el cuerpo del bucle ?.

Código:
Public Sub EjemploBucle3()

  Dim edad As Variant
  Dim condicion As Boolean

  Do
    Print ("Ingrese su edad")
    Input edad
    'Debe ser un número y encontrarse entre 1 y 105 años
    If IsNumber(edad) And If (CInt(edad) >= 1 And CInt(edad) < 105) Then
      condicion = True
    Else
      condicion = False
    Endif

  Loop Until condicion

End

Creo que no. El problema es que Cint va a intentar convertir una cadena de letras, que eso no es posible.

Saludos

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
vuott   25-10-2021, 23:23
#2
(25-10-2021, 20:31)Shell escribió: La instrucción isNaN, ¿ es número ?

Gambas tiene una función nativa correspondiente: IsNan( )

(25-10-2021, 20:31)Shell escribió: En este caso no se cumple
.......
.......
En este si, con ayuda del NOT.

Me parece que los códigos sean parecidos.  Undecided

(25-10-2021, 20:31)Shell escribió: ¿ Es posible en el "Until" sin un if (claro) hacer la comprobación de esta condición que incluyo en el cuerpo del bucle ?.
......
......
Creo que no.
Porqué Confused no ?

Además, con "Until" se sale del bucle, cuando la condición se vuelve real.

Para tu codigo se necesitan dos bucles:
Código:
Dim edad As Variant

  Repeat
    Repeat
      Print ("Ingrese su edad")
      Input edad
' Debe ser un número:
    Until IsNumber(edad)
' Debe encontrarse entre 1 y 105 años:
  Until (Val(edad) > 0) And (Val(edad) < 106)
Última modificación: 26-10-2021, 00:53 por vuott.

« Los horizontes perdidos nunca regresan. » (F. Battiato, 1983)

« Las ondas nunca regresan. » (Genesis: Ripples, 1976)

« Vita non suavis esse potest, nec Mors amara. »  (...vuott)
Shell   26-10-2021, 12:00
#3
(25-10-2021, 23:23)vuott escribió: Gambas tiene una función nativa correspondiente: IsNan( )

Parece exclusiva para números en coma flotante o reales.

En el ejemplo interesa saber si es un número o es una cadena. En vez de Variant podía haber usado el tipo String,
ya que IsNumber() espera un tipo String.  Usé Variant por la diversidad de tipos que soporta
 
(25-10-2021, 23:23)vuott escribió: Me parece que los códigos sean parecidos.

Los puse iguales. Que despiste. Como es solo cuestión de cambiar una línea. Angel

La condición se cumple sin Not, se sale del bucle y con Not, x se va incrementando hasta ser cierta

Código:
Public Sub EjemploBucle2()

  Dim x As Integer = 4

  Do
    Print "x vale " & x
    x += 1
  Loop Until (x <= 10)

End

( No encontré la forma de responder al mensaje una vez se queda abajo )
Cita:Porqué Confused no ?

Además, con "Until" se sale del bucle, cuando la condición se vuelve real.

Esa es la condición. En muchos de los ejemplos que hice no he necesitado compronbar condiciones al final, he usado en su día Repeat pero no lo suficiente.
Cuando te acostumbras a usar unos bucles, olvidas otros ya que si son suficiente no necesitas más.

Ejemplo. Python tiene dos bucles, for (un for especial ) y while, no necesita más. En cambio otros lenguajes tienen mucho más
Ya sabes que siempre he dicho que Java, JavaScript me recuerdan a "C" en muchas cosas. Condicionales, bucles.

Malditas llaves, ejem, cof cof. Sleepy
Probablemente el desarrollador principal de "C" fue "sereno" antes de llegar a ser desarrollador.
 
Cita:Para tu código se necesitan dos bucles:

Eso es complicarlo un poco, pero lo has resuelto. Wink
Parece que no hay forma de usar la condición completa en un solo until.

Saludos

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
vuott   26-10-2021, 14:47
#4
(26-10-2021, 12:00)Shell escribió: Eso es complicarlo un poco

¡No me digas!  Big Grin

(26-10-2021, 12:00)Shell escribió: Parece que no hay forma de usar la condición completa en un solo until.

...ya que la primera evaluación es si el valor, contenido en la variable "edad", es un carácter ASCII que representa un número imprimible.
Última modificación: 26-10-2021, 14:52 por vuott.

« Los horizontes perdidos nunca regresan. » (F. Battiato, 1983)

« Las ondas nunca regresan. » (Genesis: Ripples, 1976)

« Vita non suavis esse potest, nec Mors amara. »  (...vuott)
cogier   26-10-2021, 17:45
#5
Esta es mi contribución a este debate: -

Código:
Public Sub EjemploBucle3()

  Dim sEdad As String

  Do
    Print ("Ingrese su edad")
    Input sEdad
    If IsNumber(sEdad) And If Val(sEdad) > 0 And Val(sEdad) < 105 Then Exit
  Loop

End
Shell   26-10-2021, 20:14
#6
(26-10-2021, 17:45)cogier escribió: Esta es mi contribución a este debate: -

Gracias Cogier.

Esa forma de hacerlo es similar a como la hice al principio. Solo que no asignas el resultado a condición.

Código:
 If IsNumber(edad) And If (CInt(edad) >= 1 And CInt(edad) < 106) Then
      condicion = True
    Else
      condicion = False
    Endif

Psss..dicen que salir bruscamente de un bucle a veces no está bien visto. Oh. Tongue
Aunque en algunos lenguajes no se puede hacer de otra forma, como la instrucción "switch" de JavaScript que a cada opción usan un break.

Que seguramente "switch" también se usa en "C"...que casualidad, ¿ verdad Vuott ?.  Rolleyes
(26-10-2021, 14:47)vuott escribió: ¡No me digas! 

Rolleyes  
"Inflatius", ¿ qué es un desafío para un programador "con" altura ?.  Cool

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
vuott   26-10-2021, 22:54
#7
(26-10-2021, 20:14)Shell escribió: "switch" también se usa en "C".

"switch" en C = "Select Case" en Gambas.

(26-10-2021, 20:14)Shell escribió: qué es un desafío para un programador "con" altura ?

Big Grin
Última modificación: 26-10-2021, 22:55 por vuott.

« Los horizontes perdidos nunca regresan. » (F. Battiato, 1983)

« Las ondas nunca regresan. » (Genesis: Ripples, 1976)

« Vita non suavis esse potest, nec Mors amara. »  (...vuott)
vuott   27-10-2021, 02:42
#8
(26-10-2021, 12:00)Shell escribió: Eso es complicarlo un poco

De todas formas, usando dos bucles, no es un escándalo. Shy

« Los horizontes perdidos nunca regresan. » (F. Battiato, 1983)

« Las ondas nunca regresan. » (Genesis: Ripples, 1976)

« Vita non suavis esse potest, nec Mors amara. »  (...vuott)
Shell   27-10-2021, 13:44
#9
(27-10-2021, 02:42)vuott escribió: De todas formas, usando dos bucles, no es un escándalo

Ten en cuenta que es una pregunta de test de curso. Lo que hago es implementar la idea para poder hacerlo en Gambas.
Por comodidad siempre vamos a intentar hacerlo lo más parecido a lo que vemos para no complicarnos mientras se pueda.

Si  la idea original es hacerlo con un bucle, hacerlo con dos nos desviaríamos "un poco" del código original.
Y en caso de desviarse, las alternativas pueden ser muchas.

Llevar una idea para obtener un resultado es algo distinto a obligarse a hacerlo de un forma si o si, cuando tu sabes que:
"Omnes viae Romam ducunt". Wink

Saludos

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
vuott   27-10-2021, 16:20
#10
(27-10-2021, 13:44)Shell escribió: "Omnes viae Romam ducunt"

Ah... las "Viae"... sì, Consul, la real fuerza de vuestro imperio:

[Imagen: strade_romane1.png?height=352&width=480]

« Los horizontes perdidos nunca regresan. » (F. Battiato, 1983)

« Las ondas nunca regresan. » (Genesis: Ripples, 1976)

« Vita non suavis esse potest, nec Mors amara. »  (...vuott)
Páginas (2): 1 2   
  
Usuarios navegando en este tema: 1 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.