Manual de Programación en C: Sentencias de control de flujo


Hasta ahora todos los programas que hemos hecho eran lineales. Las lineas de código se iban ejecutando una a una en orden hasta que el programa acababa. Esto hace que sea imposible programar algunas situaciones. ¿Cómo hacemos por ejemplo que el usuario teclee una letra y haga una cosa u otra dependiendo de la tecla que haya pulsado? Pensemos por ejemplo en un videojuego. Un videojuego tiene un bucle principal que se ejecuta de forma indefinida, se sigue ejecutando hasta que apagas la consola o sales del juego, esto es porque necesita comprobar ciertas cosas continuamente, por ejemplo cada ciclo comprueba si hemos pulsado un botón y si lo hemos hecho hace tal cosa.

Esto solo es posible con sentencias. Yo las voy a explicar con respecto a una distinción que me he inventado y que no se si será correcta pero parece bastante lógica.

  • Sentencias condicionales: podrías decir que dividen el flujo del programa en varios, dependiendo de una condición y se ejecuta el que corresponda.
  • Bucles: repiten un bloque de código el número de veces que especifiquemos.
  • De salto, interrupción o salida: nos permiten saltar a distintas partes del código, interrumpir un bucle o bloque de código y salir del programa en cualquier momento.

Condicionales

Hay tres tipos de sentencia condicional: if-else-if, ? y switch.

if-else-if

if en inglés significa si (condicional, no sí de afirmación) y la estructura es la siguiente:

if (condición)
{

        lo que se ejecuta si se cumple la condición
}

Entre paréntesis va la condición que se expresa con operadores y comparadores que vimos en la entrega anterior. Por ejemplo, vamos a hacer un programa que crea dos variables de tipo «int», deja que el usuario meta un número en cada una y luego dice cuál es mayor.

#include <sdtio.h>
#include <stdlib.h>

int main(){

    int numero1;
    int numero2;
    printf("Introduce un número: ");
    scanf("%i", &numero1);
    printf("\nIntroduce otro número: ");
    scanf("%i", &numero2); printf("\n");

    if (numero1 > numero2)
    {
         printf("El primer número es mayor que el segundo\n");
    }
    return 0;
}

Vamos a lo que nos interesa, hasta el if deberías entender todo perfectamente, si no, repasa las entregas anteriores sobre variables e introducción (input) de datos.
El if también es muy simple, si se cumple la condición se ejecuta lo que haya entre «{» y «}». Si el primer número introducido es mayor que el segundo mostrará el mensaje del printf, si no el programa se acabrá sin mostrar nada.

¿Cómo podríamos hacer para que en el caso de que no se cumpla también nos muestre un mensaje? Esto lo hacemos con else y else if, else en inglés es «si no», de modo que la utilidad de else queda bastate evidente.

Un else después de un if significa: si la condición del if no se ha cumplido, entonces ejecuta esto:

if (condición)
{
        lo que se ejecuta si se cumple la condición
}
else
{
       lo que se ejecuta si no se cumple la condición
}

Vamos a coger el programa anterior y haremos que si no se cumple muestre el mensaje contrario.

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int numero1;
    int numero2;
    printf("Introduce un número: ");
    scanf("%i", &numero1);
    printf("\nIntroduce otro número: ");
    scanf("%i", &numero2); printf("\n");

    if (numero1 > numero2)
    {
       printf("El primer número es mayor que el segundo\n");
    }
    else
    {
        printf("El segundo número es mayor que el primero\n");
    }
    return 0;
}

Vemos que si no se cumple la condición, entonces se mostrará el mensaje que está dentro del «else».

Pero este programa tiene un fallo. ¿Qué pasa si el usuario mete los dos números iguales? No se mostrará ningún mensaje ya que los símbolos < y > miran si son menores o mayores, pero si son iguales no se cumplirá ninguna de las sentencias.

Arreglaremos esto con el último tipo de modificación de la sentencia if, el else-if, o si no, si. En C se puede poner un if después de un else para ponerle una condición al else. En el programa vemos entonces tres casos, que los números sean iguales, que el primero sea menor que el segundo y que el primero sea mayor que el segundo. Modificamos el código:

#include <stdio.h>
#include <stdlib.h>

int main()
{
int numero1;
int numero2;
printf("Introduce un número: ");
scanf("%i", &numero1);
printf("\nIntroduce otro número: ");
scanf("%i", &numero2); printf("\n");

if (numero1 > numero2)
{
     printf("El primer número es mayor que el segundo\n");
}
else if (numero1 < numero2)
{
     printf("El segundo número es mayor que el primero\n");
}
else
{
     printf("Los dos números son iguales\n");
}
return 0;
}

