GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo:Introducción a la programación - Control de flujo

Serie de procedimientos

Esta es la parte 4 de una serie de 5 partes de Introducción a la programación

  1. Introducción a la programación:Primeros pasos
  2. Introducción a la programación:tu primer programa
  3. Introducción a la programación:variables, tipos y manipulación de datos
  4. Introducción a la programación:control de flujo
  5. Introducción a la programación:programación orientada a objetos

¡Bienvenidos de nuevo, aspirantes a programadores!

En este artículo, exploraremos el flujo de control y cómo puede usar condiciones, bifurcaciones, bucles y otros mecanismos para determinar qué sucede en su programa.

Si no ha leído los artículos anteriores de esta serie, le sugiero que lo haga. Estamos construyendo sobre el conocimiento previo en todos estos artículos, por lo que es importante para su comprensión que sepa lo que ya hemos cubierto.

Tenemos mucho que cubrir en este artículo, así que sin más ceremonias, pongámonos manos a la obra.
.

Manejo de excepciones

La última vez que dejamos nuestro programa, teníamos tres líneas de código y un problema. El código se ve así:

Console.WriteLine("Guess a number between 1 and 10:");
string text = Console.ReadLine();
int input = int.Parse(text);

Sin embargo, si ejecutamos este programa e ingresamos algo que no sea un número cuando se nos solicite, el programa falla porque el compilador no sabe cómo convertir un texto no numérico en un número entero.

Si recuerda la última vez, obtenemos lo que se llama una excepción , y es una de las formas en que podemos controlar el flujo de un programa en una situación muy específica, es decir, cuando ocurre una situación excepcional.

Quería comenzar con el manejo de excepciones porque es el tema más complejo y posiblemente confuso en el control de flujo, por lo que si puede entender lo que hacemos aquí, es probable que encuentre los conceptos restantes mucho más fáciles de entender.

Para el manejo de excepciones en la programación, tenemos dos ideas importantes que debe comprender. La primera idea es que puede pedirle a su programa que intente algo. La segunda idea es que si la computadora falla en lo que está intentando, usted puede detectar el problema y solucionarlo.

Estas dos ideas juntas funcionan un poco como un equilibrista con una red de seguridad. Un equilibrista (su programa) puede desempeñarse normalmente en la cuerda floja, en la mayoría de los casos. Pero si ocurre algo fuera de lo común, como un paso en falso desde la cuerda floja (una excepción), debe haber una red de seguridad para evitar que el artista caiga al suelo (una trampa para manejar la excepción).

Con una comprensión del manejo de excepciones, ahora podemos comenzar a ver una solución a nuestro problema. Podemos pedirle a la computadora que intente analizar el texto en un número entero, y si falla, en lugar de permitir que el programa se bloquee, podemos detectar el error, decirle al usuario y pedirle que intente nuevamente.

Veamos cómo se vería eso en nuestro código.

Console.WriteLine("Guess a number between 1 and 10:");
string text = Console.ReadLine();
int input = 0;
try
{
    input = int.Parse(text);
}
catch
{
    Console.WriteLine("Whoops, you didn't enter a number");
}

Nuestro primer cambio es que inicialmente estamos configurando el int entrada a cero antes de que intentemos establecerlo en el resultado del análisis de la entrada de texto del usuario. Hay una razón específica por la que primero establecí el valor en cero y luego lo establecí en otra cosa más tarde.

Tenga en cuenta que después de try línea, el código que queremos probar está entre corchetes como estos:

{
}

En C# y muchos lenguajes similares, usamos corchetes para abarcar o limitar el alcance de ciertas acciones, operaciones o incluso ciclos de vida variables. Generalmente, las variables solo sobreviven dentro de estos corchetes. Cuando la ejecución de nuestro código sale de un conjunto de estos corchetes, cualquier variable dentro de él desaparece (a veces se denomina salir del alcance).

Verá los mismos corchetes después de catch línea, también, que es una instrucción de que lo que esté dentro de las llaves debe ejecutarse solo si detectamos un error o una excepción. El código dentro de corchetes a menudo se denomina bloque de código .

