Autor Tema: Sobre while (acciones) sino (otras) y códigos similares.

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

08 Junio, 2026, 09:22 am
Leído 994 veces

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Código: [Seleccionar]
While condition is true
   Acción A
sino
   Acción B
Con eso, el resultado puede ser A, o AA, o AAA, etc, o B. Nunca será AB, AAB, etc.

No es lo mismo que esto:
Código: [Seleccionar]
While condition is true
   Acción A
Acción B
Acá siempre hay un B al final.

De la forma normal creo que sería así:
Código: [Seleccionar]
Si condition is true
   While condition is true
      Acción A
sino
   Acción B
Una misma condición se evalúa 2 veces...
Entonces el "sino" como parte alternativa de un while no parece mala idea... Pero nunca lo vi ¿qué pasa con esto? ¿se usa demasiado poco? De hecho puse un ejemplo formal porque no se me ocurre uno concreto. Algo como:
Código: [Seleccionar]
While enemigo tiene balas
   él dispara
sino
   ganaste
Pero a largo plazo sería algo como:
Código: [Seleccionar]
Repetir
   Nivel = 1
   Status = "Ok"
   Repetir
      Balas = Nivel
      Repetir
         Enemigo dispara
         Si te golpea una bala
           Status = "Bad"
            break
         Balas--
      mientras enemigo tiene balas
      Si Status = "Ok"
         Mensaje de ganaste
         Nivel++
   mientras Status == "Ok"
mientras tecla escape presionada == false
No hay lugar para "while... sino".
Aunque ese código está mal porque no permite salir del juego hasta que al enemigo se le acaban las balas o te golpea. Fue sólo un ejemplo...

También podríamos hablar de:
Código: [Seleccionar]
While condition is true
   Acción A
sino si otra condition is true
   Acción B
sino
   Acción C

y...

Código: [Seleccionar]
While condition is true
   Acción A
sino mientras otra condition is true
   Acción B
sino
   Acción C

Al consultar a una IA, lo confundió con algo de Python, ojo.
https://share.google/aimode/QVd79laHmDGJAEyJw

Yo return casi nunca usé así que no tengo mucha idea de eso.

08 Junio, 2026, 11:53 pm
Respuesta #1

david__bernal

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 36
  • País: ar
  • Karma: +0/-0
Código: [Seleccionar]
While condition is true
   Acción A
sino
   Acción B
Con eso, el resultado puede ser A, o AA, o AAA, etc, o B. Nunca será AB, AAB, etc.

Muy interesante!.

Otra variante que pude ver mientras lo chusmeaba es hacer tal cual como armaste el bloque de sintaxis pero que se pueda dar cualquier sucesion ABAAB..., que se prolongue tanto como uno quiera pero que tambien se la pueda parar si uno quiere con una funcion
break(func) que tenga un callback como argumento y que retorne un booleano.

No sé si vale la pena lo que digo, pero es algo.

Pero lo cierto es que si uno tiene ganas y tiempo podría hacerse un compilador que interprete este tipo de codigo.

Saludos.

09 Junio, 2026, 02:41 am
Respuesta #2

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,054
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada
Código: [Seleccionar]
While condition is true
   Acción A
sino
   Acción B
Con eso, el resultado puede ser A, o AA, o AAA, etc, o B. Nunca será AB, AAB, etc.
para tener AA tienes que ir concatenando en la sentencia Acción, pero el resultado nunca será A,AA,AAA, porque para salir siempre sales agregando  B si la accion es concatenar  Sera  AB,AAB,AAAB


Esto es normal en python


Código: [Seleccionar]

n = 0
while n < 5:
    print(n)
    n += 1
else:
    print("El while terminó normalmente")
print ("luego sigue esto")


Pero no sé si funciona en todos los lenguajes del mismo modo,  aca ves que ejecuta 5 veces y pasa si o si por imprimir "El while terminó normalmente" , no puede ser de otra manera siempre pasa por la accion B , luego el programa puede seguir (por imprimir lo que sigue) o terminar,




Citar
No es lo mismo que esto:
Código: [Seleccionar]
While condition is true
   Acción A
Acción B
Acá siempre hay un B al final.
Correcto , pero en el anterior  tambien siempre hay una B final  Asíque en definitiva hacen lo mismo y por eso no se usa el else.


Produce el mismo resultado que

Código: [Seleccionar]
n = 0
while n < 5:
    print(n)
    n += 1

print("El while terminó normalmente")
print ("luego sigue esto")
No hay diferencia entre los 2