Así ya hemos conseguido que se muestre un texto en los tres casos. Fíjate que podríamos haber puesto:

if (numero1 > numero2)
{
      printf("El primer número es mayor que el segundo\n");
}
else if (numero1 < numero2)
{
      printf("El segundo número es mayor que el primero\n");
}
else if (numero1 == numero2)
{
printf("Los dos números son iguales\n");
}

Y el programa hará exactamente lo mismo, pero el else solo se ejecuta si no se ha cumplido el if anterior, de modo que si llega al final la única posibilidad es que los números sean iguales.

?

Este tipo de condicional es más simple y se usa cuando solo se quiere poner una condición y el resultado se puede ejecutar en una sola linea. Es como hacer if-else con un solo símbolo y de manera más directa. La estructura es:

condicion ? si_se_cumple : si_no_se_cumple;

Por ejemplo, este programa hará lo mismo que el que hemos hecho antes, escribirá una linea de texto diferente dependiendo de si dos números son mayores.

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int numero1;
    int numero2;
    printf("Introduce un número: ");
    scanf("%i", &numero1);
    printf("\nIntroduce otro número: ");
    scanf("%i", &numero2); printf("\n");

    (numero1 > numero2) ? printf("El primero es mayor que el segundo\n") : printf("El segundo es mayor que el primero\n");
    return 0;
}

Si se cumple la condición se ejecuta lo primero, si no se cumple se ejecuta lo segundo.

switch

Este último tipo se utiliza cuando se quiere hacer algo para cada valor de una variable pero hay demasiados valores por lo que hacer un if else if sería muy incómodo.

El uso de switch es el siguiente:

switch (variable)
{
        case valor1:
               Lo que se ejecuta si la variable tiene el valor1
               break; //sale del switch
        case valor2:
               Lo que se ejecuta si la variable tiene el valor2
               break;
        case valorN;
               Lo que se ejecuta si la variable tiene el valorN
               break;
        default:
               Lo que ejecuta si la variable no tiene ninguno de los valores especificados.
               break;
}

Vamos a ver cómo funciona haciendo un programa que nos pida la nota de nuestro último examen y nos de un mensaje según la nota que le metamos.

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int nota;
    printf("¿Qué nota has sacado: ");
    scanf("%i", &nota);

    switch (nota)
    {
         case 0:
              printf("¿Te han mandado la nota rodando?\n");
              break;
         case 1:
              printf("Dale las gracias al profesor por el punto que te ha regalado\n");
              break;
         case 2:
              printf("Ya tienes un patito\n");
              break;
         case 3:
              printf("Pusiste bien el nombre y la fecha\n");
              break;
         case 4:
              printf("Casi...\n");
              break;
         case 5:
              printf("Te conformas con lo mínimo, muy mal\n");
              break;
         case 6:
              printf("¿En tu colegio aprueban con un 6?\n");
              break;
         case 7:
              printf("No está mal, pero si quieres ser médico tendrás que currar más\n");
              break;
         case 8:
              printf("Esta nota ya no es tan fea\n");
              break;
         case 9:
              printf("Tiendes a la perfección\n");
              break;
         case 10:
              printf("Llegaste a la perfección\n");
              break;
         default:
              printf("Esa nota no existe cazurro, ¿o es que te han puesto un -1 de lo mal que lo hiciste?\n");
              break;
    }
    return 0;
}

Vemos que el programa nos muestra una serie de mensajes esperanzadores según la nota que hayamos sacado. Es muy importante poner el default al final con lo que se ejcutará si la variable no tiene ninguno de los valores que le pongamos. También es importante poner el break; al final de cada caso para que salga del bloque del switch, si no lo ponemos se ejecutará también el default, ya que este se ejecuta si se llega a él, y al poner el break; lo que hacemos es salir del bloque y que no se ejecute. Hasta aquí las sentencias condicionales.

Bucles

Supongamos que queremos hacer un programa que haga una misma cosa varias veces, por ejemplo, escribir todos los números del 1 al 100, podríamos hacer 100 printfs, pero sería una pérdida de tiempo y un aburrimiento, para eso usaremos un bucle. Hay varios tipos de bucles que trabajan de forma diferente y los veremos todos.

for

El bucle for nos permite repetir una tarea un número de veces, el formato es el siguiente:

for ( dar valores ; condicion ; lo que hacer )
{
lo que se ejecuta
}

Por ejemplo, vamos a hacer un programa que imprima en la pantalla 10 veces la frase Hola Mundo con el número de frase antes. Esto ante lo teníamos que hacer escribiendo 10 veces una función printf con el mensaje, pero ahora podemos usar el bucle for para hacerlo de manera más sencilla:

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int i; //Usaremos esta variable para contar el número de veces

	for (i = 0; i < 10; i++)
	{
		printf("%i.- Hola mundo\n", i+1);
	}

	return 0;
}