Lo que esto significa es que si hubiéramos creado el int entrada dentro del try bloque de código, entonces la variable simplemente desaparecería una vez que hayamos pasado el try bloque de código, y ya no pudimos acceder a él para verificar si coincide con nuestro valor secreto. Trabajaré en un ejemplo de nuestro código para mostrarle lo que quiero decir. Tenga en cuenta en la Figura 1 a continuación cómo no defino el int entrada hasta que estemos dentro de los corchetes de nuestro try declaración.

Figura 1:Alcance variable

Ah, y observe que tengo una línea que comienza con // . En C#, las barras dobles indican que todo lo que viene después y hasta el final de la línea es un comentario que no forma parte del programa. El compilador simplemente ignorará esas líneas.

.
Para probar nuestro programa, podemos poner un punto de interrupción dentro del catch corchetes en Console.WriteLine línea, y luego ejecutar nuestro programa. Ingrese una entrada no numérica para verificar que, en lugar de fallar, el programa ahora entra en catch bloque de código y, finalmente, muestra el mensaje de error al usuario, como puede ver en la Figura 2.

Figura 2:¡Excepción capturada!

.

Condiciones

Ahora, este código es bastante inútil tal como está escrito actualmente porque estamos leyendo un valor, pero, excepto para decirle al usuario si comete un error, no estamos usando el valor para nada. Puede probar esto y ver que si ingresa un número, digamos 7, el punto de interrupción no se alcanza.

Para que nuestro código sea útil como juego de adivinanzas, debemos comprobar si hemos adivinado el número correcto. Aquí, necesitamos introducir un nuevo concepto de control de flujo llamado condición .

Una condición es un bloque de código que se ejecuta solo si se cumple una determinada regla o conjunto de reglas. Empezamos tales condiciones con la palabra if y seguirlo con la regla o conjunto de reglas que estamos revisando entre paréntesis, que luego es seguido por el bloque de código que queremos ejecutar.

if (condition is met) 
{
    // execute this code block
}

Hay, por supuesto, reglas de sintaxis muy estrictas sobre cómo podemos formatear estas condiciones, y no son necesariamente tan intuitivas como podrían ser. Por ejemplo, para comparar valores, debe usar dos signos iguales en C# y, a veces, tres en JavaScript. (Recuerde que usar un signo igual es la forma de asignar un valor.)

if (value == other_value) // example value comparison

Puede utilizar una amplia gama de operadores de comparación y el resto son un poco más intuitivos. Por ejemplo, como en las matemáticas normales, puede usar mayor que (>) y menor que (<) y combinarlos con signos de igual para crear condiciones de mayor o igual (>=) o menor o igual (<=).

También puede crear condiciones negativas. En muchos lenguajes de programación, se indica un operador negativo con el signo de exclamación (!), que a menudo también se denomina "bang". Por ejemplo, si desea crear una condición que se ejecute si dos valores no son iguales, puede escribir:

if (value != other_value)

También puede crear múltiples condiciones separando las diferentes condiciones usando && (doble ampersand) para condiciones "Y" o || (tubos dobles) para condiciones "OR".

if (value1 == other_value && value2 == other_value) … 
//means both value1 and value2 must be equal to other_value

if (value1 == other_value || value2 == other_value) … 
//means either value1 or value2 must be equal to other_value

Usando una condición, ahora podemos crear una prueba para ver si el jugador ha adivinado el número correcto. Agregue las siguientes líneas después del último corchete de catch bloque de código:

if (input == 3)
{
    Console.WriteLine("Congratulations! You guessed correctly!");
}

Esta condición prueba si input (el valor que el usuario ha ingresado) es igual a 3. Si se cumple esta condición, el juego mostrará una nota de felicitación, como se muestra en la Figura 3.

Figura 3:Condición cumplida, Felicitaciones otorgadas

Si el usuario no adivina el número 3, nuestro programa no muestra nada más y la aplicación se cierra.

