Página original: http://pine.fm/LearnToProgram/?Chapter=06
Ahh, el control de flujo. Aquí es donde todo converge. Aun cuando este capitulo es mas corto y mas fácil que el capitulo de los métodos, este abrirá un mundo en las posibilidades de programación. Después de este capítulo, serás capaz de escribir programas realmente interactivos; anteriormente hemos hecho que los programas nos digan diferentes cosas dependiendo de lo que hayamos escrito con el teclado, pero después de este capitulo los programas también harán diferentes cosas. Pero antes de que lleguemos a eso, necesitamos poder comparar los objetos en nuestros programas, necesitamos…
Métodos de Comparación
Vayamos con prisa en esta parte para poder llegar a la siguiente sección, Ramificaciones (Branching), donde sucede todo lo emocionante. Así que, para saber si un objeto es mayor o menor que otro, usamos los métodos > y <, así:
1 2 | puts 1 > 2 puts 1 < 2 |
false true
No hay sorpresas, false es falso y true es verdadero. Así mismo, podemos saber si un objeto es mayor-o-igual-que otro objeto (o menor-o-igual-que) con los métodos >= y <=
1 2 | puts 5 >= 5 puts 5 <= 4 |
true false
Y finalmente, podemos ver si dos objetos son iguales o no, usando == (que significa “¿Son iguales?”) y != (que significa “¿Son diferentes?”). Es importante no confundir = con ==. = le esta diciendo a una variable que apunte a un objeto (asignando), mientras que == esta preguntando: “¿Son estos objetos iguales?”
1 2 | puts 1 == 1 puts 2 != 1 |
true true
Por supuesto, también podemos comparar cadenas. Cuando se compara cadenas, se compara su orden lexicográfico, lo que quiere decir que básicamente se ordenan como en el diccionario, gato esta antes que perro en el diccionario, así que:
1 | puts 'gato' < 'perro' |
true
Hay un problema, la manera en la que la computadora hace las cosas, primero están las mayúsculas que las minúsculas. (Así es como ordena los tipos de letra. Primero las mayúsculas, luego las minúsculas.) Esto significa que la computadora cree que primero esta ‘Zoológico’ que ‘abeja’, así que si quieres saber cual palabra va realmente primero en el diccionario, asegurate de usar downcase (o upcase o capitalize) en ambas palabras para que se puedan comparar.
Una ultima nota antes de ver Ramificaciones (Branching): Los métodos de comparación no nos están dando cadenas ‘true’ y ‘false’; nos esta dando los objetos especiales true y false. (Por supuesto que true.to_s nos regresa ‘true’, lo cual es la razón por la que puts nos regresa ‘true’.) true y false se usan todo el tiempo en las…
Ramificaciones (Branching)
Las Ramificaciones son un concepto simple, pero poderoso. De hecho, es tan simple que ni siquiera tengo que explicarlo; solo mostrarlo:
1 2 3 4 5 6 | puts 'Hola, como te llamas?' nombre = gets.chomp puts 'Hola ' + nombre + '.' if nombre == 'Chris' puts 'Que bonito nombre!' end |
Hola, como te llamas?
Chris
Hola Chris.
Que bonito nombre!
En cambio si ponemos otro nombre…
Hola, como te llamas?
Chewbacca
Hola Chewbacca.
Y eso son las ramificaciones. Si lo que viene después de if es true (verdadero), entonces se ejecuta el código que se encuentra entre el if y el end. Si lo que viene después del if es false (falso), no se ejecuta. Así de sencillo.
Indenté (separar el código con un tabulador) el código que se encuentra entre el if y el end porque creo que es mas fácil de ramificar. Casi todos los programadores hacen esto sin importar el lenguaje de programación que estén usando. Puede que no ayude mucho en este ejemplo tan sencillo, pero cuando los códigos se ponen mas complejos, hacen una gran diferencia.
Algunas veces vamos a querer que nuestro programa haga una cosa si la expresión es true, y otra si es false. Para eso nos servirá el else:
1 2 3 4 5 6 7 8 | puts 'Soy un vidente. Dime tu nombre:' nombre = gets.chomp if nombre == 'Chris' puts 'Veo grandes cosas en tu futuro.' else puts 'Veo en tu futuro... Oh! ¿¿Ya viste la hora??' puts 'Me tengo que ir, lo siento.' end |
Soy un vidente. Dime tu nombre:
Chris
Veo grandes cosas en tu futuro.
Ahora intentemos con otro nombre
Soy un vidente. Dime tu nombre:
Ringo
Veo en tu futuro... Oh! ¿¿Ya viste la hora??
Me tengo que ir, lo siento.
Ramificar es algo así como hacer una bifurcación en el código: Tenemos que tomar un camino para las personas en las que nombre == ‘Chris’, y en caso de que sea otro, tomamos otro camino.
Y, al igual que las ramas de un árbol, puedes tener ramas con ramas dentro:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | puts 'Hola y bienvenido al sexto de primaria.' puts 'Mi nombre es Srta. Gabbard. Cual es tu nombre?' nombre = gets.chomp if nombre == nombre.capitalize puts 'Por favor toma asiento ' + nombre + '.' else puts nombre + '? Querrás decir ' + nombre.capitalize + ' no?' puts 'No sabes como se escribe tu nombre?' respuesta = gets.chomp if respuesta.downcase == 'si' puts 'Bien, entonces toma asiento' else puts 'Sal del salón inmediatamente' end end |
Hola y bienvenido al sexto de primaria. Mi nombre es Srta. Gabbard. Cual es tu nombre? chris chris? Querrás decir Chris no? No sabes como se escribe tu nombre? si Bien, entonces toma asiento
Ahora intentemos con la primera letra mayúscula…
Hola y bienvenido al sexto de primaria.
Mi nombre es Srta. Gabbard. Cual es tu nombre?
Chris
Por favor toma asiento Chris.
Algunas veces podría ser confuso ver a quien corresponde cada if, else y end. Lo que yo hago es escribir end al mismo tiempo que el if. Así que mientras escribía el programa, el principio se veía así:
1 2 3 4 5 6 | puts 'Hola y bienvenido al sexto de primaria.' puts 'Mi nombre es Srta. Gabbard. Cual es tu nombre?' nombre = gets.chomp if nombre == nombre.capitalize end |
Después escribí algunos comentarios. (Lineas de texto en el código, que la computadora ignorará):
1 2 3 4 5 6 7 8 9 | puts 'Hola y bienvenido al sexto de primaria.' puts 'Mi nombre es Srta. Gabbard. Cual es tu nombre?' nombre = gets.chomp if nombre == nombre.capitalize # Actúa amablemente else # Se enoja end |
Todo lo que esta después de # es considerado un comentario (a no ser, por supuesto, que estés dentro de una cadena). Después de eso, reemplace los comentarios con el código. A algunas personas les gusta dejar los comentarios, personalmente, creo que un código bien escrito habla por si mismo. Solía usar muchos comentarios, pero conforme fui aprendiendo mas Ruby menos los usaba. Actualmente siento que distraen la mayor parte del tiempo. Es una elección personal; encontrarás tu propio estilo. Así que mi siguiente paso se vio así.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | puts 'Hola y bienvenido al sexto de primaria.' puts 'Mi nombre es Srta. Gabbard. Cual es tu nombre?' nombre = gets.chomp if nombre == nombre.capitalize puts 'Por favor toma asiento ' + nombre + '.' else puts nombre + '? Querrás decir ' + nombre.capitalize + ' no?' puts 'No sabes como se escribe tu nombre?' respuesta = gets.chomp if respuesta.downcase == 'si' else end end |
Una vez mas escribí if, else y end al mismo tiempo. Me ayuda bastante para saber en que parte estoy del código. También hace que el trabajo se vea mas fácil porque solo te concentras en una parte pequeña del programa, como en rellenar el código entre if y else. Otro de los beneficios de hacerlo de esta manera es que la computadora puede entender el programa en cualquier parte. Cada una de las versiones del programa que te mostré se podría ejecutar. No estaban terminados, pero funcionaban. De esta manera podía probar el programa mientras lo escribía, lo cual ayudo a ver como iba funcionando el programa y donde necesitaba mas trabajo. Cuando pasaba todas las pruebas, así sabía que estaba terminado.
Estos tips te ayudaran a escribir programas con ramificaciones, pero también te ayudaran a entender otro tipo de control de flujo:
Ciclos
Muchas veces querrás que tu computadora haga la misma cosa una y otra vez, después de todo, se supone que las computadoras son buenas haciendo eso.
Cuando le dices a la computadora que siga repitiendo algo, también deberás de decirle cuando parar. Las computadoras nunca se aburren, así que si no le dices que pare, no lo hará. Nos aseguraremos de que esto no pase diciendo a la computadora que repita cierta parte del programa mientras una condición sea cierta. Funciona de manera similar al if:
1 2 3 4 5 6 7 8 | command = '' while command != 'adios' puts command command = gets.chomp end puts 'Vuelve pronto' |
Hola Hola Hola? Hola? Mucho gusto en conocerte Mucho gusto en conocerte Que amable! Que amable! adios Vuelve pronto
Y eso es un ciclo. (Puedes haber notado una linea en blanco al principio de la salida de la linea de comandos, es del primer puts antes del primer gets. Como cambiarías el programa para deshacerse de la primer linea? Intentalo! Funcionó igual que el programa anterior? Aparte de la primera linea en blanco.)
Los ciclos te permiten hacer hacer muchas cosas interesantes, como te puedes imaginar. Sin embargo también pueden causar problemas si cometes un error. Que hacer si tu computadora se queda atrapada en un ciclo infinito? Si crees que te paso eso, solo presiona y sostén la tecla Ctrl y luego presiona C.
Antes de que comencemos a jugar con los cliclos, veamos algunas cosas que harán nuestro trabajo mas sencillo.
Un poco de Lógica
Veamos nuestro primer programa de ramificaciones. Si mi esposa entrara a la casa (bueno, del autor original :D), viera el programa, lo usara y no le dijera que nombre tan bonito tiene? No quisiera herir sus sentimientos (o dormir en el sofá), así que volvamos a escribirlo:
1 2 3 4 5 6 7 8 9 10 | puts 'Hola, como te llamas?' nombre = gets.chomp puts 'Hola ' + nombre + '.' if nombre == 'Chris' puts 'Que bonito nombre!' else if nombre == 'Katy' puts 'Que bonito nombre!' end end |
Hola, como te llamas?
Katy
Hola Katy.
Que bonito nombre!
Bueno, funciona… pero no es un programa muy bonito. ¿Porque no? Bueno, la mejor regla que he aprendido en la programación es la regla DRY: Don’t Repeat Yourself (o No Te Repitas). Se podría escribir un pequeño libro acerca de porque esta regla es tan buena. En nuestro caso, repetimos la linea puts ‘Que bonito nombre!’. ¿Porque es esto un problema? ¿Que pasaría si tuviera un error ortográfico en la cadena? ¿Que pasaría si quisiera cambiar ‘bonito’ por ‘hermoso’ en ambas lineas? Soy un flojo, ¿Recuerdan? Básicamente, si quiero que el programa haga lo mismo cuando escriban ‘Chris’ o ‘Katy’, entonces debería hacer lo siguiente:
1 2 3 4 5 6 | puts 'Hola, como te llamas?' nombre = gets.chomp puts 'Hola ' + nombre + '.' if (nombre == 'Chris' or nombre == 'Katy') puts 'Que bonito nombre!' end |
Hola, como te llamas?
Katy
Hola Katy.
Que bonito nombre!
Mucho mejor. Para que pudiera funcionar use or. Los otros operadores lógicos son and y not. Siempre es una buena idea usar paréntesis cuando quiera usarlos. Veamos como funcionan:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | soyChris = true soyMorado = false meGustaLaComida = true comoRocas = false puts (soyChris and meGustaLaComida) puts (meGustaLaComida and comoRocas) puts (soyMorado and meGustaLaComida) puts (soyMorado and comoRocas) puts puts (soyChris or meGustaLaComida) puts (meGustaLaComida or comoRocas) puts (soyMorado or meGustaLaComida) puts (soyMorado or comoRocas) puts puts (not soyMorado) puts (not soyChris) |
true false false false true true true false true false
La única que te podría parecer complicada sería or. En ingles, “or” se usa para decir “uno de los dos, pero no ambos”. Por ejemplo, tu mamá podría decir, “Para postre puedes tener pay o pastel” (o sería or). Ella quiso decir que puedes tener uno de los dos, pero no ambos. Una computadora, usa or para decir “uno de los dos, o ambos.” (Otra manera de decir esto sería “por lo menos uno de los dos es true.”) Por eso las computadoras son mas divertidas que las mamás.
Algunas cosas para intentar
- “1 elefante se columpiaba…” Escribe un programa que nos regrese la letra de esta canción. Con un limite de “99 elefantes se columpiaban…”
- Escribe un programa de Abuelita Sorda. Cualquier cosa que le digas a tu abuelita (cualquier cosa que teclees), ella debe responder con un ¿EHHH? HABLA MAS FUERTE HIJO!, a no ser que le grites (escribir en mayúsculas). Si le gritas, ella puede escucharte (o al menos eso cree ella) y te grita NO, NO DESDE 1938! Para hacer el programa mas creíble, haz que la abuela grite un año diferente cada vez; puede ser un año entre 1930 y 1950. (Esta parte es opcional, y puede ser mas fácil si lees la sección de generación de números aleatorios en el capitulo de los métodos.) No puedes dejar de hablar hasta que le grites ADIOS.
Truco: No te olvides de chomp. ‘ADIOS’ con Enter no es lo mismo que ‘ADIOS’ sin Enter.
Truco 2: Piensa que parte de tus programas deberían de suceder una y otra vez. Todos ellos deben estar en un ciclo while. - Extiende el programa de la Abuelita Sorda: ¿Que tal si tu abuelita no quiere que te vayas? Cuando le grites ADIOS, ella puede pretender que no te escucha. Cambia el programa anterior para que tenga que gritarte ADIOS tres veces seguidas. Asegurate de probar el programa: Si gritas ADIOS tres veces, pero no seguidas, debes de seguir hablando con tu abuelita.
- Años Bisiestos. Escribe un programa que te preguntara por un año de inicio y otro de final y después responda con todos los años bisiestos que hay en ese rango (incluyendolos si también son años bisiestos). Los años bisiestos son años divisibles entre cuatro (como 1984 y 2004). Sin embargo, los años divisibles entre 100 no son años bisiestos (como 1800 o 1900) a no ser que sean divisibles en 400 (como 1600 y 2000, que fueron bisiestos). (Si, es bastante confuso, pero no ta confuso como tener Julio a la mitad del invierno, lo cual pasaría si no existieran los bisiestos.)
Cuando los termines, tomate un descanso. Haz aprendido bastante el día de hoy. Felicidades! Te sorprende la cantidad de cosas que puedes lograr que haga una computadora? En unos cuantos capítulos vas a ser capaz de programar casi cualquier cosa. Solo ve todas las cosas que puedes hacer ahora que no podías hacer antes de los ciclos y las ramificaciones.
Ahora aprendamos un nuevo tipo de objeto, uno que mantenga una lista de otros objetos: arreglos.
Etiquetas: Programación, Ruby, Tutorial
1 comentario → Deja un comentario








como hacer un programa en control c++ que se trate de algun juego cencillo