Hemos visto cómo comprobar condiciones, pero no cómo hacer que una cierta parte de un programa se repita un cierto número de veces o mientras se cumpla una condición (lo que llamaremos un "bucle"). En C tenemos varias formas de conseguirlo.
Si queremos hacer que una sección de nuestro programa se repita mientras se cumpla una cierta condición, usaremos la orden "while". Esta orden tiene dos formatos distintos, según comprobemos la condición al principio o al final del bloque repetitivo.
En el primer caso, su sintaxis es
while (condición)
sentencia;
Es decir, la sentencia se repetirá mientras la condición sea cierta. Si la condición es falsa ya desde un principio, la sentencia no se ejecuta nunca. Si queremos que se repita más de una sentencia, basta agruparlas entre llaves: { y }. Como ocurria con "if", puede ser recomendable incluir siempre las llaves, aunque sea una única sentencia, para evitar errores posteriores difíciles de localizar.
Un ejemplo que nos diga si cada número que tecleemos es positivo o negativo, y que termine cuando tecleemos el número 0, podría ser:
/* ej030101.c */
/* La orden "while" */
/* Ejemplo del apartado 3.1 */
/* Curso de C, Nacho Cabanes */
#include
int main()
{
int numero;
printf("Teclea un número (0 para salir): ");
scanf("%d", &numero);
while (numero!=0)
{
if (numero > 0) printf("Es positivo. ");
else printf("Es negativo. ");
printf("Teclea otro número (0 para salir): ");
scanf("%d", &numero);
}
return 0;
}
En este ejemplo, si se introduce 0 la primera vez, la condición es falsa y ni siquiera se entra al bloque del "while", terminando el programa inmediatamente.
Nota: si recordamos que una condición falsa se evalúa como el valor 0 y una condición verdadera como una valor distinto de cero, veremos que ese "while (numero != 0)" se podría abreviar como "while (numero)".
Ejercicio propuesto 3.1.1: Crea un programa que pida al usuario su contraseña (numérica). Deberá terminar cuando introduzca como contraseña el número 1111, pero volvérsela a pedir tantas veces como sea necesario.
Ejercicio propuesto 3.1.2: Crea un "calculador de cuadrados": pedirá al usuario un número y mostrará su cuadrado. Se repetirá mientras el número introducido no sea cero (usa "while" para conseguirlo).
Ejercicio propuesto 3.1.3: Crea un programa que pida de forma repetitiva pares de números al usuario. Tras introducir cada par de números, responderá si el primer número es múltiplo del segundo. Se repetirá mientras los dos sean distintos de cero (terminará cuando uno de ellos sea cero).
Ejercicio propuesto 3.1.4: Crea una versión mejorada del programa anterior, que, tras introducir cada par de números, responderá si el primero es múltiplo del segundo, o el segundo es múltiplo del primero, o ninguno de ellos es múltiplo del otro.
Ahora que sabemos "repetir" cosas, podemos utilizarlo también para contar. Por ejemplo, si queremos contar del 1 al 5, usaríamos una variable que empezase en 1, que aumentaría una unidad en cada repetición y se repetiría hasta llegar al valor 5, así:
/* ej030102.c */
/* Contador con "while" */
/* Ejemplo del apartado 3.1 */
/* Curso de C, Nacho Cabanes */
#include
int main()
{
int n = 1;
while (n < 6)
{
printf("%d ", n);
n = n + 1;
}
return 0;
}
Y esta misma estructura se puede emplear también para hacer algo varias veces, aunque no se muestre el valor del contador en pantalla, como en este ejemplo, que escribe 5 letras X:
/* ej030103.c */
/* Mostrar varias X con "while" */
/* Ejemplo del apartado 3.1 */
/* Curso de C, Nacho Cabanes */
#include
int main()
{
int n = 1;
while (n < 6)
{
printf("X");
n = n + 1;
}
return 0;
}
Ejercicio propuesto 3.1.5: Crea un programa que escriba en pantalla los números del 1 al 10, usando "while".
Ejercicio propuesto 3.1.6: Crea un programa que escriba en pantalla 10 asteriscos, usando "while".
Ejercicio propuesto 3.1.7: Crea un programa que escriba en pantalla los números pares del 26 al 10 (descendiendo), usando "while".
Ejercicio propuesto 3.1.8: Haz un programa que calcule cuantas cifras tiene un número entero positivo (pista: se puede hacer dividiendo varias veces entre 10).