Recuerde que puede colocar puntos de interrupción en cualquier parte de su código para detener la ejecución y ver los resultados de lo que está haciendo. Haremos exactamente eso para ver los resultados de los cambios que haremos en nuestro código de ahora en adelante.

.
Sería bueno, sin embargo, si pudiéramos mostrar otro mensaje si el usuario no adivina el número correcto. Afortunadamente, las condiciones también permiten este comportamiento a través de else palabra clave.

El else la palabra clave debe ir directamente después de un if bloque de código y establece lo que debería suceder si la condición entre paréntesis de un if declaración no se cumple. Para probar esto, agregue las siguientes líneas después de if bloque:

else
{
    Console.WriteLine("No, sorry, that wasn't it. Better luck next time!");
}

Todos sus bloques de código condicional ahora deberían verse como la Figura 4 a continuación.

Figura 4:Código del programa del juego de adivinanzas con bloques de código condicional

Cuando ejecutes tu programa, dependiendo de si aciertas 3, recibirás una felicitación o un estímulo para volver a intentarlo. Llamamos a este tipo de control de flujo ramificación condicional porque el programa va a una u otra rama según las condiciones que le pongas.

Aumentemos un poco las probabilidades para cualquiera que no sepa que el número mágico siempre es 3. Permitiremos múltiples intentos de adivinación si el jugador no adivina correctamente.
.

Dar vueltas

Para lograr esta nueva funcionalidad, necesitamos implementar algo llamado bucle . En programación, un bucle es un bloque de código que se ejecuta repetidamente. Dos tipos de bucle muy comunes son for bucles y mientras bucles.

El mejor uso para for Los bucles son cuando tienes un número específico de veces que quieres que suceda algo. Comencemos con eso en nuestro código y veamos a dónde nos lleva.

En un for bucle, necesita la palabra clave for seguido de un bloque entre paréntesis que contiene tres piezas de información.

Primero, definimos el entorno de inicio para nuestro bucle, que incluye las variables que queremos usar para realizar un seguimiento de cuántas veces se ha ejecutado nuestro bloque de código. En segundo lugar, queremos una condición que determine si debemos continuar con el bucle. Finalmente, tenemos los cambios que queremos hacer en las condiciones del ciclo cada vez que ejecutamos el ciclo. Veamos un ejemplo.

for (int i = 0; i < 3; i++)
{
    // This code block will execute three times.
}

Lo importante aquí es la primera línea. Fíjate en los puntos y comas que separan las tres partes que mencioné. Así es como se desglosa cada parte:

int i=0; // Initialization: Creates an integer variable called "i" and sets it to 0.
i<3; // Condition: Continue executing as long as "i" is less than 3.
i++ // Change happening during each loop: "i" increases by one each time the loop runs.

El i++ notación es una abreviatura para escribir i=i+1 , que establece i al valor de i más uno, en otras palabras, aumenta i por uno. Podrías haber escrito i=i+1 también, pero este patrón en particular es muy, muy común en la programación, así que lo muestro como un ejemplo útil.

Lo que pongas en el bloque que sigue al for la declaración del bucle ocurrirá siempre que se cumpla la condición, en este caso, tres veces. Por ejemplo, puede agregar un Console.WriteLine() dentro del bloque de código y se repetirá tres veces, como en la Figura 5 a continuación.

for (int i = 0; i < 3; i++)
{
    Console.WriteLine("I am in a loop!");
}

Figura 5:"¡Estoy en un bucle!"

Queremos usar este tipo de ciclo para permitir que el usuario tenga múltiples intentos para adivinar el número correcto. Entonces, podemos envolver todo el programa que ya hemos escrito dentro de un for bucle como se describe arriba. El código ahora debería parecerse a la Figura 6 a continuación.

Figura 6:Ciclo de adivinanzas

Por supuesto, si adivina el número correcto antes de llegar a los tres intentos, no tiene sentido seguir adivinando. Como tal, estamos a punto de hacer algo muy malo...