Citar
De la forma normal creo que sería así:
Código: [Seleccionar]
Si condition is true
   While condition is true
      Acción A
sino
   Acción B
Una misma condición se evalúa 2 veces...
Esto produce el mismo resultado que las anteriores  no hay diferencia



Código: [Seleccionar]
n = 0
if n<5:
   while n < 5:
       print(n)
       n += 1
else:

    print("El while terminó normalmente")
print ("luego sigue esto")






Si lo que buscas, es que  el resultado sea todas A o una sola  B , debes saber exactamente cuantas veces vas a evaluar la condición

Código: [Seleccionar]

n = 0
while n < 5 and  condicion:
       print(n)
       n += 1
else:
    print("la condicion fallo")
print ("luego sigue esto")


Alli  ejecutas   cinco veces la condición, si las 5 veces es verdadera, nunca pasa por el else y sigue.


Esta bien conceptualmente salir del while con un break, si ocurre una excepción(te alcanza una esquirla), pero  sino el juego acaba cuando no se da la condicion , y si la condicion es que las balas son 0 , entonces se acaba cuando se te acaban las balas aunque no te halla, dado ningún rasguño. 


Código: [Seleccionar]
balas = 10
while  balas>0:
       if me_dieron=true:
           vivo= false
           break
       if tiro_bala=true:
           balas=balas-1
       if encuentro_cargador=true:
           balas=balas+10
else:
    print("se te acabaron las balas, estás jodido")
print (" te mataron, corre mas rápido la próxima")

 Así vas estar vivo , mientras no dispares, o mientras tengas una bala y encuentres un cargador, pero el juego termina de dos maneras, o te dan, o se te terminan las balas, pero no evitas que el programa pase por donde debe seguir


lo que puedes hacer es un choose, (elegir ,) entre varias opciones, y el juego continua ono en funcion de que que se de una  opcion.

o algo como

Código: [Seleccionar]
balas = 10
while  balas>0:
       if me_dieron=true:
           vivo= false
           print (" te mataron, corre mas rápido la próxima")
           break
       if tiro_bala=true:
           balas=balas-1
       if encuentro_cargador=true:
           balas=balas+10
else:
    print("se te acabaron las balas, estás jodido")
print ("nuevo juego s/n")


Saludos  \(\mathbb {R}^3\)

09 Junio, 2026, 07:43 am
Respuesta #3

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Otra variante que pude ver mientras lo chusmeaba es hacer tal cual como armaste el bloque de sintaxis pero que se pueda dar cualquier sucesion ABAAB..., que se prolongue tanto como uno quiera pero que tambien se la pueda parar si uno quiere con una funcion
break(func) que tenga un callback como argumento y que retorne un booleano.
Si quieres prueba explicármelo de otro modo.


Richard parece que como al igual que la IA estás confundiendo con algo de Python, lo dije al final.

El sino inicia sólo si al chequear el while por 1era vez la condición no se cumplió.
Puede que sea más claro así:
Código: [Seleccionar]
Si no se cumple una condición
   Acción B
sino repetir
   Acción A
mientras se cumpla la condición

Normalmente se haría así:
Código: [Seleccionar]
Si no se cumple una condición
   Acción B
sino
   Repetir
      Acción A
   mientras se cumpla la condición

El resultado será uno de estos:
B
A
AA
AAA
A...

Nunca BA, ni BAA, AB, etc.

¿Cual es la ventaja del "sino repetir"?
Una línea menos de código.

Imaginate que no existiera "sino si". Siempre tendrías que poner 2 líneas:
Código: [Seleccionar]
sino
   Si

Pero en lo que te acabo de decir son 5 líneas. En lo que planteé al inicio del tema son 4. Pero bueno, sí, el sino luego de un while puede confundirse como lo estoy planteando porque con un while es como que el lector vuelve al inicio, y si no se cumple lo normal es ir al sino, pero como dije en este caso es diferente.

Por eso no parece buena idea.

¿Pero qué pasa si la condición del while es más probable que la del if? Convendría poner el while 1ero, luego el sino. Sólo que habría que evitar los malentendidos, no sé cómo.

Citar
n = 0
while n < 5:
    print(n)
    n += 1
else:
    print("El while terminó normalmente")
print ("luego sigue esto")


