Capítulo 4.
Universidad del País Vasco / Euskal Herriko Unibertsitatea 95 Índice del capítulo 1. Introducción........................................ 97 2. Objetivos........................................... 98 3. La estructura de control for............................. 99 4. La estructura de control while........................... 103 5. La estructura de control do while........................ 105 6. Estructuras de control iterativas anidadas.................. 107 7. Otras estructuras de control: break y continue.............. 109 7.1. break........................................... 109 7.2. continue........................................ 110 8. Bibliografía.......................................... 111 9. Ejercicios propuestos.................................. 112
Universidad del País Vasco / Euskal Herriko Unibertsitatea 97 1. Introducción Después de ver en la sección anterior las estructuras condicionales if y switch, a continuación examinaremos otros tipos de estructuras. Mediante las estructuras condicionales somos capaces de elegir las e x p resiones. Pero esto no suele ser suficiente. En ocasiones se debe repetir la ejecución de algunas expresiones mientras una de las condiciones siga siendo verdadera. En esta sección apre n d e remos cómo se lleva a cabo la ejecución iterativa de las expresiones en función del valor de las condiciones de control. El lenguaje C ofrece fundamentalmente las siguientes estructuras de control iterativas: las sentencias f o r, while y do while.
Universidad del País Vasco / Euskal Herriko Unibertsitatea 98 2. Objetivos El objetivo de este capítulo es estudiar el uso de las sentencias de control iterativas. Como consecuencia d e b e remos ser capaces de escribir nuestros primeros programas utilizando este tipo de sentencias. En concreto estas son las sentencias que debemos aprender a utilizar: Sentencia for Sentencia while Sentencia do while Sentencias iterativas anidadas
Universidad del País Vasco / Euskal Herriko Unibertsitatea 99 3. La estructura de control for A menudo conocemos de antemano cuántas veces se deben repetir durante la ejecución de un pro g r a m a algunas expresiones, o si deben repetirse mientras el valor de una expresión cumpla una determ i n a d a condición. En este caso se utiliza la e s t ructura de control for. En esta compleja estructura iterativa se encuentran los siguientes elementos: Expresión inicial Expresión condicional Expresión bucle Expresiones que vamos a ejecutar y la sintaxis correspondiente a esta expresión de control for es la siguiente: for (expresión inicial; expresión condiciona;, expresión bucle) expresión(es); Cuando vamos a ejecutar solamente una expresión las llaves no son imprescindibles. De todas formas se recomienda utilizarlas siempre para evitar errores difícilmente corregibles. El funcionamiento de esta expresión de control es la siguiente: 1. Valorar la expresión inicial (iniciación). 2. Valorar la expresión condicional. De resultar falsa, pasar a la sentencia siguiente del pro g r a m a (salir del bucle). 3. Si la expresión condicional es verdadera se llevan a cabo las expresiones del cuerpo de la expresión. 4. Evaluar la expresión bucle (actualizar) y volver al punto 2. En la figura 1 se presenta un diagrama donde se muestra de forma gráfica el funcionamiento de esta estructura de control.
Universidad del País Vasco / Euskal Herriko Unibertsitatea 100 Valorar expresión inicial N O Expr. cond.? Expresión bucle actualizar S I Expresiones Figura 1: Funcionamiento de la estructura de control for. 1. Ejemplo En este ejemplo se muestra el funcionamiento de un bucle f o r simple. El objetivo de esta estructura de control es visualizar 10 veces un mensaje. Expresión inicial Expresión condicional Expresión bucle for (cont = 1; cont <= 10; cont++) printf ( %d Buena suerte con la estructura for! \n, cont); En este bucle for se utiliza la variable cont para contar cuántas veces hemos visualizado el mensaje. Toma el valor inicial 1 y después de confirmar la condición incrementa su valor. Mientras la condición sea verdadera se visualizará el mensaje que la función printf define. Por lo tanto en la pantalla veríamos lo siguiente: 1 Buena suerte con la estructura for! 2 Buena suerte con la estructura for! 3 Buena suerte con la estructura for! 4 Buena suerte con la estructura for! 5 Buena suerte con la estructura for! 6 Buena suerte con la estructura for! 7 Buena suerte con la estructura for! 8 Buena suerte con la estructura for! 9 Buena suerte con la estructura for! 10 Buena suerte con la estructura for!
Universidad del País Vasco / Euskal Herriko Unibertsitatea 101 2. Ejemplo Escribir un programa que imprime un número y el cuadrado que le corresponde para todos los números comprendidos entre uno y un límite predefinido. #include <stdio> #define LIMITE 10 main () int n = 0; printf ( Num Num elevado a 2 \n ); for (n = 1; n <= LIMITE; n++) printf ( %5d %5d\n, n, n * n); El resultado que ofrece este programa es el siguiente: Num Num elevado a 2 1 1 2 4 3 9 4 16 5 25 6 36 7 49 8 64 9 81 10 100 En los ejemplos que vienen a continuación se muestran diferentes usos de la estructura de control f o r. a) Estructura de control for utilizando el operador decrementar for (num = 10; num > 0; num ) printf ( %2d segundos\n, num); 10 segundos 9 segundos 8 segundos 7 segundos 6 segundos 5 segundos 4 segundos 3 segundos 2 segundos 1 segundos
Universidad del País Vasco / Euskal Herriko Unibertsitatea 102 b) Utilizando la estructura de control for para contar del modo que deseemos: for (num = 10; num < 60; num += 10) printf ( %d \n, num); 10 20 30 40 50 c) Utilizando la estructura de control for para contar caracteres: for (carac = a ; carac <= z ; carac++) printf ( el código ASCII correspondiente al carácter %c es el: %d \n, carac, carac); el código ASCII correspondiente al caracter a es el: 97 el código ASCII correspondiente al caracter b es el: 98 el código ASCII correspondiente al caracter c es el: 99.... el código ASCII correspondiente al caracter z es el: 122 d) Para evaluar la expresión bucle podemos utilizar la expresión que deseemos: for (x = 1; x <= 85; x = (5 + x) * 2) printf ( %d \n, x); e) Utilizando más de una expresión inicial y de control del bucle D e n t ro de la estructura de control f o r nos es posible utilizar más de una expresión inicial y también más de una expresión bucle. En este ejemplo se muestra mediante una tabla el valor c o rrespondiente al peso de cada producto. El peso inicial son 5 gramos y el valor 20. Luego a causa del aumento de 5 gramos el precio aumenta en 12. #include <stdio.h> #define UNO 20 #define OTRO 12 main () int gramos, valor; printf ( Gramos Valor \n ); for (gramos = 5, valor = UNO; gramos <= 60; gramos += 5, valor += OTRO) printf ( %5d %7d \n, gramos, valor); Gramos Valor 5 20 10 32 15 44 20 56 25 68 30 80 35 92 40 104 45 116 50 128 55 140 60 152
Universidad del País Vasco / Euskal Herriko Unibertsitatea 103 4. Estructura de control while Podemos decir que se trata de una de las estructuras iterativas más generales. Mientras la condición escrita dentro de la estructura de control sea cierta se ejecutan las expresiones definidas dentro del cuerpo del bucle. Está formada por los siguientes elementos: Expresión condicional Expresiones y su formato es el siguiente: while (expresión condicional) expresiones; Valorar expresión inicial N O Condición? S I Expresiones Figura 2: Funcionamiento de la estructura de control while. Esta estructura de control funciona de la siguiente manera: 1. Se evalúa la expresión condicional. De ser cierta se ejecutan las expresiones de la estructura y nuevamente pasamos a evaluar la expresión condicional.
Universidad del País Vasco / Euskal Herriko Unibertsitatea 104 2. De ser falsa la expresión condicional se termina la ejecución del bucle y se pasa a las siguientes instrucciones del programa. Ejemplo: num = 1; while (num <= 10) printf ( suerte con el bucle while \n ); num++; suerte con el bucle while suerte con el bucle while suerte con el bucle while suerte con el bucle while suerte con el bucle while suerte con el bucle while suerte con el bucle while suerte con el bucle while suerte con el bucle while suerte con el bucle while Comparándola con la estructura de control f o r para salir del bucle w h i l e la expresión condicional se debe cambiar dentro del bucle. De otro modo entraríamos en un bucle infinito como podemos ver en el siguiente ejemplo: num = 1; while (num <= 100) printf ( suerte con el bucle while \n );
Universidad del País Vasco / Euskal Herriko Unibertsitatea 105 5. La estructura de control do while Tal y como hemos podido ver en la estructura while las expresiones del cuerpo tan solo se ejecutan si la e x p resión condicional es cierta. Como veremos ahora utilizando la estructura do while, las expresiones del cuerpo se ejecutarán por lo menos una vez, porque la expresión condicional se haya en la salida del bucle. Los elementos que la forman son los siguientes: Expresiones Expresión condicional y su formato es el siguiente: do expresiones; while (expresión condicional); Esta estructura de control funciona así: Expresiones N O Condición? S I Figura 3: Funcionamiento de la estructura de control do while. Las expresiones del cuerpo se ejecutan al menos una vez. A continuación se evalúa la expresión condicional y de ser cierta se vuelven a ejecutar las expresiones. De ser falsa se pasa a la siguiente sentencia del programa.
Universidad del País Vasco / Euskal Herriko Unibertsitatea 106 Ejemplo: num = 1; do printf ( buena suerte con el bucle do while \n ); num++; while (num <= 10); buena suerte con el bucle while buena suerte con el bucle while buena suerte con el bucle while buena suerte con el bucle while buena suerte con el bucle while buena suerte con el bucle while buena suerte con el bucle while buena suerte con el bucle while buena suerte con el bucle while buena suerte con el bucle while
Universidad del País Vasco / Euskal Herriko Unibertsitatea 107 6. Estructuras de control iterativas anidadas Tal y como hemos podido observar las estructuras de control iterativas se utilizan sobre todo para crear bucles. En esos bucles se repiten unas cuantas veces unas expresiones, generalmente en función del valor de una condición. Dentro de un bucle pueden existir otros bucles y en estos casos se denominan bucles anidados. En el siguiente ejemplo se puede observar un bucle anidado: for (expresión inicial; expresión condicional; expresión bucle) while (expresión condicional) for(expresión inicial; expresión condicional; expresión bucle) do expresiones; while (expresión condicional) expresión(es); En el siguiente ejemplo se muestran dos estructuras de control iterativas anidadas. Imaginemos que queremos dibujar el triángulo que viene a continuación mediante el carácter *. * ** *** **** ***** ****** ******* ********
Universidad del País Vasco / Euskal Herriko Unibertsitatea 108 El programa preguntará cuantos asteriscos hay en la base y tomando ese dato dibujará la imagen. #include <stdio.h> void main (void) int base = 0; int cont = 1, linea_cont = 1; printf ( Introduzca los asteriscos que quiera para la base: \n ); scanf ( %d, &base); while (cont <= base) for (linea_cont = 1; linea_cont <= cont; linea_cont++) printf ( * ); printf ( \n ); cont++;
Universidad del País Vasco / Euskal Herriko Unibertsitatea 109 7. Otras estructuras de control: break y continue Hemos visto en anteriores secciones las estructuras de control más usadas en el lenguaje C: i f, i f - e l s e, s w i t c h, f o r, w h i l e y do while. Hay otras estructuras de control que deben utilizarse junto a estas tan sólo en excepciones: b re a k, c o n t i n u e y g o t o. De estas tres tan sólo examinaremos las dos primeras. El uso de la tercera está absolutamente prohibido puesto que va en contra de la buena práctica de pro g r a- mación. Estas estructuras de control no son muy adecuadas desde el punto de vista de la programación estructurada y si es posible no deben ser utilizadas. 7.1. break En ocasiones es conveniente salir del bucle sin tener en cuenta la expresión que lo controla (la expre s i ó n condicional) si es que ha ocurrido una excepción. Para ello se utiliza principalmente la sentencia break. Por otra parte, ya hemos visto la importancia que tiene en la estructura de control switch. Por ejemplo: while ((ch = getchar ())! A ) if (ch = =. ) break; printf( has introducido %c \n, ch); Como puede fácilmente se puede observar podemos escribir esta parte del programa de otra manera y sin utilizar la sentencia break. while ((ch = getchar ())! A && (ch!=. )) printf( has introducido %c \n, ch);
Universidad del País Vasco / Euskal Herriko Unibertsitatea 110 7.2. continue En algunos casos, cuando el cuerpo de las estructuras iterativas resulta complejo, puede suceder que no sea necesario ejecutar una parte del cuerpo a pesar de querer seguir dentro del bucle. Para ello se utiliza la sentencia continue. Por ejemplo: while ((ch = getchar ())! A ) if (ch = =. ) continue; printf( has introducido %c \n, ch); En este caso lo que hace c o n t i n u e es no tomar en cuenta los puntos. También aquí se puede escribir fácilmente el mismo programa sin utilizar continue. while ((ch = getchar ())! A ) if (ch! =. ) printf( has introducido %c \n, ch);
Universidad del País Vasco / Euskal Herriko Unibertsitatea 111 8. Bibliografía KERNIGHAN, BW., RITCHIE D.M. The C Programming Language. Ed. Prentice Hall. QUERO, E., LÓPEZ HERRANZ, J. Programación en Lenguajes Estructurados. Ed. Paraninfo. WA I T E, M., PR ATA, S., MA RT I N, D. P rogramación en C. Introducción y Conceptos Avanzados. Ed. Anaya Multimedia. AUTONAKOS, K.C., MANSFIELD, K.C. Programación Estructurada en C. Ed. Prentice Hall.
Universidad del País Vasco / Euskal Herriko Unibertsitatea 112 9. Ejercicios propuestos 1. Calcular el factorial de un número entero y positivo. 2. Se quiere programar el juego del código. Para ello se definirá una constante de dos dígitos en el p rograma y el jugador (el usuario del programa) tendrá que adivinarlo. Tendrá como máximo 10 oportunidades y el ordenador le informará en cada jugada de cuantas le quedan. Si el jugador adivina el número, el ordenador felicitará al jugador antes de finalizar el programa y le pondrá una nota. Si el jugador no adivina el código en la décima oportunidad, el programa terminará con una invitación a jugar de nuevo. 3. Mediante un programa calcular la raíz de N mediante la fórmula de Newton. N / E i + E i E i+1 = 2 Continuar con el proceso hasta que se cumpla la siguiente condición: E i - E i+1 =< epsilon a) Datos de entrada: Número N, epsilon (precisión) y E 0 (aproximación a la raíz correspondiente al número N). b) Calcular Ei+1 y controlar que se cumpla la condición final. c) Si la condición no se cumple repetir el paso b). d) Si la condición se cumple visualizar la raíz. 4. Este programa leerá una cadena de caracteres introducida mediante teclado (carácter a carácter), y nos dirá cuantos espacios vacíos tenemos y si hemos introducido letras. El final de la cadena será un carácter elegido anteriormente.
Universidad del País Vasco / Euskal Herriko Unibertsitatea 113 5. Escribir un programa que logrará la siguiente suma: N S i i i=1 Donde N es un número introducido mediante el teclado. Utilizar las instrucciones FOR, DO-WHILE y WHILE. 6. Escribir un programa que visualiza en pantalla la tabla de caracteres, partiendo del carácter que posee el código 33. Lo que veremos en pantalla será lo siguiente: En cada línea se visualizarán 8 caracteres y a la derecha de cada uno de ellos el código ASCII correspondiente (en total 28 líneas). columnas 7 10 17 20 27 30 línea 1 33! 34 35 # línea 2 41 ) 42 * 43 + NOTA: El programa sólo visualiza los caracteres escritos en negrita.