Recuerde que la condición para la continuación de la ejecución es que i permanece por debajo de 3. Entonces, si queremos detener el ciclo, simplemente podemos aumentar i a 3 o más para detener el bucle. Si agrega i = 3 dentro del bloque que se ejecuta si el usuario adivina correctamente, como se muestra en la Figura 7 a continuación, el juego se detendrá una vez que el usuario adivine 3.

Figura 7:Cortocircuito del bucle For

Es posible que no entienda por qué es una mala idea y, en realidad, es más un argumento filosófico que técnico. Sin embargo, es un argumento importante, así que hagámoslo.

Un for loop está diseñado para ejecutarse un número específico de veces. Si no sabe de antemano cuántas veces va a ejecutar el ciclo, entonces un for bucle es una mala elección. Hay otras formas de bucle que se adaptan mejor a esta tarea, por lo que usar un for loop está eligiendo la herramienta incorrecta para el trabajo.

Este argumento puede parecer insignificante y pedante. El programa funciona bien tal como está y hace exactamente lo que esperas.

Sin embargo, la mente del programador debe esforzarse por lograr la claridad, y este ejemplo ciertamente no es claro. Mirando la primera línea de nuestro código actual, cree que es un ciclo que se ejecuta tres veces, pero luego "engañamos" al ciclo en el medio para que el ciclo pueda ejecutarse entre una y tres veces; no hay forma de que lo sepamos. Hemos roto la claridad de lo que sucederá, y eso es algo malo.

Incluso si no te importa que nadie lea tu código, recuerda que, como programadores, trabajamos con máquinas que son incapaces de comprender la intención. Entiende exactamente sólo lo que decimos. Si no lo tenemos claro, aumenta la probabilidad de que obtengamos resultados inesperados. Corremos el riesgo de crearnos problemas en el futuro cuando los programas se vuelven más complejos.

Como tal, necesitamos encontrar un mejor enfoque, y ese mejor enfoque es un while bucle.
.

Un bucle while

Un while el bucle se ejecuta mientras una condición es verdadera. No importa cuántas veces sea eso:siempre que la condición sea verdadera, el ciclo continúa.

Un while loop es más simple en la declaración que un for loop y comprende la palabra clave while seguido de un paréntesis de apertura, las condiciones y un paréntesis de cierre.

while (condition) 
{
    // Code to execute
}

Esta ejecución puede ser muy peligrosa si no tienes unas condiciones claras. Si comete un error o no tiene debidamente en cuenta todas las condiciones y eventos, su programa puede volverse loco y hacer que su máquina se detenga.

El peligro radica en asegurarse de invalidar la condición dentro del bloque de código cuando desea que se detenga la ejecución. De lo contrario, el ciclo se ejecutará para siempre.

Cambiemos nuestro for bucle a un while loop y déjelo correr mientras el usuario no haya adivinado tres veces. Podemos crear esta condición declarando un int i=0; antes de que comience el ciclo y luego establecer el valor de i dentro del bucle. Actualice su código como tal:

static void Main(string[] args)
{
    int i=0;
    while(i < 3)
    {
        Console.WriteLine("Guess a number between 1 and 10:");
        string text = Console.ReadLine();
        int input = 0;
        try
        {
            input = int.Parse(text);
        }
        catch
        {
            Console.WriteLine("Whoops, you didn't enter a number");
        }
        if (input == 3)
        {
            Console.WriteLine("Congratulations! You guessed correctly!");
            i = 3;
        }
        else
        {
            Console.WriteLine("No, sorry, that wasn't it. Better luck next time!");
        }
    }
}

Tenga en cuenta que hay un error en este código, que muestra lo fácil que es crear bucles infinitos. No estamos aumentando i ¡a menos que adivinemos correctamente! En otras palabras, el jugador tiene infinitos intentos, ¡pero no hay forma de dejar de adivinar si no lo hace correctamente!

Afortunadamente, si inicia este programa, sabe que la respuesta está fijada en 3, por lo que puede adivinar eso, pero salvo eso, es posible que tenga un gran problema en su mano.