Pero no sé si funciona en todos los lenguajes del mismo modo,  aca ves que ejecuta 5 veces y pasa si o si por imprimir "El while terminó normalmente" , no puede ser de otra manera siempre pasa por la accion B , luego el programa puede seguir (por imprimir lo que sigue) o terminar,
No entiendo lo de Python, pero creo que el else tiene sentido si hay un break, en el caso que lo pusiste sería redundante, ocurrirá siempre, puedes simplemente poner el print al final del while, no hay necesidad de un sino.
Pero eso es la interpretación normal, la que yo planteé es distinta. En ella, como el while siempre se va a iniciar, entonces el sino nunca sucede.

Citar
Si lo que buscas, es que  el resultado sea todas A o una sola  B , debes saber exactamente cuantas veces vas a evaluar la condición
Se puede iniciar chequeando la condición inversa y que haga B en ese caso como te mostré, pero a ver, esto es por ejemplo así, imagina que te propones jugar un juego siguiendo esta estrategia:
Código: [Seleccionar]
Mientras tu personaje tenga su vida al máximo
   Avanza
sino
   Vuelve buscando curarlo
No sabes exactamente cuántas veces o hasta dónde avanzarás, y aún así el código sirve, uh... en teoría, porque en el 1er juego de Zelda perdí intentando volver a la zona de curación xD
No recomiendo tomarse ese juego en serio, tiene demasiadas cosas escondidas.

09 Junio, 2026, 08:47 am
Respuesta #4

Luis Fuentes

  • el_manco
  • Administrador
  • Mensajes: 58,907
  • País: es
  • Karma: +0/-0
Hola

Richard parece que como al igual que la IA estás confundiendo con algo de Python, lo dije al final.

Es que el como se interpreta un while/else puede depender del lenguaje de programación.

Tu no dices de que lenguaje estás hablando,

Por otro lado para ver como lo interpreta tu lenguaje concreta simplemente experimenta; con dos o tres pruebas sabrás como reacciona.

Saludos.

09 Junio, 2026, 12:59 pm
Respuesta #5

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,054
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada
Hola Tachikomaia un bloque while siempre  termina cuando la condición no se cumple, entonces lo que pongas en el else se ejecuta siempre al final cuando la condición no se da y termina, es inevitable.


El bloque while esta pensado para que lo repitas indefinidamente mientras la condición no se cumple, así  que dentro puedes ejecutar lo que quieras, y eso puede o no cambiar  el valor de la condición inicial,  si al final del bloque la condición  sigue siendo  verdadera, entonces repite el interior sino ejecuta el else y termina.


Lo que te digo de python es que si acepta sintacticamente el else para un while,  pero no sé si todos los lenguaje lo toman, justamente por innecesario ya que es equivalente a ponerlo en la primera línea posterior al bloque while.


Si lo que necesitas  como resultado e B o todas A,entonces estari bien hacer un if con la condición  negada y en el else abrir un while con la misma condición.
Esto antes se solucionaba numerando las líneas y un goto o return. Pero se evolucionó pensando lo bloques de otra manera, y llamando a funciones,  que son bloques que se repiten las veces que quieras con solo nombrarlo en el programa.
Saludos  \(\mathbb {R}^3\)

09 Junio, 2026, 02:07 pm
Respuesta #6

david__bernal

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 36
  • País: ar
  • Karma: +0/-0
Otra variante que pude ver mientras lo chusmeaba es hacer tal cual como armaste el bloque de sintaxis pero que se pueda dar cualquier sucesion ABAAB..., que se prolongue tanto como uno quiera pero que tambien se la pueda parar si uno quiere con una funcion
break(func) que tenga un callback como argumento y que retorne un booleano.
Si quieres prueba explicármelo de otro modo.

Lo que pasa es que malinterpreté lo que decías, pensaba que hablabas de construcción de lenguajes formales para programación.
Ya que no me tope hasta ahora con la expresión while ... else. Mala mia.

Saludos.

09 Junio, 2026, 06:11 pm
Respuesta #7

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,054
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada
una expresion quer sive tambien conocer es


Código: [Seleccionar]
while true
   
    if "pasa_x_cosa"=true
         accion B
         break
    accion A
    if "pasa_lo_que_quieres_para_que_termine"=true
        break
Eso ejecuta, pregunta y sale con B, sino hace la acción A hasta que pase algo que te saque del while





Saludos  \(\mathbb {R}^3\)

10 Junio, 2026, 12:17 pm
Respuesta #8

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Se me ocurrió pensando en posibles secuencias que pudieran ser descritas en 4 líneas, usando un lenguaje simplificado que no es para meter en una máquina por ahora, así que Luis lo de probarlo en Actionscript no me llama la atención... el resultado podría ser cualquiera, desde un mensaje de error de sintaxis porque else sólo va luego de if, hasta que, para mi sorpresa, funcione bien, pero esto va más allá del lenguaje que yo use.
Lo que sucedió es que me sorprendió que eso nunca lo había visto, pero claro yo no ando mirando códigos de otra gente. Y así pues planteé el tema por curiosidad y en caso de ser algo nuevo y útil, darlo a conocer.

