Sentencias de control Fundamentos de Informática EUP ULPGC Jose Torres Introducción Programa: secuencia ordenada de instrucciones => flujo de ejecución = orden en que se ejecutan Hasta ahora ejecución secuencial = orden en el que aparecen en el texto del programa Esto es limitado, nesecitamos: - ejecutar conjunto de instrucciones cuando se cumple una condición - repetir un conjunto de instrucciones un número de veces Existen sentencias de control para expresar los distintos flujos de ejecución Fundamentos de Informática EUP ULPGC Jose Torres Tipos de flujos de ejecución que son implementados mediante sentencias de control: − Secuencia: ejecución sucesiva de dos o más operaciones; una instrucción detrás de otra separadas por ‘;’ − Selección: se realiza una u otra operación, dependiendo de una condición; sentencia ‘if-else’ − Iteración: repetición de una operación mientras se cumpla una condición (bucle); sentencias ‘while’, ’for’ y ’do-while’ Fundamentos de Informática EUP ULPGC Jose Torres Fundamentos de Informática EUP ULPGC Jose Torres Sentencia if (selección) Forma general: if (expresion) sentencia; Si expresion es verdadera (valor mayor que 0) => se ejecuta sentencia La expresion debe estar entre paréntesis Si sentencia es compuesta (secuencia de instrucciones) => if (expresion) { sentencia_1; sentencia_2; ... sentencia_n; } Fundamentos de Informática EUP ULPGC Jose Torres Diagrama de flujo: Fundamentos de Informática EUP ULPGC Jose Torres Ejemplo 1: Programa que lee un número y comprueba si es mayor que cero: #include <stdio.h> void main() { int numero; /* leer el numero */ printf("Introduzca un numero: "); scanf("%d", &numero); if (numero > 0) printf("El numero %d es mayor que cero.\n", numero); if (numero <= 0) printf("El numero %d no es mayor que cero.\n", numero); } Fundamentos de Informática EUP ULPGC Jose Torres Ejemplo 2: Programa que lee un número y lo eleva al cuadrado si es >0 #include <stdio.h> void main() { int numero, cuadrado; /* leer el numero */ printf("Introduzca un numero: "); scanf("%d", &numero); if (numero > 0) { cuadrado = numero * numero; printf("El cuadrado de %d es %d.\n", numero, cuadrado); } if (numero <= 0) printf("El numero no es mayor que 0.\n”); } Fundamentos de Informática EUP ULPGC Jose Torres Sentencia if-else (selección) Forma ampliada de la sentencia if Forma general: if (expresion) sentencia_1; else sentencia_2; Si expresion es: - verdadera (valor mayor que 0) => se ejecuta sentencia 1 - falsa (valor igual a 0) => se ejecuta sentencia 2 Si las sentencias son compuestas se encierran entre { } Fundamentos de Informática EUP ULPGC Jose Torres Sentencia if-else, diagrama de flujo: Fundamentos de Informática EUP ULPGC Jose Torres Ejemplo : Programa que lee un número e indica si es mayor que cero: #include <stdio.h> void main() { int numero; /* leer el numero */ printf("Introduzca un numero: "); scanf("%d", &numero); if (numero > 0) printf("El numero %d es mayor que cero.\n", numero); else printf("El numero %d no es mayor que cero.\n", numero); } Fundamentos de Informática EUP ULPGC Jose Torres Las sentencias pueden ser a su vez sentencias if-else if (e1) S1 else if (e2) S2 else S3 El funcionamiento sería: − si e1 es verdadera se ejecuta S1 − si e1 es falsa y e2 es verdadera se ejecuta S2 − si e1 es falsa y e2 es falsa se ejecuta S3 Fundamentos de Informática EUP ULPGC Jose Torres Ejemplo: comprobar si un número es menor, mayor o igual que 0 #include <stdio.h> void main() { int numero; printf("Introduzca un numero: "); scanf("%d", &numero); if (numero < 0) printf (“El numero es menor que cero.\n”); else if (numero > 0) printf (“El numero es mayor que cero.\n”); else printf (“El numero es igual que cero.\n”); } Fundamentos de Informática EUP ULPGC Jose Torres falso falso (numero < 0) verdadero (numero > 0) verdadero printf (“El numero es menor que cero.\n”); printf (“El numero es mayor que cero.\n”); printf (“El numero es igual que cero.\n”); Este sería el diagrama de flujo del ejemplo anterior Fundamentos de Informática EUP ULPGC Jose Torres Sentencia while (iteración) Forma general: while (expresion) sentencia sentencia se ejecutará mientras el valor de expresion sea verdadero (distinto de 0) Se evalúa la expresión; si es verdadera se ejecuta la sentencia y se vuelve a evaluar la expresión; si es falsa se ejecuta la siguiente sentencia Lo normal es que sentencia incluya alguna instrucción que altere el valor de expresión, proporcionando así la condición de salida del bucle Fundamentos de Informática EUP ULPGC Jose Torres Si la sentencia es compuesta se encierra entre { } while (expresion) { sentencia 1 sentencia 2 . . sentencia N } Fundamentos de Informática EUP ULPGC Jose Torres Diagrama de flujo de la sentencia while Fundamentos de Informática EUP ULPGC Jose Torres Ejemplo 1: programa que lee enteros y los escribe en pantalla hasta que se teclee el cero #include <stdio.h> void main() { int n; printf("Introduzca un numero: "); scanf("%d", &n); while (n != 0) { printf(“El numero tecleado fue %d.\n”, n); printf("Introduzca otro numero: "); scanf("%d", &n); } printf(“Haz tecleado un cero. Fin del programa.”); } Fundamentos de Informática EUP ULPGC Jose Torres Ejemplo 2: igual que 1 pero que además diga si es positivo o negativo #include <stdio.h> void main() { int n; printf("Introduzca un numero: "); scanf("%d", &n); while (n != 0) { printf(“El numero tecleado fue %d.\n”, n); if (n < 0) printf(“El número es negativo.\n”); else printf(“El número es positivo.\n”); } printf(“Haz tecleado un cero. Fin del programa.”); } Fundamentos de Informática EUP ULPGC Jose Torres Ejemplo: programa que lee un número n y calcula 1+2+..+n #include <stdio.h> void main() { int n, suma = 0; printf("Introduzca un numero: "); scanf("%d", &n); while (n > 0) { suma = suma + n; n = n - 1; /* equivalente a n-- */ } printf("1 + 2 +...+ n = %d\n", suma); } Fundamentos de Informática EUP ULPGC Jose Torres Sentencia for (iteración) Forma general: for (asignacion1; expresion; asignacion2) sentencia Inicialmente (solo la primera vez) se ejecuta asignacion1: se inicializa algún parámetro que controla la repetición del bucle expresion es una condición que debe ser cierta para que se ejecute sentencia asignacion2 se utiliza para modicar el valor del parámetro El bucle se repite mientras expresion no sea cero (falso) Si sentencia es compuesta se encierra entre { } Fundamentos de Informática EUP ULPGC Jose Torres Diagrama de flujo de la sentencia for (expresion1=asignacion1, expresion2=expresion, expresion3=asignacion2) Fundamentos de Informática EUP ULPGC Jose Torres Ejemplo: Programa que imprime los 100 primeros números #include <stdio.h> void main() { int numero; for (numero=0; numero <100; numero++) printf("%d ", numero); } Fundamentos de Informática EUP ULPGC Jose Torres El diagrama de flujo sería Fundamentos de Informática EUP ULPGC Jose Torres Ejemplo 2: muestra la cuenta atrás desde un numero dado #include <stdio.h> void main() { int numero, indice; printf (“Dame el inicio de la cuenta atrás: ”); for (indice=numero; indice > 0; indice++) printf("%d\n ", indice); printf(“Despegue…\n”); } Fundamentos de Informática EUP ULPGC Jose Torres Ejemplo 3: calcula el doble de los 10 primeros números naturales #include <stdio.h> void main() { int numero, doble; for (numero=0; numero <10; numero++) { doble=2*numero; printf("El doble de %d es %d.\n", numero, doble); } } Fundamentos de Informática EUP ULPGC Jose Torres Equivalencia del for y el while for (numero=0; numero <100; numero++) printf("%d ", numero); es equivalente a numero=0; while (numero < 100) { printf("%d ", numero); numero++; } Fundamentos de Informática EUP ULPGC Jose Torres Sentencia do-while (iteración) Formal general: do sentencia while (expresion); sentencia se ejecutará mientras el valor de expresión sea verdadero (distinto de 0) sentencia siempre se ejecuta al menos una vez (diferente a while) Si la sentencia es compuesta se encierra entre { } Fundamentos de Informática EUP ULPGC Jose Torres Diagrama de flujo: Fundamentos de Informática EUP ULPGC Jose Torres Ejemplo: programa que calcula el sumatorio de 1 a n #include <stdio.h> void main() { int numero, suma=0; printf ("Introduzca un numero (mayor que 0): "); scanf ("%d", &numero); do { suma=suma+numero; numero--; } while (numero != 0); printf ("1 + 2 +...+ n = %d\n", suma); } Fundamentos de Informática EUP ULPGC Jose Torres Sentencia switch Estructura de selección: permite decidir que secuencia se ejecuta a continuación Formal general: Fundamentos de Informática EUP ULPGC Jose Torres switch (expresion) case exp 1: sentencia 1.1; sentencia 1.2; … break; … case exp N: sentencia N.1; sentencia N.2; … break; default: sentencia D.1; sentencia D.2; … Fundamentos de Informática EUP ULPGC { } Jose Torres Se evalúa la expresion del switch que debe dar un valor entero o un carácter (exp 1, . . . , exp N representan expresiones constantes de valores enteros o caracteres) Después se ejecutarán las instrucciones a partir de la sentencia case cuya expresión coincida con el valor de la expresión del switch, hasta la próxima sentencia break o el final de la sentencia switch completa Si no se encuentra una sentencia ‘case’ cuya expresion coincida con el resultado del ‘switch’, se ejecutan las instrucciones del ‘default’, en caso de que exista Fundamentos de Informática EUP ULPGC Jose Torres Diagrama de flujo: Fundamentos de Informática EUP ULPGC Jose Torres Ejemplo: programa que dada una letra, responde si es vocal o consonante #include <stdio.h> void main() { char letra; printf("Introduzca una letra: "); scanf("%d", &letra); switch (letra) { case ‘a': case ‘A': case ‘e': case ‘E': case ‘i': Fundamentos de Informática EUP ULPGC Jose Torres case ‘I': case ‘o': case ‘O': case ‘u': case ‘U': printf("%c es una vocal.", letra); break; default: printf("%c es una consonante.", letra); } } Fundamentos de Informática EUP ULPGC Jose Torres Ejemplo: programa que dado el número del mes de un año no bisiesto, responde los días que tiene #include <stdio.h> void main() { int mes, diasMes; printf("Introduzca el numero del mes: "); scanf("%d", &mes); Fundamentos de Informática EUP ULPGC Jose Torres switch (mes) { case 4: case 6: case 9: case 11: diasMes=30; break; case 2: diasMes=28; break; default: diasMes=31; } printf (“El mes numero %d tiene %d dias.”, mes, diasMes); } Fundamentos de Informática EUP ULPGC Jose Torres Bucles anidados Los bucles se pueden anidar unos dentro de otros Ejemplo: Calcular 1 + 2 + …N mientras N sea distinto de 0 #include <stdio.h> void main() { int N; int suma; int j; Fundamentos de Informática EUP ULPGC Jose Torres do { /* leer el numero N */ printf("Introduzca N: "); scanf("%d", &N); suma = 0; for (j = 0; j <= N; j++) suma = suma + j; /* bucle anidado */ printf("1 + 2 + ... + N = %d\n", suma); } while (N > 0); /* fin del bucle do */ } Fundamentos de Informática EUP ULPGC Jose Torres