Es un código bastante sencillo, lo primero es dar valores. Lo que pongamos aquí solo se ejecutará al comenzar el bucle, y le decimos que i sea igual a 0.
Lo segundo es la condición y lo tercero es lo que hacer si la condición se cumple. Si la condición se cumple entonces se ejecuta lo tercero y se da paso al bloque de código que hay entre { y }. Si no se cumple entonces se termina el bucle y se sigue con el código. Si i es menor de 10 le suma 1 a i y hace esa función printf, en cuanto i sea mayor o igual a 10, ya no se ejecutará el bucle, como cada vez le sumamos 1 (i++) se ejecutará diez veces.

while

while es parecido a for, solo que en este simplemente especificamos la condición, es útil si queremos hacer un bucle indefinido, su uso es:

while(condición)
{
	a ejecutar;
}

Por ejemplo vamos a hacer un programa que repita la misma frase hasta que pulsemos la tecla s.

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int i=0;

	while(i == 0)
	{
		char a;
		scanf(“%c”, &a);
		if(a == 's')
		{
			i = 1;
		}
		else
		{
			print(“Para salir del bucle pulsa la tecla s\n”);
		}
	}

	printf(“Pulsaste la tecla s\n”);
	return 0;
}

Repetirá lo mismo hasta que la variable a sea igual a s.

do {} while ();

Es similar a while, solo que este primero ejecuta y luego comprueba la condición.

do
{
	a ejecutar;
} while (condición);

Sentencias de salto.

goto

Esta función nos permite saltar a una linea del código en la que haya una etiqueta. Las etiquetas se definen con el nombre y dos puntos :
Vamos a ver como funciona, repitamos el ejemplo de antes del while, no sale hasta que no pulsa s, pero ahora usaremos goto.

inicio:
char letra;
printf(“\nPulsa s para salir: “);
scanf(“%c”, &letra);

if (letra != 's')
	goto inicio;

return 0;

break

La instrucción break nos sirve para salir de cualquier bloque de código, ya sea un if, un for, o lo que sea, por ejemplo, el programa anterior hecho con un break:

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int i=0;

	while(1) //Esto provoca un bucle infinito.
	{
		char a;
		scanf(“%c”, &a);
		if(a == 's')
		{
			break;
		}
		else
		{
			print(“Para salir del bucle pulsa la tecla s\n”);
		}
	}

	printf(“Pulsaste la tecla s\n”);
	return 0;
}

Observa que he puesto un 1 en el while, las comparaciones siempre devuelven un número, que puede ser 1 ó 0, si dentro del if, while, do while… hay un 0 no se cumple, si hay algo distinto de 0, se cumple, de modo que eso se cumplirá siempre.

Hasta aquí las sentencias, la próxima entrega será sobre funciones, las veremos más a fondo y cómo aplicarlas.

Recuerdo que para cualquier cosa podéis enviarme un correo, lo podéis encontrar en la sección Contacto, en el menú de arriba.

Licencia de Creative Commons
Manual de C by The Neowriter is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.

Esta entrada fue publicada en Manual de programación en C, Manuales, Manuales largos y etiquetada , , , , , , . Guarda el enlace permanente.

8 respuestas a Manual de Programación en C: Sentencias de control de flujo

  1. Pingback: Duda en cuanto a la sentencia switch y break

  2. Pingback: Duda en cuanto a While, Do while, If, etc (ejercicios)

  3. beto dijo:

    me encanta la manera en que das la informacion, he estado aprendiendo mucho de estos cursos. Aunque ya tenia un poco de conocimiento de visual basic pues me familiarizo con algunas cosas, pero aun asi esta muy bien explicado, no que otras fuentes solo te ponen la info y entiendele como puedas xd. Gracias bro.

  4. Jack simos dijo:

    jajjaj anda tio te Faltaron muchos puntos y coma! han q me sirvio tu informacion
    Sabes La mayoria de Gente No sabe Hacer un hack WolfTeamLS si pone un video de como haser un hack de eso apueto q tu canañ se llena en un 1 segundo ! tio bamos tio yo llamo gente ponte hasser un ahck wolftels ! por fi esneñanos como hases ! se q no es facil asiq tomte tu tiempo

  5. RoyCrespo dijo:

    Excelente explicación, muchas gracias por tu tiempo y dedicación…

  6. Rúl dijo:

    Excelente explicación, muy entendible, me encanto y me ha servido de mucho! Sigue así!

  7. Daniel dijo:

    Excelente amigo, de verdad me ha servidor de mucho, continua asi amigo, eres GRANDE!

Deja un comentario