Dicho de otra fiorma estaba medio inventando un lenguaje y vi que en él era posible hacer algo de modo más simple que a como estoy acostumbrado.

Ya que lo dicho parece tan contradictorio, lo probé, pero debe entenderse que originalmente era un código para aplicar yo, entonces es mucho más simple de lo que se verá a continuación, porque yo no necesito poner cuando termina el bucle (es cuando yo pierda) ni que ciertas cosas pueden ocurrir siempre.
Código: [Seleccionar]
AccionesRealizadas = "";
PuntosDeVida = 3;
// Mientras no haya game over:
while (PuntosDeVida > 0) {
// Simulación de que el personaje puede ser golpeado o no:
PuntosDeVida = PuntosDeVida-random(2)*2;
// While en cuestión:
while (PuntosDeVida == 3) {
AccionesRealizadas = AccionesRealizadas+"Atacar ";
// Simulación para que el while pueda acabar:
PuntosDeVida = PuntosDeVida-random(2)*2;
} else {
AccionesRealizadas = AccionesRealizadas+"Curarse ";
PuntosDeVida = 3;
}
}
trace(AccionesRealizadas);

Me dice:
Citar
Escena=Escena 1, Capa=Capa 1, Fotograma=1: Line 12: Se ha encontrado un operador 'else' que no coincide con 'if'
        } else {
Nunca entendí mucho esos mensajes, pero parece que else debe seguir a un if.

Veo que ese código igual no tendría fin si funcionara bien. Puede que mi planteamiento haya sido demasiado abstracto. Sería así:
Código: [Seleccionar]
AccionesRealizadas = "";
PuntosDeVida = 3;
RecienGolpeado = false;
// Mientras no haya game over:
while (PuntosDeVida > 0) {
if (RecienGolpeado == false) {
AccionesRealizadas = AccionesRealizadas+"Puñetazo ";
} else {
AccionesRealizadas = AccionesRealizadas+"Patada ";
}
// Simulación de que el personaje puede ser golpeado o no:
if (random(5) == 0) {
RecienGolpeado = true;
PuntosDeVida--;
} else {
RecienGolpeado = false;
}
}
trace(AccionesRealizadas);

Ahí no parece tener sentido poner un "while else", pero es que en mi caso el juego se encarga de lo contrario.
Código: [Seleccionar]
Mientras dure el juego
   Mientras no me acaban de golpear
      Puñetazo
   sino
      Patada
Poner un si en vez de mientras funcionaría igual, pasa que yo ni siquiera pensaba en el while inicial porque se sobre entiende. Pero acá tendría sentido:
Código: [Seleccionar]
Mientras dure el juego
   Mientras no me acaban de golpear
      Puñetazo
   sino
      Patada
   Curarse
Considerando que se puede ser golpeado en cualquier momento, los resultados pueden:
A: Puñetazos hasta ser golpeado, luego curarse.
B: Patada, luego curarse.
Si en vez de un mientras se pone un if, lo de curarse ocurriría luego de cada puñetazo, no daría ni 2 seguidos.

Miren que me he mareado bastante, lo cierto es que se puede hacer de forma normal, esto sirve para evitar algunas líneas y quizá serviría para agilizar la ejecución.

Código: [Seleccionar]
while true
   
    if "pasa_x_cosa"=true
         accion B
         break
    accion A
    if "pasa_lo_que_quieres_para_que_termine"=true
        break
Eso ejecuta, pregunta y sale con B, sino hace la acción A hasta que pase algo que te saque del while
Queda más simple así:
Código: [Seleccionar]
do
    if "pasa_x_cosa"=true
         accion B
         break
    accion A
while "pasa_lo_que_quieres_para_que_termine"=false
Pero eso no logra lo que decía al inicio, habría que poner un else arriba de action A.


Actualmente decidí hacer un programa que genere estructuras de códigos y no usar lo que planteé ni else if porque quitan posibilidades como esta:
Código: [Seleccionar]
Si Condición 1 == true
   Acción A
sino
   Acción B
   Si Condición 2 == true
      Acción C
O sea si pones else if no hay espacio para la Acción B.
Pero luego de generados los códigos, puede que se requiera optimizarlos.
Bueno, eso es bastante offtopic, sólo digo.