Lenguaje de Programación C Parte 2

Anuncio
Lenguaje de Programación C
Parte 2
1
Contenidos
2. Instrucciones de control alternativas
2.1 Alternativa simple ( la instrución if )
Ejercicios de la instrucción alternativa simple (if) en lenguaje C
2.2 Alternativa doble ( la instrucción if…else )
Ejercicios de la instrucción alternativa doble (if else) en lenguaje C
2.3 Alternativa múltiple ( la instrucción switch )
Ejercicios de la instrucción alternativa múltiple (switch) en lenguaje C
2.4 Anidamiento
2.4.1 Alternativa doble en doble
2.4.2 Alternativa múltiple en doble
Ejercicios de anidamiento de instrucciones alternativas en lenguaje C
3. Instrucciones de control repetitivas
3.1 Repetitiva mientras ( la instrucción while )
Ejercicios de la instrucción repetitiva mientras (while) en lenguaje C
3.2 Repetitiva hacer...mientras ( la instrucción do..while )
Ejercicios de la instrucción repetitiva hacer...mientras (do...while) en lenguaje C
3.3 Repetitiva para ( la instrucción for )
3.3.1 ¿Cuándo usar un bucle u otro?
Ejercicios de la instrucción repetitiva para (for) en lenguaje C
3.4 Anidamiento
3.4.1 Bucle for en do...while
3.4.2 Alternativa simple en bucle for
Ejercicios de anidamiento de instrucciones alternativas y repetitivas en lenguaje C
4. Instrucciones de control de salto
4.1 Instrucción break
4.2 Instrucción continue
4.3 Instrucción goto
4.4 Instrucción return
4.5 Ventajas de no usar las instrucciones de salto
2
2. Instrucciones de control alternativas
2.1 Alternativa simple (la instrucción if )
Una instrucción alternativa simple (o simplemente alternativa simple) es una variante (más sencilla) de una instrucción
alternativa doble. En lenguaje C, para escribir una alternativa simple se utiliza la sintaxis:
if ( <expresión_lógica> )
{
<bloque_de_instrucciones>
}
Ejemplo: Se quiere escribir un programa que:
1º) Pida por teclado la nota (dato real) de una asignatura.
2º) Muestre por pantalla:
x
"APROBADO", en el caso de que la nota sea mayor o igual que 5.
Introduzca nota (real): 7.5
APROBADO
Obsérvese que, en este problema, no se va a mostrar por pantalla "SUSPENDIDO" en el caso de que la nota sea menor que 5,
como sí se hacía en el problema del apartado anterior.
Introduzca nota (real): 3.5
Al igual que ocurre con una instrucción alternativa doble, cuando el<bloque_de_instrucciones> de una alternativa
simple sólo contiene una instrucción, los caracteres abrir llave ({) y cerrar llave (}) también son opcionales. De modo que,
para resolver el problema del ejemplo se puede escribir:
#include <stdio.h>
int main()
{
float nota;
printf( "\n
Introduzca nota (real): " );
scanf( "%f", &nota );
if ( nota >= 5 )
printf( "\n
APROBADO" );
return 0;
}
Programa (.c): Calificación según nota (Versión 2)
3
Ejercicio 1 - Cambio de signo (Alternativa simple - Lenguaje C)
Escribir un programa (en lenguaje C) que:
1º) Pida por teclado un número (dato real).
2º) Muestre por pantalla el número introducido, pero, cambiado de signo y, sólo en el caso de que el número no
sea mayor o igual que cero.
En pantalla:
Introduzca número (real): -9.6
9.6
Introduzca número (real): 7.11
Ejercicio 2 - Media aritmética (Alternativa simple - Lenguaje C)
Escribir un programa (en lenguaje C) que:
1º) Pida por teclado dos números (datos enteros).
2º) Muestre por pantalla la media artimética de los números introducidos, pero, sólo en el caso de que ambos
números sean mayores que cero.
En pantalla:
Introduzca primer número (entero): 7
Introduzca segundo número (entero): 10
8.5
Introduzca primer número (entero): 6
Introduzca segundo número (entero): -2
4
2.2 Alternativa doble ( la instrucción if …else)
En lenguaje C, para escribir una instrucción alternativa doble se utiliza la sintaxis:
if ( <expresión_lógica> )
{
<bloque_de_instrucciones_1>
}
else
{
<bloque_de_instrucciones_2>
}
A la <expresión_lógica> de una instrucción alternativa doble también se le denomina condición.
Para que se ejecute el <bloque_de_instrucciones_1>, la condición tiene que ser verdadera. Por el contrario, si la
condición es falsa, se ejecutará el<bloque_de_instrucciones_2>.
En resumen, una instrucción alternativa doble (o simplemente alternativa doble) permite seleccionar, por medio de una
condición, el siguiente bloque de instrucciones a ejecutar, de entre dos posibles.
Ejemplo: Se quiere escribir un programa que:
1º) Pida por teclado la nota (dato real) de una asignatura.
2º) Muestre por pantalla:
x
x
"APROBADO", en el caso de que la nota sea mayor o igual que 5.
"SUSPENDIDO", en el caso de que la nota sea menor que 5.
De modo que, por pantalla se verá, por ejemplo:
Introduzca nota (real): 7.5
APROBADO
Otra posibilidad es:
Introduzca nota (real): 3.5
SUSPENSO
Cuando un bloque de instrucciones sólo contiene una instrucción, los caracteresabrir llave ({) y cerrar llave (}) son
opcionales. Por tanto, en lenguaje C, para resolver el problema del ejemplo se puede escribir:
5
#include <stdio.h>
int main()
{
float nota;
printf( "\n
Introduzca nota (real): " );
scanf( "%f", &nota );
if ( nota >= 5 )
printf( "\n
APROBADO" );
else
printf( "\n
SUSPENSO" );
return 0;
}
Programa (.c): Calificación según nota (Versión 1)
Cuando en el código fuente de un programa existe una condición de la cual depende que a continuación se ejecuten unas
instrucciones u otras, se dice que existe una bifurcación.
6
Ejercicio 1 - Suma de dos números (Alternativa doble - Lenguaje C)
Escribir un programa (en lenguaje C) que:
1º) Pida por teclado dos números (datos enteros).
2º) Calcule la suma de los números introducidos por el usuario.
3º) Muestre por pantalla:
x
"LA SUMA SÍ ES MAYOR QUE CERO.", en el caso de que sí lo sea.
"LA SUMA NO ES MAYOR QUE CERO.", en el caso de que no lo sea.
x
En pantalla:
Introduzca primer número (entero): 14
Introduzca segundo número (entero): -17
LA SUMA NO ES MAYOR QUE CERO.
Ejercicio 2 - Número intermedio (Alternativa doble - Lenguaje C)
Escribir un programa (en lenguaje C) que:
1º) Pida por teclado tres números (datos enteros): <numero1>, <numero2> y <numero3>.
2º) Muestre por pantalla:
x
x
"<numero2> SI ES MENOR QUE <numero3> Y MAYOR QUE <numero1>", en el caso de que sí lo sea.
"<numero2> NO ES MENOR QUE <numero3> Y MAYOR QUE <numero1>", en el caso de que no lo
sea.
En pantalla:
Introduzca primer número (entero): 6
Introduzca segundo número (entero): 9
Introduzca tercer número (entero): 22
9 SÍ ES MENOR QUE 22 Y MAYOR QUE 6
Introduzca primer número (entero): 15
Introduzca segundo número (entero): 7
Introduzca tercer número (entero): 8
7 NO ES MENOR QUE 8 Y MAYOR QUE 15
7
2.3 Alternativa múltiple ( la instrucción switch )
Una instrucción alternativa múltiple (o simplemente alternativa múltiple) permite seleccionar, por medio de una
expresión, el siguiente bloque de instrucciones a ejecutar de entre varios posibles. En lenguaje C, para escribir una alternativa
múltiple se utiliza la sintaxis:
switch ( <expresión> )
{
case <expresión_1> : [ <bloque_de_instrucciones_1>
[ break; ]
case <expresión_2> : [ <bloque_de_instrucciones_2>
[ break; ]
...
case <expresión_n> : [ <bloque_de_instrucciones_n>
[ break; ]
[ default : <bloque_de_instrucciones_n+1>
}
]
]
]
]
El resultado de evaluar la <expresión> debe ser un valor perteneciente a un tipo de dato finito y ordenado, es decir,
entero, lógico, carácter, enumerado o subrango.
Dependiendo del valor obtenido al evaluar la <expresión>, se ejecutará un bloque de instrucciones u otro.
Opcionalmente, se puede escribir un <bloque_de_instrucciones_n+1>después de default :. Este bloque de
instrucciones se ejecutará en el caso de que el valor obtenido al evaluar la <expresión>, no se encuentre en ninguna de las
expresiones después de cada case.
Ejemplo 1: Se quiere escribir un programa que:
1º) Pida por teclado el número (dato entero) de un día de la semana.
2º) Muestre por pantalla el nombre (dato cadena) correspondiente a dicho día.
Nota: Si el número de día introducido es menor que 1 ó mayor que 7, se mostrará el mensaje: "ERROR: Día incorrecto.".
En pantalla:
Introduzca dia de la semana: 2
Martes
Introduzca dia de la semana: 9
ERROR: Dia incorrecto.
8
Solución propuesta:
#include <stdio.h>
int main()
{
int dia;
printf( "\n
Introduzca dia de la semana: " );
scanf( "%d", &dia );
switch ( dia )
{
case 1 : printf( "\n
Lunes" );
break;
case 2 : printf( "\n
Martes" );
break;
case 3 : printf( "\n
Miercoles" );
break;
case 4 : printf( "\n
Jueves" );
break;
case 5 : printf( "\n
Viernes" );
break;
case 6 : printf( "\n
Sabado" );
break;
case 7 : printf( "\n
Domingo" );
break;
default : printf( "\n
ERROR: Dia incorrecto." );
}
return 0;
}
Programa (.c): Día de la semana
En la sintaxis de una instrucción alternativa múltiple, obsérvese que, después de cada bloque de instrucciones se puede
escribir, opcionalmente, la instrucción break. Dicha instrucción no se va a estudiar con detenimiento en este apartado, ya
que, de momento, basta con saber que en una instrucción switch, la escribiremos, casi siempre, después de cada bloque de
instrucciones, a excepción del último. Para comprender su funcionamiento, pruebe a ver que ocurre si omite algún break en
el código del programa del ejemplo 1.
Estúdiese también el siguiente ejemplo.
Ejemplo 2: En la siguiente tabla se muestran las categorías a las que pertenecen los signos
del zodíaco:
Se quiere escribir un programa que:
1º) Muestre el listado de los signos del zodíaco, con sus números asociados.
2º) Pida por teclado un número (dato entero) asociado a un signo del zodíaco.
3º) Muestre la categoría a la que pertenece el signo del zodíaco seleccionado.
Nota: Si el número introducido por el usuario, no está asociado a ningún signo del zodíaco,
se mostrará el mensaje: "ERROR: <número> no está asociado a ningún signo.".
En pantalla:
9
Listado de signos del zodiaco:
1. Aries
2. Tauro
3. Geminis
4. Cancer
5. Leo
6. Virgo
7. Libra
8. Escorpio
9. Sagitario
10. Capricornio
12. Acuario
13. Piscis
Introduzca numero de signo: 7
Es un signo de Aire.
Listado de signos del zodiaco:
1. Aries
2. Tauro
3. Geminis
4. Cancer
5. Leo
6. Virgo
7. Libra
8. Escorpio
9. Sagitario
10. Capricornio
12. Acuario
13. Piscis
Introduzca numero de signo: 15
ERROR: 15 no esta asociado a ningun signo.
Una posible solución es:
#include <stdio.h>
int main()
{
int numero;
printf(
printf(
printf(
printf(
printf(
printf(
printf(
printf(
printf(
printf(
printf(
printf(
printf(
printf(
"\n
"\n\n
"\n
"\n
"\n
"\n
"\n
"\n
"\n
"\n
"\n
"\n
"\n
"\n\n
Listado de signos del zodiaco:" );
1. Aries" );
2. Tauro" );
3. Geminis" );
4. Cancer" );
5. Leo" );
6. Virgo" );
7. Libra" );
8. Escorpio" );
9. Sagitario" );
10. Capricornio" );
11. Acuario" );
12. Piscis" );
Introduzca numero de signo: " );
scanf( "%d", &numero );
switch ( numero )
{
10
case
case
case
1 :
5 :
9 : printf( "\n
break;
case 2 :
case 6 :
case 10 : printf( "\n
break;
case 3 :
case 7 :
case 11 : printf( "\n
break;
case 4 :
case 8 :
case 12 : printf( "\n
break;
default : printf( "\n
Es un signo de Fuego." );
Es un signo de Tierra." );
Es un signo de Aire." );
Es un signo de Agua." );
ERROR: %d no esta asociado a ningun signo.", numero
);
}
return 0;
}
Programa (.c): Signo del zodíaco (Solución 1)
Otra solución es:
#include <stdio.h>
#include <string.h>
int main()
{
int numero;
char categoria[7];
printf(
printf(
printf(
printf(
printf(
printf(
printf(
printf(
printf(
printf(
printf(
printf(
printf(
printf(
"\n
"\n\n
"\n
"\n
"\n
"\n
"\n
"\n
"\n
"\n
"\n
"\n
"\n
"\n\n
Listado de signos del zodiaco:" );
1. Aries" );
2. Tauro" );
3. Geminis" );
4. Cancer" );
5. Leo" );
6. Virgo" );
7. Libra" );
8. Escorpio" );
9. Sagitario" );
10. Capricornio" );
11. Acuario" );
12. Piscis" );
Introduzca numero de signo: " );
scanf( "%d", &numero );
switch ( numero % 4 )
{
case 1 : strcpy( categoria,
break;
case 2 : strcpy( categoria,
break;
case 3 : strcpy( categoria,
break;
case 0 : strcpy( categoria,
}
"Fuego" );
"Tierra" );
"Aire" );
"Agua" );
if ( numero >= 1 && numero <= 12 )
printf( "\n
Es un signo de %s.", categoria );
else
printf( "\n
ERROR: %d no esta asociado a ningun signo.",
numero );
return 0;
}
Programa (.c): Signo del zodíaco (Solución 2)
11
En esta segunda solución existen las siguientes diferencias importantes con respecto a la solución anterior:
x
x
x
x
x
x
En el código se utiliza una alternativa doble (if), además de una alternativa múltiple (switch).
En la alternativa múltiple no se escribe el<bloque_de_instrucciones_n+1>.
La <expresión> de la alternativa múltiple es diferente.
La expresión "\n
Es un signo de " sólo se escribe una vez.
Se ha utilizado una variable más (un array de caracteres): categoria
Se ha empleado la función strcpy, que, como ya vimos en el apartado1.8 Operadores y expresiones, está
disponible en la biblioteca estándar de C.
Ejercicio 1 - Número del dado (Alternativa múltiple - Lenguaje C)
Escribir un programa (en lenguaje C) que:
1º) Pida por teclado el resultado (dato entero) obtenido al lanzar un dado de seis caras.
2º) Muestre por pantalla el número en letras (dato cadena) de la cara opuesta al resultado obtenido.
Nota 1: En las caras opuestas de un dado de seis caras están los números: 1-6, 2-5 y 3-4.
Nota 2: Si el número del dado introducido es menor que 1 ó mayor que 6, se mostrará el mensaje: "ERROR:
Número incorrecto.".
En pantalla:
Introduzca número del dado: 5
En la cara opuesta está el "dos".
Introduzca número del dado: 8
ERROR: Número incorrecto.
12
Ejercicio 2 - Habitaciones de una casa rural (Alternativa múltiple - Lenguaje C)
En la siguiente tabla se muestra el número de camas de las habitaciones de una casa rural, además de la planta
donde está ubicada cada una de ellas:
.
Camas
Planta
1. Azul
2
Primera
2. Roja
1
Primera
3. Verde
3
Segunda
4. Rosa
2
Segunda
5. Gris
1
Tercera
Escribir un programa (en lenguaje C) que:
1º) Muestre el listado de las habitaciones de la casa rural.
2º) Pida por teclado el número (dato entero) asociado a una habitación.
3º) Muestre por pantalla la planta y el número de camas de la habitación seleccionada.
Nota: Si el número introducido por el usuario, no está asociado a ninguna habitación, se mostrará el mensaje:
"ERROR: <número> no está asociado a ninguna habitación.".
En pantalla:
Listado de habitaciones:
1.
2.
3.
4.
5.
Azul
Roja
Verde
Rosa
Gris
Introduzca número de habitación: 3
La Verde tiene 3 cama/s y está en la segunda planta.
Listado de habitaciones:
1.
2.
3.
4.
5.
Azul
Roja
Verde
Rosa
Gris
Introduzca número de habitación: 7
ERROR: 7 no está asociado a ninguna habitación.
13
2.4 Anidamiento
Las instrucciones alternativas y repetitivas pueden escribirse una dentro de otra. A este hecho se le conoce
como anidamiento.
Las instrucciones alternativas permiten realizar las siguientes combinaciones de anidamiento:
x
x
Doble en doble.
Doble en simple.
Doble en múltiple.
Simple en simple.
Simple en doble.
Simple en múltiple.
Múltiple en múltiple.
Múltiple en doble.
Múltiple en simple.
x
x
x
x
x
x
x
De ellas, vamos a estudiar, como ejemplo, las siguientes combinaciones:
x
Doble en doble.
Múltiple en doble.
x
Ejercicio 1 - Suma o multiplicación de dos números (Anidamiento de alternativas - Lenguaje C)
Escribir un programa (en lenguaje C) que:
1º) Pida por teclado dos números (datos enteros).
2º) Calcule la suma y multiplicación de ambos números.
3º) Muestre por pantalla:
x
x
x
"La suma es mayor.", en caso de que sea mayor que la multiplicación de ambos números.
"La multpilicación es mayor.", en caso de que sea mayor que la suma de ambos números.
"La suma y multiplicación son iguales.", en caso de que así sea.
En pantalla:
Introduzca primer número (entero): -2
Introduzca segundo número (entero): 3
La suma es mayor.
Introduzca primer número (entero): 2
Introduzca segundo número (entero): 2
La suma y multiplicación son iguales.
14
Ejercicio 2 - Número del dado (Anidamiento de alternativas - Lenguaje C)
Escribir un programa (en lenguaje C) que resuelva el problema del Ejercicio 1 (Alternativa múltiple) anidando una
alternativa múltiple en una alternativa doble.
2.4.1 Alternativa doble en doble
En lenguaje C, para anidar una alternativa doble en otra, se utiliza la sintaxis:
if ( <expresión_lógica_1> )
{
/* Inicio del anidamiento */
if ( <expresión_lógica_2> )
{
<bloque_de_instrucciones_1>
}
else
{
<bloque_de_instrucciones_2>
}
/* Fin del anidamiento */
}
else
{
<bloque_de_instrucciones_3>
}
O también:
if ( <expresión_lógica_1> )
{
<bloque_de_instrucciones_1>
{
else
{
/* Inicio del anidamiento */
if ( <expresión_lógica_2> )
{
<bloque_de_instrucciones_2>
}
else
{
<bloque_de_instrucciones_3>
}
/* Fin del anidamiento */
}
15
Ejemplo: Se quiere escribir un programa que:
1º) Pida por teclado la nota (real) de una asignatura.
2º) Muestre por pantalla:
x
x
x
"APTO", en el caso de que la nota sea mayor o igual que 5 y menor o igual que 10.
"NO APTO", en el caso de que la nota sea mayor o igual que 0 y menor que 5.
"ERROR: Nota incorrecta.", en el caso de que la nota sea menor que 0 o mayor que 10.
En pantalla:
Introduzca nota (real): 7.5
APTO
Introduzca nota (real): 12.2
ERROR: Nota incorrecta.
Una solución al problema es:
#include <stdio.h>
int main()
{
float nota;
printf( "\n
Introduzca nota (real): " );
scanf( "%f", &nota );
if ( nota >= 5 && nota <= 10 )
printf( "\n
APTO" );
else
/* Inicio del anidamiento */
if ( nota >= 0 && nota < 5 )
printf( "\n
NO APTO" );
else
printf( "\n
ERROR: Nota incorrecta." );
/* Fin del anidamiento */
return 0;
}
Programa (.c): Calificación según nota (Versión 3)
Fíjese que, en este caso, se puede prescindir de los caracteres abrir llave ({) ycerrar llave (}) de la sintaxis, ya que, los
bloques de instrucciones sólo contienen una instrucción.
Como se puede observar, el anidamiento de instrucciones alternativas permite ir descartando valores hasta llegar al bloque de
instrucciones que se debe ejecutar.
16
2.4.2 Alternativa múltiple en doble
En lenguaje C, para anidar una alternativa múltiple en una alternativa doble, se utiliza la sintaxis:
if ( <expresión_lógica> )
{
/* Inicio del anidamiento */
switch ( <expresión> )
{
case <expresión_1> : [ <bloque_de_instrucciones_1>
[ break; ]
case <expresión_2> : [ <bloque_de_instrucciones_2>
[ break; ]
...
case <expresión_n> : [ <bloque_de_instrucciones_n>
[ break; ]
[ default : <bloque_de_instrucciones_n+1>
}
/* Fin del anidamiento */
]
]
]
]
}
else
{
<bloque_de_instrucciones_n+2>
}
Ejemplo: Así por ejemplo, el primer ejemplo del apartado 2.3 Alternativa múltiple, también se puede resolver anidando una
alternativa múltiple en una alternativa doble.
#include <stdio.h>
int main()
{
int dia;
printf( "\n
Introduzca dia de la semana: " );
scanf( "%d", &dia );
if ( dia >= 1 && dia <= 7 )
/* Sólo si el día es válido, se ejecuta la
instrucción alternativa múltiple */
/* Inicio del anidamiento
switch ( dia )
{
case 1 : printf( "\n
break;
case 2 : printf( "\n
break;
case 3 : printf( "\n
break;
case 4 : printf( "\n
break;
case 5 : printf( "\n
break;
case 6 : printf( "\n
break;
case 7 : printf( "\n
}
/* Fin del anidamiento */
else
printf( "\n
*/
Lunes" );
Martes" );
Miercoles" );
Jueves" );
Viernes" );
Sabado" );
Domingo" );
ERROR: Dia incorrecto." );
17
return 0;
}
Programa (.c): Día de la semana (Alternativa múltiple en doble)
Ejercicio 1 - Suma o multiplicación de dos números (Anidamiento de alternativas - Lenguaje C)
Escribir un programa (en lenguaje C) que:
1º) Pida por teclado dos números (datos enteros).
2º) Calcule la suma y multiplicación de ambos números.
3º) Muestre por pantalla:
x
x
x
"La suma es mayor.", en caso de que sea mayor que la multiplicación de ambos números.
"La multpilicación es mayor.", en caso de que sea mayor que la suma de ambos números.
"La suma y multiplicación son iguales.", en caso de que así sea.
En pantalla:
Introduzca primer número (entero): -2
Introduzca segundo número (entero): 3
La suma es mayor.
Introduzca primer número (entero): 2
Introduzca segundo número (entero): 2
La suma y multiplicación son iguales.
Ejercicio 2 - Número del dado (Anidamiento de alternativas - Lenguaje C)
Escribir un programa (en lenguaje C) que resuelva el problema del Ejercicio 1 (Alternativa múltiple) anidando una
alternativa múltiple en una alternativa doble.
18
3. Instrucciones de control repetitivas
3.1 Repetitiva mientras ( la instrucción while )
En lenguaje C, para escribir una instrucción repetitiva mientras se utiliza la sintaxis:
while ( <expresión_lógica> )
{
<bloque_de_instrucciones>
}
Cuando el <bloque_de_instrucciones> sólo contiene una instrucción, los caracteres abrir llave ({) y cerrar
llave (}) son opcionales.
Por otra parte, al igual que en las instrucciones alternativas doble y simple, a la<expresión_lógica> de una instrucción
repetitiva while, también se le llama condición.
Para que se ejecute el <bloque_de_instrucciones>, la condición tiene que ser verdadera. Por el contrario, si la
condición es falsa, el<bloque_de_instrucciones> no se ejecuta.
Por tanto, cuando el flujo de un programa llega a un bucle while, existen dos posibilidades:
1. Si la condición se evalúa a falsa, el bloque de instrucciones no se ejecuta, y el bucle while finaliza sin realizar
ninguna iteración.
2. Si la condición se evalúa a verdadera, el bloque de instrucciones sí que se ejecuta y, después, se vuelve a evaluar la
condición, para decidir, de nuevo, si el bloque de instrucciones se vuelve a ejecutar o no. Y así sucesivamente, hasta
que, la condición sea falsa.
El <bloque_de_instrucciones> de un bucle while puede ejecutarse cero o más veces (iteraciones). Si
el <bloque_de_instrucciones> se ejecuta al menos una vez, seguirá ejecutándose repetidamente, mientras que, la
condición sea verdadera. Pero, hay que tener cuidado de que el bucle no sea infinito.
Cuando la condición de un bucle while se evalúa siempre a verdadera, se dice que se ha producido un bucle infinito, ya
que, el programa nunca termina. Un bucle infinito es un error lógico.
Es importante hacer hincapié en el hecho de que, en un bucle while, primero se evalúa la condición y, en el caso de que ésta
sea verdadera, entonces se ejecuta el bloque de instrucciones. Veremos que, en el bucle do...while, el procedimiento es
al revés. En él, primero se ejecuta el bloque de instrucciones y, después, se evalúa la condición.
Para que un bucle while no sea infinito, en el bloque de instrucciones debe ocurrir algo para que la condición deje de
ser verdadera. En la mayoría de los casos, la condición se hace falsa al cambiar el valor de una variable.
En resumen, una instrucción repetitiva while permite ejecutar, repetidamente, (cero o más veces) un bloque de
instrucciones, mientras que, una determinada condición sea verdadera.
Ejemplo 1: Se quiere escribir un programa que muestre por pantalla los primeros diez números naturales:
1 2 3 4 5 6 7 8 9 10
En lenguaje C, para resolver el problema de este ejemplo se puede escribir:
19
#include <stdio.h>
int main()
{
int contador;
printf( "\n
" );
contador = 1; /* Inicialización
while ( contador <= 10 )
{
printf( "%d ", contador );
contador++;
/* Incremento
}
del contador */
/* Condición */
/* Salida */
del contador */
return 0;
}
Programa (.c): Números del 1 al 10 (while)
Ejemplo 2: Se quiere escribir un programa que:
1º) Pida por teclado la nota (dato real) de una asignatura.
2º) En el caso de que la nota sea incorrecta, muestre por pantalla el mensaje:
x
"ERROR: Nota incorrecta, debe ser >= 0 y <= 10".
3º) Repita los pasos 1º y 2º, mientras que, la nota introducida sea incorrecta.
4º) Muestre por pantalla:
x
x
"APROBADO", en el caso de que la nota sea mayor o igual que 5.
"SUSPENDIDO", en el caso de que la nota sea menor que 5.
En pantalla:
Introduzca nota (real): 12.4
ERROR: Nota incorrecta, debe ser >= 0 y <= 10
Introduzca nota (real): -3.3
ERROR: Nota incorrecta, debe ser >= 0 y <= 10
Introduzca nota (real): 8.7
APROBADO
El código propuesto es:
#include <stdio.h>
int main()
{
float nota;
printf( "\n
Introduzca nota (real): " );
scanf( "%f", &nota );
/* Si la primera nota introducida por el
usuario es correcta,
el bucle no itera ninguna vez. */
while ( nota < 0 || nota > 10 )
{
printf( "\n
ERROR: Nota incorrecta, debe ser >= 0 y <= 10\n" );
20
printf( "\n
Introduzca nota (real): " );
scanf( "%f", &nota );
}
/* Mientras que el usuario introduzca una
nota incorrecta, el bucle iterará.
Y cuando introduzca una nota correcta,
el bucle finalizará. */
if ( nota >= 5 )
printf( "\n
APROBADO" );
else
printf( "\n
SUSPENDIDO" );
return 0;
}
Programa (.c): Calificación según nota
En el programa, el bucle while se ha usado para validar la nota introducida por el usuario. En programación, es muy
frecuente usar el bucle while para validar (filtrar) datos. Al bucle que se utiliza para validar uno o más datos, también se le
conoce como filtro.
Ejercicio 1 - Área de una esfera (Repetitiva mientras - Lenguaje C)
Escribir un programa (en lenguaje C) que:
1º) Pida por teclado el radio (dato real) de una esfera.
2º) En el caso de que el radio sea menor o igual que 0, muestre por pantalla el mensaje:
x
"ERROR: El radio debe ser mayor que cero.".
3º) Repita los pasos 1º y 2º, mientras que, el radio introducido sea incorrecto.
4º) Muestre por pantalla:
x
"El área de una esfera de radio <radio> es: <área>".
2
Nota 1: Área de una esfera = 4 * pi * radio
Nota 2: Utilice un bucle mientras (while).
En pantalla:
Introduzca radio: 3.6
El área de la esfera de radio 3.6 es: 162.860129
Introduzca radio: -2.4
ERROR: El radio debe ser mayor que cero.
Introduzca radio: 2.4
El área de la esfera de radio 2.4 es: 72.382279
21
Ejercicio 2 - Volúmenes de cubos (Repetitiva mientras - Lenguaje C)
Escribir un programa (en lenguaje C) que:
1º) Pida por teclado la arista (dato real) de un cubo.
2º) En el caso de que la arista sea mayor que cero, muestre por pantalla el mensaje:
x
"El volumen del cubo de arista <arista> es: <volumen>".
3º) Repita los pasos 1º y 2º, mientras que, la arista introducida sea mayor que cero.
4º) Muestre por pantalla cuantos volúmenes de cubos han sido calculados.
3
Nota 1: Volumen de un cubo = arista
Nota 2: Utilice un bucle mientras (while).
En pantalla:
Introduzca arista: 7.3
El volumen de un cubo de arista 7.3 es: 389.017
Introduzca arista: 10.1
El volumen de un cubo de arista 10.1 es: 1030.301
Introduzca arista: 0
Ha calculado el volumen de 2 cubo(s).
Introduzca arista: -5.8
Ha calculado el volumen de 0 cubo(s).
22
3.2 Repetitiva hacer...mientras ( la instrucción do...while )
En lenguaje C, para escribir una instrucción repetitiva hacer...mientras se utiliza la sintaxis:
do
{
<bloque_de_instrucciones>
} while ( <expresión_lógica> );
Cuando el <bloque_de_instrucciones> sólo contiene una instrucción, los caracteres abrir llave ({) y cerrar
llave (}) son opcionales.
Además, como se puede apreciar, la instrucción repetitiva do...while, también hace uso de una condición.
En un bucle do...while, primero se ejecuta el bloque de instrucciones y, después, se evalúa la condición. En el caso de
que ésta sea verdadera, se vuelve a ejecutar el bloque de instrucciones. Y así sucesivamente, hasta que, la condición
sea falsa.
Por consiguiente, cuando el flujo de un programa llega a un bucle do...while, existen dos posibilidades:
1. Se ejecuta el bloque de instrucciones y, después, si la condición se evalúa a falsa, el bloque de instrucciones no se
vuelve a ejecutar, de manera que, el bucle do...while finaliza, habiendo realizado una solaiteración.
2. Se ejecuta el bloque de instrucciones y, a continuación, si la condición se evalúa a verdadera, el bloque de
instrucciones se vuelve a ejecutar. Y así sucesivamente, hasta que la condición sea falsa.
El <bloque_de_instrucciones> de un bucle do...while puede ejecutarse una o más veces (iteraciones). También
hay que prevenir que el bucle no sea infinito.
En resumen, una instrucción repetitiva do...while permite ejecutar repetidamente (una o más veces) un bloque de
instrucciones, mientras que, una determinada condición sea verdadera.
Ejemplo 1: De modo que, utilizando un bucle do...while, el problema del ejemplo 1 del apartado anterior, 3.1
Repetitiva mientras, se puede resolver con el código:
#include <stdio.h>
int main()
{
int contador;
printf( "\n
" );
contador = 1; /* Inicialización del contador */
do
{
printf( "%d ", contador );
/* Salida */
contador++;
/* Incremento */
} while ( contador <= 10 );
/* Condición */
return 0;
}
Programa (.c): Números del 1 al 10 (do...while)
Como ya se ha dicho, el bucle do...while puede iterar una o más veces, por tanto, cuando un bloque de instrucciones
debe iterar al menos una vez, generalmente, es mejor utilizar un bucle do...while que un bucle while, como por
ejemplo, en el siguiente problema.
23
Ejemplo 2: Se quiere escribir un programa que:
1º) Pida por teclado un número (dato entero).
2º) Pregunte al usuario si desea introducir otro o no.
3º) Repita los pasos 1º y 2º, mientras que, el usuario no responda 'n' de (no).
4º) Muestre por pantalla la suma de los números introducidos por el usuario.
En pantalla:
Introduzca un numero entero: 7
¿Desea introducir otro (s/n)?: s
Introduzca un numero entero: 16
¿Desea introducir otro (s/n)?: s
Introduzca un numero entero: -3
¿Desea introducir otro (s/n)?: n
La suma de los numeros introducidos es: 20
El código propuesto es:
#include <stdio.h>
int main()
{
char seguir;
int acumulador, numero;
/* En acumulador se va a guardar la suma de
los números introducidos por el usuario. */
acumulador = 0;
do
{
printf( "\n
Introduzca un numero entero: " );
scanf( "%d", &numero);
acumulador += numero;
printf( "\n
Desea introducir otro numero (s/n)?: " );
fflush( stdin );
scanf( "%c", &seguir);
} while ( seguir != 'n' );
/* Mientras que el usuario desee introducir
más números, el bucle iterará. */
printf( "\n
La suma de los numeros introducidos es: %d",
acumulador );
return 0;
}
Programa (.c): Suma de números introducidos por el usuario
24
Ejercicio 1 - Media aritmética de números introducidos (Repetitiva hacer...mientras - Lenguaje C)
Escribir un programa (en lenguaje C) que:
1º) Pida por teclado un número (dato entero).
2º) Muestre por pantalla los mensajes:
x
x
Ha introducido <cantidad_de_números> número(s)
La suma es <suma>
3º) Pregunte al usuario si desea introducir otro o no.
4º) Repita los pasos 1º, 2º y 3º, mientras que, el usuario no responda 'n' de (no).
5º) Muestre por pantalla la media aritmética (dato real) de los números introducidos.
Nota: Utilice un bucle hacer mientras (do...while).
En pantalla:
Introduzca un número entero: 3
Ha introducido 1 número(s)
La suma es 3
¿Desea introducir otro (s/n)?: s
Introduzca un número entero: 7
Ha introducido 2 número(s)
La suma es 10
¿Desea introducir otro (s/n)?: s
Introduzca un número entero: 6
Ha introducido 3 número(s)
La suma es 16
¿Desea introducir otro (s/n)?: s
Introduzca un número entero: 13
Ha introducido 4 número(s)
La suma es 29
¿Desea introducir otro (s/n)?: n
La media aritmética es 7.25
Introduzca un número entero: 8
Ha introducido 1 número(s)
La suma es 8
¿Desea introducir otro (s/n)?: n
La media aritmética es 8.000000
25
Ejercicio 2 - Cálculo de sumas (Repetitiva hacer...mientras - Lenguaje C)
Escribir un programa (en lenguaje C) que:
1º) Pida por teclado dos números (datos enteros).
2º) Muestre por pantalla el mensaje:
x
La suma es <suma>
3º) Pregunte al usuario si desea realizar otra suma o no.
4º) Repita los pasos 1º, 2º y 3º, mientras que, el usuario no responda 'n' de (no).
5º) Muestre por pantalla la suma total de los números introducidos.
Nota: Utilice un bucle hacer...mientras (do...while).
En pantalla:
Introduzca primer número: 9
Introduzca segundo número: 4
La suma es 13
¿Desea realizar otra suma (s/n)?: s
Introduzca primer número: 2
Introduzca segundo número: 14
La suma es 16
¿Desea realizar otra suma (s/n)?: s
Introduzca primer número: 6
Introduzca segundo número: 1
La suma es 7
¿Desea realizar otra suma (s/n)?: n
La suma total es 36
Introduzca primer número: 10
Introduzca segundo número: 100
La suma es 110
¿Desea realizar otra suma (s/n)?: n
La suma total es 110
26
3.3 Repetitiva para ( la instrucción for )
En lenguaje C, para escribir una instrucción repetitiva para se utiliza la sintaxis:
for ( <expresión_1> ; <expresión_2> ; <expresión_3> )
{
<bloque_de_instrucciones>
}
Cuando el <bloque_de_instrucciones> sólo contiene una instrucción, los caracteres abrir llave ({) y cerrar
llave (}) son opcionales.
Por otro lado, el bucle for es ideal usarlo cuando, de antemano, ya se sabe el número de veces (iteraciones) que tiene que
ejecutarse un determinado bloque de instrucciones.
El bucle para es una variante del bucle mientras y, al igual que éste, puede iterar cero o más veces (véase el
apartado 10.1 Repetitiva mientras, del Curso de Diseño de Algoritmos). Sin embargo, el bucle for sólo se suele usar
cuando se conoce el número exacto de veces que tiene que iterar el bucle. Éste es el caso del problema planteado en el
ejemplo 1 del apartado 3.1 Repetitivamientras, en el cual, se sabe de antemano que el bucle tiene que iterar, exactamente,
diez veces.
Ejemplo: Por tanto, dicho problema, se puede resolver con una instrucción repetitiva for de la siguiente forma:
#include <stdio.h>
int main()
{
int contador;
printf( "\n
" );
for ( contador=1 ; contador<=10 ; contador++ )
printf( "%d ", contador );
return 0;
}
Programa (.c): Números del 1 al 10 (for)
En este caso, <expresión_1>, <expresión_2> y <expresión_3>, se corresponden, respectivamente, con:
x
x
x
la inicialización de la variable contador,
la condición de salida del bucle y
el incremento de la variable contador
de una instrucción repetitiva mientras.
27
Ejercicio 1 - Cubos de números pares (Repetitiva para - Lenguaje C)
Escribir un programa (en lenguaje C) que muestre por pantalla los cinco primeros números naturales pares
elevados al cubo.
3
Nota 1: Cubo de un número = número
Nota 2: Utilice un bucle para (for).
En pantalla:
8 64 216 512 1000
Ejercicio 2 - Números múltiplos de 3 del -15 al -3 (Repetitiva para)
Escribir un programa (en lenguaje C) que muestre por pantalla todos los números múltiplos de 3 que hay entre el
-15 y el -3, ambos inclusive.
Nota: Utilice un bucle para (for).
En pantalla:
-15 -12 -9 -6 -3
28
3.3.1 ¿Cuándo usar un bucle u otro?
En programación, a la hora de elegir un bucle u otro, debemos hacernos la siguiente pregunta:
x
¿Se conoce, de antemano, el número de veces (iteraciones) que tiene que ejecutarse un determinado bloque de
instrucciones?
Si la respuesta es afirmativa, habitualmente se usa un bucle for. En caso contrario, nos plantearemos la siguiente pregunta:
x
¿El bloque de instrucciones debe ejecutarse al menos una vez?
En este caso, si la respuesta es afirmativa, generalmente haremos uso de un bucle do...while, y si la respuesta es
negativa, usaremos un bucle while.
3.4 Anidamiento
Al igual que las instrucciones alternativas, las instrucciones repetitivas también se pueden anidar, permitiendo las siguientes
combinaciones de anidamiento:
x
x
while en while
while en do...while
while en for
do...while en do...while
do...while en for
do...while en while
for en for
for en while
for en do...while
x
x
x
x
x
x
x
De ellas, vamos a estudiar, como ejemplo, la combinación:
x
for en do...while
Por otro lado, las instrucciones alternativas y repetitivas también se pueden anidar entre sí, permitiendo realizar 18
combinaciones más de anidamiento:
x
while en doble
while en simple
while en múltiple
x
x
x
do...while en doble
do...while en simple
do...while en múltiple
x
x
x
x
x
x
for en doble
for en simple
for en múltiple
x
Doble en while
Doble en do...while
Doble en for
x
Simple en while
x
29
x
Simple en do...while
Simple en for
x
x
Múltiple en while
Múltiple en do...while
Múltiple en for
x
x
De ellas, vamos a estudiar, como ejemplo, la combinación:
x
Simple en for.
3.4.1 Bucle for en do...while
En lenguaje C, para anidar un bucle for en un bucle do...while, se utiliza la sintaxis:
do
{
/* Inicio del anidamiento */
for ( <expresión_1> ; <expresión_2> ; <expresión_3> )
{
<bloque_de_instrucciones>
}
/* Fin del anidamiento */
} while ( <expresión_lógica> );
Ejemplo: Se quiere escribir un programa que muestre por pantalla la tabla de multiplicar de un número entero introducido
por el usuario. El proceso debe repetirse mientras que el usuario lo desee:
Introduzca un numero entero: 7
La tabla de multiplicar del 7 es:
7
7
7
7
7
7
7
7
7
7
*
*
*
*
*
*
*
*
*
*
1 = 7
2 = 14
3 = 21
4 = 28
5 = 35
6 = 42
7 = 49
8 = 56
9 = 63
10 = 70
¿Desea ver otra tabla (s/n)?: s
Introduzca un numero entero: -12
La tabla de multiplicar del -12 es:
-12
-12
-12
-12
-12
-12
-12
*
*
*
*
*
*
*
1
2
3
4
5
6
7
=
=
=
=
=
=
=
-12
-24
-36
-48
-60
-72
-84
30
-12 * 8 = -96
-12 * 9 = -108
-12 * 10 = -120
¿Desea ver otra tabla (s/n)?: n
En lenguaje C, para resolver este problema se puede escribir:
#include <stdio.h>
int main()
{
char seguir;
int i, numero;
do
{
printf( "\n
Introduzca un numero entero: " );
scanf( "%d", &numero );
printf( "\n
La tabla de multiplicar del %d es:\n", numero );
/* Inicio del anidamiento */
for ( i = 1 ; i <= 10 ; i++ )
{
printf( "\n
%d * %d = %d",
i, numero, i * numero );
}
/* Fin del anidamiento */
printf( "\n\n
Desea ver otra tabla (s/n)?: " );
fflush( stdin );
scanf( "%c", &seguir );
} while ( seguir != 'n' );
return 0;
}
Programa (.c): Tabla de multiplicar de un número (for en do...while)
3.4.2 Alternativa simple en bucle for
En lenguaje C, para anidar una alternativa simple en un bucle for, se utiliza la sintaxis:
for ( <expresión_1> ; <expresión_2> ; <expresión_3> )
{
/* Inicio del anidamiento */
if ( <expresión_lógica> )
{
<bloque_de_instrucciones>
}
/* Fin del anidamiento */
}
Ejemplo: Se quiere escribir un programa que muestre por pantalla todos los números enteros del 1 al 100 (ambos inclusive)
que sean divisibles entre 17 ó 21:
31
17 21 34 42 51 63 68 84 85
Anidando una alternativa simple en un bucle for, el problema se puede resolver con el código:
#include <stdio.h>
int main()
{
int numero;
printf( "\n
" );
for ( numero = 1 ; numero <= 100 ; numero++ )
{
/* Inicio del anidamiento */
if ( numero % 17 == 0 || numero % 21 == 0 )
printf( "%d ", numero );
/* Fin del anidamiento */
}
return 0;
}
Programa (.c): Números enteros divisibles entre 17 ó 21 (Alternativa simple en for)
Ejercicio 1 - Cantidad y suma de números enteros (Anidamiento de repetitivas y alternativas - Lenguaje
C)
Escribir un programa (en lenguaje C) que:
1º) Pida por teclado un número (dato entero).
2º) Repita el paso 1º, mientras que, el número introducido sea distinto de cero.
3º) Muestre cuántos números mayores que cero han sido introducidos por el usuario, así como, la suma de todos
ellos.
En pantalla:
Introduzca un número entero: 4
Introduzca un número entero: 8
Introduzca un número entero: -6
Introduzca un número entero: 12
Introduzca un número entero: 0
Ha introducido 3 número(s) mayor(es) que cero.
La suma es 24
Introduzca un número entero: -3
Introduzca un número entero: 0
Ha introducido 0 número(s) mayor(es) que cero.
La suma es 0
32
Ejercicio 2 - Mostrar y sumar números enteros (Anidamiento de repetitivas y alternativas - Lenguaje C)
Escribir un programa (en lenguaje C) que:
1º) Pida por teclado dos números (datos enteros).
2º) En el caso de que el primer número introducido por el usuario, no sea mayor que cero y el segundo menor
que cero, muestre por pantalla el mensaje:
x
"ERROR: El primer número debe ser mayor que cero y el segundo menor que cero."
En caso contrario, muestre por pantalla los números que hay entre los dos números introducidos por el usuario,
ambos inclusive, así como, la suma de todos ellos.
En pantalla:
Introduzca primer número entero: 5
Introduzca segundo número entero: -2
-2 -1 0 1 2 3 4 5
La suma es 12
Introduzca primer número entero: 17
Introduzca segundo número entero: 8
ERROR: El primer número debe ser mayor que cero y el segundo menor que cero.
33
4. Instrucciones de control de salto
4.1 Instrucción break
En lenguaje C, para escribir una instrucción de salto break (interrumpir), se utiliza la sintaxis:
break;
La instrucción de salto break se usa para interrumpir (romper) la ejecución normal de un bucle, es decir, la
instrucción break finaliza (termina) la ejecución de un bucle y, por tanto, el control del programa se transfiere (salta) a la
primera instrucción después del bucle.
Ejemplo 1: Estúdiese el siguiente código fuente:
#include <stdio.h>
int main()
{
int n, a;
a = 0;
do
{
printf( "Introduzca un numero entero: " );
scanf( "%d", &n );
if ( n == 0 )
{
printf( "ERROR: El cero no tiene opuesto.\n" );
break;
/* En el caso de que n sea un cero,
el bucle se interrumpe. */
}
printf( "El opuesto es: %d\n", -n );
a += n;
} while ( n >= -10 && n <= 10 );
printf( "Suma: %d", a );
return 0;
}
Programa (.c): Números opuestos del -10 al 10 (con instrucción break)
El programa puede ser la solución del problema siguiente:
Escriba un programa que:
1º) Pida por teclado un número (dato entero).
2º) Si el número introducido por el usuario es distinto de cero, muestre por pantalla el mensaje:
x
"El opuesto es: < -número>".
3º) Repita los pasos 1º y 2º, mientras que, el usuario introduzca un número mayor o igual que -10 y menor o igual que 10.
Pero, si el usuario introduce un cero, el bucle también finaliza, mostrándose por pantalla el mensaje:
x
"ERROR: El cero no tiene opuesto.".
4º) Muestre por pantalla la suma de los números introducidos por el usuario.
En pantalla:
34
Introduzca un número entero: 15
El opuesto es: -15
Suma: 15
La traza del programa es:
Secuencia:
1
Acción (instrucción):
Valor de:
a = 0
a
n
0
?
Inicio de la iteración 1.
2
printf( "Introduzca un número entero:" )
0
?
3
scanf( "%d",n )
0
15
4
(Comprobar si n == 0)
0
15
La condición de la alternativa simple (if) es falsa.
5
printf( "El opuesto es: %d\n", -n )
0
15
6
a += n
15
15
15
15
15
15
Fin de la iteración 1.
7
(Comprobar si n >= -10 && n <= 10)
La condición del bucle (do...while) es falsa.
El bucle finaliza después de 1 iteración.
8
printf( "Suma: %d", a )
Figura. Traza del ejemplo 1.
El bucle ha finalizado porque la condición ( n >= -10 && n <= 10 ) es falsa, ya que, 15 no es mayor o igual que -10 y
menor o igual que 10.
Sin embargo, el bucle también puede finalizar, no porque sea falsa la condición ( n >= -10 && n <= 10 ), sino, porque
se ejecute la instrucción break. Esto ocurrirá cuando el usuario introduzca un cero. Por ejemplo:
Introduzca un número entero: 8
El opuesto es: -8
Introduzca un número entero: -7
El opuesto es: 7
Introduzca un número entero: 0
ERROR: El cero no tiene opuesto.
Suma: 1
La traza en este caso es:
Secuencia:
1
Acción (instrucción):
a = 0
Valor de:
a
n
0
?
35
Inicio de la iteración 1.
2
printf( "Introduzca un número entero:" )
0
?
3
scanf( "%d",n )
0
8
4
(Comprobar si n == 0)
0
8
La condición de la alternativa simple (if) es falsa.
5
printf( "El opuesto es: %d\n", -n )
0
8
6
a += n
8
8
8
8
Fin de la iteración 1.
7
(Comprobar si n >= -10 && n <= 10)
La condición del bucle (do...while) es verdadera.
Inicio de la iteración 2.
8
printf( "Introduzca un número entero:" )
8
8
9
scanf( "%d",n )
8
-7
10
(Comprobar si n == 0)
8
-7
La condición de la alternativa simple (if) es falsa.
11
printf( "El opuesto es: %d\n", -n )
8
-7
12
a += n
1
-7
1
-7
Fin de la iteración 2.
13
(Comprobar si n >= -10 && n <= 10)
La condición del bucle (do...while) es verdadera.
Inicio de la iteración 3.
14
printf( "Introduzca un número entero:" )
1
-7
15
scanf( "%d",n )
1
0
16
(Comprobar si n == 0)
1
0
La condición de la alternativa simple (if)es verdadera.
17
printf( "ERROR: El cero no tiene opuesto." )
1
0
18
break
1
0
1
0
El bucle (do...while) se interrumpe en la 3ª iteración.
El control del programa se transfiere (salta)
a la primera instrucción después del bucle.
19
printf( "Suma: %d", a )
Figura. Traza del ejemplo 1.
Normalmente, cuando en un bucle se utiliza una instrucción break, la ejecución de ésta se condiciona.
En el ejemplo 1, el bucle se interrumpe si la condición ( n == 0 ) es verdadera. Nótese que, dicha condición no está
contemplada en la condición de salidaestándar del bucle, por lo que, a la condición ( n == 0 ) se le consideracondición de
salida interna del bucle.
36
Ejemplo 2: No obstante, el problema también se puede resolver sin hacer uso de la instrucción break:
#include <stdio.h>
int main()
{
int numero, acumulador;
acumulador = 0;
do
{
printf( "Introduzca un numero entero: " );
scanf( "%d", &numero );
if ( numero == 0 )
{
printf( "ERROR: El cero no tiene opuesto.\n" );
}
else
{
printf( "El opuesto es: %d\n", -numero );
acumulador += numero;
}
} while ( numero >= -10 && numero <= 10 && numero != 0);
printf( "Suma: %d", acumulador );
return 0;
}
Programa (.c): Números opuestos del -10 al 10 (sin instrucción break)
Obsérvese que, en este programa, sí se contempla en la condición de salida del bucle la posibilidad de que el usuario teclee
un cero, en cuyo caso, el bucle deja de iterar de forma natural.
Los resultados por pantalla de este código fuente son idénticos a los del código anterior.
Por otra parte, en lenguaje C, como ya vimos en el apartado 2.3 Alternativa múltiple (la instrucción switch), la
instrucción break también se usa para interrumpir (salir de) una alternativa múltiple.
37
4.2 Instrucción continue
En lenguaje C, para escribir una instrucción de salto continue (continuar) , se utiliza la sintaxis:
continue;
La instrucción de salto continue siempre se usa para interrumpir (romper) la ejecución normal de un bucle. Sin embargo,
el control del programa no se transfiere a la primera instrucción después del bucle (como sí hace la instrucción break, véase
el apartado anterior), es decir, el bucle no finaliza, sino que, finaliza la iteración en curso, transfiriéndose el control del
programa a la condición de salida del bucle, para decidir si se debe realizar una nueva iteración o no.
Por tanto, la instrucción continue finaliza (termina) la ejecución de una iteración de un bucle, pero, no la ejecución del
bucle en sí. De forma que, la instruccióncontinue salta (no ejecuta) las instrucciones que existan después de ella, en la
iteración de un bucle.
Ejemplo 1: En el programa siguiente se muestra como se puede utilizar la instrucción continue:
#include <stdio.h>
int main()
{
int n, a;
a = 0;
do
{
printf( "Introduzca un numero entero: " );
scanf( "%d", &n );
if ( n == 0 )
{
printf( "ERROR: El cero no tiene opuesto.\n" );
continue;
/* En el caso de que n sea un cero,
la iteración en curso del bucle
se interrumpe aquí. */
}
printf( "El opuesto es: %d\n", -n );
a += n;
} while ( n >= -10 && n <= 10 );
printf( "Suma: %d", a );
return 0;
}
Programa (.c): Números opuestos del -10 al 10 (con instrucción continue)
El código del programa es el mismo que el del ejemplo 1 del apartado anterior, 4.1 Instruccion break, excepto por la
instrucción break, que ha sido sustituida por la instrucción continue. El programa puede ser la solución para el problema
siguiente, el cual se diferencia del ejemplo 1 del apartado anterior en que si el usuario introduce un cero, el bucle no deja de
iterar.
Diseñe el agoritmo de un programa que:
1º) Pida por teclado un número (dato entero).
2º) Si el número introducido por el usuario es distinto de cero, muestre por pantalla el mensaje:
x
"El opuesto es: < -número>".
En caso contrario, muestre el mensaje:
x
"ERROR: El cero no tiene opuesto.".
38
3º) Repita los pasos 1º y 2º, mientras que, el usuario introduzca un número mayor o igual que -10 y menor o igual que 10.
4º) Muestre por pantalla la suma de los números introducidos por el usuario.
En pantalla:
Introduzca un número entero: 2
El opuesto es: -2
Introduzca un número entero: 0
ERROR: El cero no tiene opuesto.
Introduzca un número entero: -59
El opuesto es: 59
Suma: -57
La traza del programa es:
Secuencia:
1
Acción (instrucción):
Valor de:
a = 0
a
n
0
?
Inicio de la iteración 1.
2
printf( "Introduzca un número entero:" )
0
?
3
scanf( "%d",n )
0
2
4
(Comprobar si n = 0)
0
2
La condición de la alternativa simple (if) es falsa.
5
printf( "El opuesto es: %d\n", -n )
0
2
6
a += n
2
2
2
2
Fin de la iteración 1.
7
(Comprobar si n >= -10 y n <= 10)
La condición del bucle (do...while) es verdadera.
Inicio de la iteración 2.
8
printf( "Introduzca un número entero:" )
2
2
9
scanf( "%d",n )
2
0
10
(Comprobar si n = 0)
2
0
La condición de la alternativa simple (if)es verdadera.
11
printf( "ERROR: El cero no tiene opuesto." )
2
0
12
continue
2
0
2
0
La 2ª iteración se interrumpe (finaliza) aquí.
El control del programa se transfiere (salta) a la
condición de salida del bucle (do...while).
13
(Comprobar si n >= -10 y n <= 10)
La condición del bucle (do...while) es verdadera.
Inicio de la iteración 3.
14
printf( "Introduzca un número entero:" )
2
0
15
scanf( "%d",n )
2
-59
16
(Comprobar si n = 0)
2
-59
39
La condición de la alternativa simple (if) es falsa.
17
printf( "El opuesto es: %d\n", -n )
18
a += n
2
-59
-57
-59
-57
-59
-57
-59
Fin de la iteración 3.
19
(Comprobar si n >= -10 y n <= 10)
La condición del bucle (do...while) es falsa.
El bucle finaliza después de 3 iteración.
20
printf( "Suma: %d", a )
Figura. Traza del ejemplo 1.
La instrucción continue se ejecuta cuando el usuario introduce un cero, interrumpiendo la iteración en curso; pero, el
bucle solamente finaliza cuando la condición ( n >= -10 y n <= 10 ) sea falsa.
Normalmente, al igual que ocurre con la instrucción break, cuando en un bucle se utiliza una instrucción continue, la
ejecución de ésta también se condiciona.
En el ejemplo 1, la iteración en curso del bucle se interrumpe si es verdaderala condición ( n = 0 ).
Ejemplo 2: No obstante, el problema también se puede resolver sin hacer uso de la instrucción continue:
#include <stdio.h>
int main()
{
int numero, acumulador;
acumulador = 0;
do
{
printf( "Introduzca un numero entero: " );
scanf( "%d", &numero );
if ( numero == 0 )
{
printf( "ERROR: El cero no tiene opuesto.\n" );
}
else
{
printf( "El opuesto es: %d\n", -numero );
acumulador += numero;
}
} while ( numero >= -10 && numero <= 10 );
printf( "Suma: %d", acumulador );
return 0;
}
Programa (.c): Números opuestos del -10 al 10 (sin instrucción continue)
Los resultados por pantalla de este programa son idénticos a los del algoritmo anterior.
40
4.3 Instrucción goto
En lenguaje C, para escribir una instrucción de salto goto (ir_a), se utiliza la sintaxis:
goto <nombre_de_la_etiqueta>
La instrucción de salto goto se puede usar en un programa, para transferir incondicionalmente el control del mismo a la
primera instrucción después de unaetiqueta, o dicho de otra forma, al ejecutar una instrucción goto, el control del programa
se transfiere (salta) a la primera instrucción después de una etiqueta. Una etiqueta se define mediante su nombre
(identificador) seguido del carácter dos puntos (:).
Ejemplo: En el siguiente programa se utiliza la instrucción goto para resolver el mismo problema que el del ejemplo 1 del
apartado 4.1 Instrucción break:
#include <stdio.h>
int main()
{
int n, a;
a = 0;
do
{
printf( "Introduzca un numero entero: " );
scanf( "%d", &n );
if ( n == 0 )
{
printf( "ERROR: El cero no tiene opuesto.\n" );
goto etiqueta_1;
/* En el caso de que n sea un cero,
el control de programa salta a la
primera instrucción después de
etiqueta_1. */
}
printf( "El opuesto es: %d\n", -n );
a += n;
} while ( n >= -10 && n <= 10 );
etiqueta_1:
printf( "Suma: %d", a );
return 0;
}
Programa (.c): Números opuestos del -10 al 10 (con instrucción goto)
Los resultados por pantalla de este programa son idénticos a los de los programas de los ejemplos 1 y 2 del apartado 4.1
Instrucción break.
En pantalla:
Introduzca un número entero: -4
El opuesto es: 4
Introduzca un número entero: 12
El opuesto es: -12
Introduzca un número entero: 0
ERROR: El cero no tiene opuesto.
41
Suma: 8
La traza del programa es:
Secuencia:
1
Acción (instrucción):
Valor de:
a = 0
a
n
0
?
Inicio de la iteración 1.
2
printf( "Introduzca un número entero:" )
0
?
3
scanf( "%d",n )
0
-4
4
(Comprobar si n == 0)
0
-4
La condición de la alternativa simple (if) es falsa.
5
printf( "El opuesto es: %d\n", -n )
0
-4
6
a += n
-4
-4
-4
-4
Fin de la iteración 1.
7
(Comprobar si n >= -10 && n <= 10)
La condición del bucle (do...while) es verdadera.
Inicio de la iteración 2.
8
printf( "Introduzca un número entero:" )
-4
-4
9
scanf( "%d",n )
-4
12
10
(Comprobar si n == 0)
-4
12
La condición de la alternativa simple (if) es falsa.
11
printf( "El opuesto es: %d\n", -n )
-4
12
12
a += n
8
12
8
12
Fin de la iteración 2.
13
(Comprobar si n >= -10 && n <= 10)
La condición del bucle (do...while) es verdadera.
Inicio de la iteración 3.
14
printf( "Introduzca un número entero:" )
8
12
15
scanf( "%d",n )
8
0
16
(Comprobar si n == 0)
8
0
La condición de la alternativa simple (if)es verdadera.
17
printf( "ERROR: El cero no tiene opuesto." )
8
0
18
goto etiqueta_1
8
0
8
0
El bucle se interrumpe en la 3ª iteración.
El control del programa se transfiere (salta) a la
primera instrucción después de etiqueta_1.
19
printf( "Suma: %d", a )
Figura. Traza del ejemplo 1.
Normalmente, al igual que ocurre con las instrucciones break y continue, cuando en un algoritmo se utiliza una
instrucción goto, la ejecución de ésta también se condiciona.
42
4.4 Instrucción return
En lenguaje C, para escribir una instrucción de salto return (volver), se utiliza la sintaxis:
return <expresión>;
La instrucción de salto return es utilizada en lenguaje C para indicar el valor de retorno de una función. Por tanto, vamos a
hacer uso de la instrucción returncuando definamos subprogramas de tipo función, que estudiaremos en el apartado 5.
Llamadas a subprogramas.
Por otra parte, recuérdese que, en el apartado 1.3.2 Mi primer programa en lenguaje C, ya estudiamos la utilidad de la
instrucción return en la función main.
4.5 Ventajas de no usar las instrucciones de salto
Las ventajas de no usar las instrucciones de salto, especialmente la instrucción goto, se pueden resumir en:
x
x
x
x
La legibilidad del código fuente de los programas es mayor.
La probabilidad de cometer errores en el algoritmo diseñado es menor.
Es más fácil realizar cambios o corregir errores en el algoritmo del programa.
Nunca se altera (rompe) la secuencia de ejecución normal del programa. Dicho de otro modo, el programa siempre
se ejecuta de un modo natural.
43
Descargar