Digo esto para no asustarte de usar while bucles, sino más bien para inculcar un sentido de respeto por su poder. While Los bucles son muy potentes y útiles, pero también pueden ser peligrosos si no se tiene cuidado.

Para solucionar su problema, agregue i++; como la primera línea dentro del bloque de código while, inmediatamente antes de Console.WriteLine("Guess a number between 1 and 10:") . Su código ahora debería funcionar como se esperaba, ser muy claro y brindarle un juego de adivinanzas muy básico pero aburrido.
.

Una vista previa de la orientación de objetos

Entonces, ¿qué podemos hacer para que este juego sea remotamente interesante? Lo sé, ¡hagamos que el número secreto sea aleatorio!

Me contuve haciendo esto porque necesitamos introducir algunas ideas nuevas para crear números aleatorios. Estas ideas quedarán claras en el próximo artículo que trata sobre la orientación a objetos. Por ahora, déjame darte el código y te explicaré en detalle lo que hace en el último artículo de esta serie.

static void Main(string[] args)
{
    Random random = new Random(); // Object orientation stuff
    int answer = random.Next(10)+1; // Give me a random number less than 10 and add one
    int i = 0;
    while (i < 3)
    {
        i++;
        Console.WriteLine("Guess a number between 1 and 10:");
        string text = Console.ReadLine();
        int input = 0;
        try
        {
            input = int.Parse(text);
        }
        catch
        {
            Console.WriteLine("Whoops, you didn't enter a number");
        }
        if (input == answer)
        {
            Console.WriteLine("Congratulations! You guessed correctly!");
            i = 3;
        }
        else
        {
            Console.WriteLine("No, sorry, that wasn't it. Better luck next time!");
        }
    }
}

Ahora hay dos líneas nuevas y una línea cambiada. Las nuevas líneas crean un entero aleatorio answer entre 1 y 10, y en la línea cambiada comparamos lo que adivina el usuario con esa respuesta aleatoria.

No se preocupe por la generación aleatoria por ahora, lo explicaré en el próximo artículo. Pero por ahora, ¡felicidades, eres oficialmente un desarrollador de juegos además de programador! Siéntase libre de jugar el juego ahora y ver cómo le va. Deberías ganar el juego, en promedio, 3 de cada 10 veces.

Como ejercicio adicional para usted, ¿por qué no agrega un mensaje después de que finaliza el juego que le dice al jugador cuál era el número secreto? Sin embargo, por ahora, terminemos y repasemos lo que hemos cubierto.
.

Resumen

En este artículo, ha aprendido sobre el flujo del programa y cómo puede controlar el flujo de su programa. Ha aprendido acerca de las excepciones para el manejo de errores. Has aprendido sobre bloques de código y bifurcaciones condicionales con if y else . También has aprendido acerca de los bucles con for y while .

En el próximo artículo, dedicaremos un poco de tiempo a pulir el juego y también analizaremos la orientación de objetos con más detalle.

Serie de procedimientos

Esta es la parte 4 de una serie de 5 partes de Introducción a la programación

  1. Introducción a la programación:Primeros pasos
  2. Introducción a la programación:tu primer programa
  3. Introducción a la programación:variables, tipos y manipulación de datos
  4. Introducción a la programación:control de flujo
  5. Introducción a la programación:programación orientada a objetos

Linux
  1. Lenguaje de programación C - Introducción

  2. Cómo empezar a aprender un lenguaje de programación

  3. Cómo instalar el lenguaje de programación Nim en Linux

  4. ¿Cómo redirigir la salida de un programa a un archivo zip?

  5. Cómo:Programación de sockets en Python

Cómo:Introducción a la Programación – Programación Orientada a Objetos

Cómo:Introducción a la programación:variables, tipos y manipulación de datos

Maneras brillantes de cómo ejecutar un programa en Linux

Cómo instalar el lenguaje de programación Go en Ubuntu 20.04

Cómo instalar el lenguaje de programación Rust en AlmaLinux 8

Cómo escribir y ejecutar un programa C en Linux