3.2. Estructuras repetitivas
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.
3.2.1. while
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.
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 { y }.
Un ejemplo que nos diga si cada número que tecleemos es positivo o negativo, y que pare cuando tecleemos el número 0, podría ser:
/*---------------------------*/ /* Ejemplo en C# nº 22: */ /* ejemplo22.cs */ /* */ /* La orden "while" */ /* */ /* Introduccion a C#, */ /* Nacho Cabanes */ /*---------------------------*/ using System; public class Ejemplo22 { public static void Main() { int numero; Console.Write("Teclea un número (0 para salir): "); numero = Convert.ToInt32(Console.ReadLine()); while (numero != 0) { if (numero > 0) Console.WriteLine("Es positivo"); else Console.WriteLine("Es negativo"); Console.WriteLine("Teclea otro número (0 para salir): "); numero = Convert.ToInt32(Console.ReadLine()); } } }
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.
Ejercicios propuestos:
- Crear un programa que pida al usuario su contraseña. Deberá terminar cuando introduzca como contraseña la palabra "clave", pero volvérsela a pedir tantas veces como sea necesario.
- Crea un programa que escriba en pantalla los números del 1 al 10, usando "while".
- Crea un programa que escriba en pantalla los números pares del 26 al 10 (descendiendo), usando "while".
- Crear un programa calcule cuantas cifras tiene un número entero positivo (pista: se puede hacer dividiendo varias veces entre 10).
3.2.2. do ... while
Este es el otro formato que puede tener la orden "while": la condición se comprueba al final. El punto en que comienza a repetirse se indica con la orden "do", así:
do sentencia; while (condición);
Al igual que en el caso anterior, si queremos que se repitan varias órdenes (es lo habitual), deberemos encerrarlas entre llaves.
Como ejemplo, vamos a ver cómo sería el típico programa que nos pide una clave de acceso y no nos deja entrar hasta que tecleemos la clave correcta:
/*---------------------------*/ /* Ejemplo en C# nº 23: */ /* ejemplo23.cs */ /* */ /* La orden "do..while" */ /* */ /* Introduccion a C#, */ /* Nacho Cabanes */ /*---------------------------*/ using System; public class Ejemplo23 { public static void Main() { int valida = 711; int clave; do { Console.Write("Introduzca su clave numérica: "); clave = Convert.ToInt32(Console.ReadLine()); if (clave != valida) Console.WriteLine("No válida!\n"); } while (clave != valida); Console.WriteLine("Aceptada.\n"); } }
En este caso, se comprueba la condición al final, de modo que se nos preguntará la clave al menos una vez. Mientras que la respuesta que demos no sea la correcta, se nos vuelve a preguntar. Finalmente, cuando tecleamos la clave correcta, el ordenador escribe "Aceptada" y termina el programa.
Si preferimos que la clave sea un texto en vez de un número, los cambios al programa son mínimos:
/*---------------------------*/ /* Ejemplo en C# nº 24: */ /* ejemplo24.cs */ /* */ /* La orden "do..while" (2) */ /* */ /* Introduccion a C#, */ /* Nacho Cabanes */ /*---------------------------*/ using System; public class Ejemplo24 { public static void Main() { string valida = "secreto"; string clave; do { Console.Write("Introduzca su clave: "); clave = Console.ReadLine(); if (clave != valida) Console.WriteLine("No válida!\n"); } while (clave != valida); Console.WriteLine("Aceptada.\n"); } }
Ejercicios propuestos:
- Crear un programa que pida números positivos al usuario, y vaya calculando la suma de todos ellos (terminará cuando se teclea un número negativo o cero).
- Crea un programa que escriba en pantalla los números del 1 al 10, usando "do..while".
- Crea un programa que escriba en pantalla los números pares del 26 al 10 (descendiendo), usando "do..while".
- Crea un programa que pida al usuario su nombre y su contraseña, y no le permita seguir hasta que introduzca como nombre "Pedro" y como contraseña "Peter".
3.2.3. for
Ésta es la orden que usaremos habitualmente para crear partes del programa que se repitan un cierto número de veces. El formato de "for" es
for (valorInicial; CondiciónRepetición; Incremento) Sentencia;
Así, para contar del 1 al 10, tendríamos 1 como valor inicial, <=10 como condición de repetición, y el incremento sería de 1 en 1. Por tanto, el programa quedaría:
/*---------------------------*/ /* Ejemplo en C# nº 25: */ /* ejemplo25.cs */ /* */ /* Uso básico de "for" */ /* */ /* Introduccion a C#, */ /* Nacho Cabanes */ /*---------------------------*/ using System; public class Ejemplo25 { public static void Main() { int contador; for (contador=1; contador<=10; contador++) Console.Write("{0} ", contador); } }
Recordemos que "contador++" es una forma abreviada de escribir "contador=contador+1", de modo que en este ejemplo aumentamos la variable de uno en uno.
Ejercicios propuestos:
- Crear un programa que muestre los números del 15 al 5, descendiendo (pista: en cada pasada habrá que descontar 1, por ejemplo haciendo i--).
- Crear un programa que muestre los primeros ocho números pares (pista: en cada pasada habrá que aumentar de 2 en 2, o bien mostrar el doble del valor que hace de contador).
- Crear un programa que muestre las letras minúsculas de la "b" a la "w".
En un "for", realmente, la parte que hemos llamado "Incremento" no tiene por qué incrementar la variable, aunque ése es su uso más habitual. Es simplemente una orden que se ejecuta cuando se termine la "Sentencia" y antes de volver a comprobar si todavía se cumple la condición de repetición.
Por eso, si escribimos la siguiente línea:
for (contador=1; contador<=10; )
la variable "contador" no se incrementa nunca, por lo que nunca se cumplirá la condición de salida: nos quedamos encerrados dando vueltas dentro de la orden que siga al "for".
Un caso todavía más exagerado de algo a lo que se entra y de lo que no se sale sería la siguiente orden:
for ( ; ; )
Los bucles "for" se pueden anidar (incluir uno dentro de otro), de modo que podríamos escribir las tablas de multiplicar del 1 al 5 con:
/*---------------------------*/ /* Ejemplo en C# nº 26: */ /* ejemplo26.cs */ /* */ /* "for" anidados */ /* */ /* Introduccion a C#, */ /* Nacho Cabanes */ /*---------------------------*/ using System; public class Ejemplo26 { public static void Main() { int tabla, numero; for (tabla=1; tabla<=5; tabla++) for (numero=1; numero<=10; numero++) Console.WriteLine("{0} por {1} es {2}", tabla, numero, tabla*numero); } }
En estos ejemplos que hemos visto, después de "for" había una única sentencia. Si queremos que se hagan varias cosas, basta definirlas como un bloque (una sentencia compuesta) encerrándolas entre llaves. Por ejemplo, si queremos mejorar el ejemplo anterior haciendo que deje una línea en blanco entre tabla y tabla, sería:
/*---------------------------*/ /* Ejemplo en C# nº 27: */ /* ejemplo27.cs */ /* */ /* "for" anidados (2) */ /* */ /* Introduccion a C#, */ /* Nacho Cabanes */ /*---------------------------*/ using System; public class Ejemplo27 { public static void Main() { int tabla, numero; for (tabla=1; tabla<=5; tabla++) { for (numero=1; numero<=10; numero++) Console.WriteLine("{0} por {1} es {2}", tabla, numero, tabla*numero); Console.WriteLine(); } } }
Para "contar" no necesariamente hay que usar números. Por ejemplo, podemos contar con letras así:
/*---------------------------*/ /* Ejemplo en C# nº 28: */ /* ejemplo28.cs */ /* */ /* "for" que usa "char" */ /* */ /* Introduccion a C#, */ /* Nacho Cabanes */ /*---------------------------*/ using System; public class Ejemplo28 { public static void Main() { char letra; for (letra='a'; letra<='z'; letra++) Console.Write("{0} ", letra); } }
En este caso, empezamos en la "a" y terminamos en la "z", aumentando de uno en uno.
Si queremos contar de forma decreciente, o de dos en dos, o como nos interese, basta indicarlo en la condición de finalización del "for" y en la parte que lo incrementa:
/*---------------------------*/ /* Ejemplo en C# nº 29: */ /* ejemplo29.cs */ /* */ /* "for" que descuenta */ /* */ /* Introduccion a C#, */ /* Nacho Cabanes */ /*---------------------------*/ using System; public class Ejemplo29 { public static void Main() { char letra; for (letra='z'; letra>='a'; letra--) Console.Write("{0} ", letra); } }
Ejercicios propuestos:
- Crear un programa que muestre las letras de la Z (mayúscula) a la A (mayúscula, descendiendo).
- Crear un programa que escriba en pantalla la tabla de multiplicar del 5.
- Crear un programa que escriba en pantalla los números del 1 al 50 que sean múltiplos de 3 (pista: habrá que recorrer todos esos números y ver si el resto de la división entre 3 resulta 0).