Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de...

39
Fundamentos de Informática ETSII Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia Tema 3: Estructuras de Selección. Índice 1. Introducción. 2. Selección simple y doble: if, if...else. 3. Instrucciones if anidadas. 4. Detección de errores en la apertura de un fichero 5. Selección múltiple: switch.

Transcript of Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de...

Page 1: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

1

Fundamentos de InformáticaETSII

Departamento de Sistemas Informáticos y ComputaciónUniversidad Politécnica de Valencia

Tema 3: Estructuras de Selección.

Índice

1. Introducción.2. Selección simple y doble: if, if...else.3. Instrucciones if anidadas.4. Detección de errores en la apertura de un

fichero5. Selección múltiple: switch.

Page 2: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

2

Objetivos

1. Entender los conceptos de la ejecución condicional

2. Conocer funcionamiento y utilización de sentencias if, if...else empleadas de forma sencilla

3. Combinar estructuras de selección4. switch – break

1. Introducciónsecuencia_de_instrucciones = instrucción { “;” instrucción }

Instrucción: acción u operación del programa que conduce a la resolución del problema.Programa: secuencia de instrucciones separadas por “;”.Bloque de instrucciones: conjunto de instrucciones encerrado entre llaves.

Page 3: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

3

Ejemplo

void main(){int i=25, numero;printf(“Dame un número”); scanf(“%d”, &numero); i = i + numero;printf(“Resultado=%d\n”,i);}

Orden de ejecución: secuencial.

1

2

3

4

5

Cambio de la secuencia de ejecución de instrucciones

Instrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición.

Condicionales: if, if-else, switch.Incondicionales: goto No usarlo.

Instrucciones de repetición (bucles): repite un conjunto de instrucciones un número determinado de veces.

Condicionales: la secuencia de instrucciones se ejecuta hasta o mientras se cumple una determinada condición.Incondicional: la secuencia de instrucciones se repite un número determinado de veces.

Page 4: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

4

Instrucción 1

Instrucción 2

Instrucción 3

Ejecución secuencial

Instrucción 1

Instrucción 2 Instrucción 3

Instrucción 1

Instrucción 2

Instrucción 3

Selección Bucle

Ejecución secuencial: las instrucciones se ejecutan en el orden en que aparecen en el programa y una sola vez.

Selección condicional

Determina qué conjunto de instrucciones se ejecutan de acuerdo con algún criterio definido por el programador.

Tipos:Selección simple (if)Selección doble (if-else)Selección múltiple (switch)

Page 5: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

5

2. Selección simple y doble: if, if...else

Selección simple: ifSelección doble: if-else

Selección simple: ifif (condición) instrucción

Si la condición es ciertase ejecutará la instrucción.

Instrucción: puede ser una sentencia simple, un bloque de instrucciones (entre llaves) o sentencias compuestas.

if (condición)

instrucción

if (condición)

{

instrucción 1

instrucción 2

instrucción 3

}

Simple

Bloque

Page 6: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

6

Diagrama de flujo de la instrucción if

if (condición)

instrucción;

Resto de Instrucciones;Instrucción

Condición

Resto de instrucciones

Cierto

Falso

Ejemplo

if (x>0)

printf(“Mayor que 0\n”);

printf(“Adiós\n”);

printf(“Mayor que 0\n”);

X>0

printf(“Adios\n”);

CiertoFalso

Page 7: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

7

Ejemplo

if (n>0) printf (“Mayor que cero\n”);

if (edad>65) {sueldo = SueldoActual*0.75+Complementos;printf(“Lo que cobras es %f\n”, sueldo);}

Cuando más de una instrucción está dentro del if se deben utilizar

llaves

Identación: lo que está dentro del if se pone con varios espacios

delante. Sirve únicamente para ver rápidamente que hay dentro del if.

Ejemplo

int n=0;if (n>0) n++;n = n+25;printf(“n=%d\n”, n);

int n=0;if (n>0) {n++;n = n+25;}printf(“n=%d\n”, n);

n=25 n=0

int n=0;if (n>0); {n++;n = n+25;}printf(“n=%d\n”, n);

n=26

Page 8: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

8

EjemploLeer la edad de dos personas y decir cuál es la de mayor edad. #include <stdio.h>void main(){int n1, n2;printf(“Introduce las edades: “);scanf(“%d%d”, &n1, &n2);if (n1>n2) printf(“La edad de la mayor es %d años.\n”,n1);if (n1<n2) printf(“La edad de la mayor es %d años.\n”,n2);if (n1==n2) printf(“Tienen la misma edad: %d años.\n”,n1);}

El cuerpo del if contiene una única instrucción, por lo que no hace falta poner

llaves.

EjemploLeer un número del fichero “valores.txt” que se encuentra en c:\temp y decir si es positivo. #include <stdio.h>void main(){int x;FILE *f;f=fopen(“c:\\temp\\valores.txt”, “r”);fscanf(f, “%d”, &x); if (x>0) printf(“El número %d es positivo”,x);fclose(f);}

Page 9: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

9

Selección doble: if-elseif (condición) instrucción_1

else instrucción_2

Instrucción_1, instrucción_2: pueden ser una instrucción simple, un bloque de instrucciones (entre llaves), o instrucciones compuestas.Si la condición es cierta se ejecutaráinstrucción_1, si es falsa se ejecutaráinstrucción_2. Sólo se ejecutará una sentencia, no ambas.

Diagrama de flujo de la instrucción if..else

if (condición)

instrucción_cierto;

else

instrucción_falso;

Resto de Instrucciones;

Page 10: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

10

Ejemplo

if (x>=0)

printf(“Positivo”);

else

printf(“Negativo”);

printf(“Adiós\n”);

printf(“Positivo\n”);

X>=0

printf(“Adiós\n”);

Cierto Falso

printf(“Negativo\n”);

Ejemplo#include <stdio.h>void main(){int x;printf(“Dame un número: ”);scanf(“%d”, &x); if (x>=0)

printf(“El número %d es positivo”, x); /* Bloque cierto*/

elseprintf(“El número %d es negativo”, x);

/* Bloque falso*/}

Cuando el bloque sólo contiene una única instrucción, pueden omitirse las llaves

Page 11: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

11

Ejemplo#include <stdio.h>void main(){int x;printf(“Dame un número”); scanf(“%d”,&x); if (x>=0)

printf(“El número %d es positivo”,x); /* Bloque verdadero*/

if (x<0)printf(“El número %d es negativo”,x);

/* Bloque verdadero*/}

Condiciones complementarias

3. Instrucciones if anidadas

if (n >0)printf(“El número %d es mayor que 0\n”, n);

elseif (n == 0)

printf(“Es 0\n”);else

printf(“El número %d es menor que 0\n”,n);

Un if con su else, es una única instrucción, por eso no se ponen

llaves

Page 12: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

12

int edad;printf(“Dime tu edad: ”);scanf(“%d”,&edad);if (edad>=18)

if (edad<=65){printf(“Trabajador.\n”);printf(“Solicitar los datos del contrato.\n”);}

elseprintf(“Jubilado.\n”);

Ejemplo

El cuerpo del segundo ifcontiene más de una

instrucción, por lo que hacen falta llaves.

El cuerpo del primer if contiene una única instrucción, por lo

que no hacen falta llaves. Un ifcon su else correspondiente es

una instrucción.

Ejercicio

Pedir al usuario un número A.

Si el número A es positivo:Pedir un número B.Si es positivo:

Calcular la suma, resta, producto, división y resto de ambos.Mostrar los resultados por pantalla.

Page 13: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

13

void main(){int A, B;printf(“Introduce un valor: “);scanf(“%d”, &A);if (A>0)

{printf(“Introduce otro valor: “);scanf(“%d”, &B);if (B>0)

{printf(“%d + %d = %d\n”, A, B, A+B);printf(“%d - %d = %d\n”, A, B, A-B);printf(“%d * %d = %d\n”, A, B, A*B);printf(“%d / %d = %d\n”, A, B, A/B);printf(“%d % %d = %d\n”, A, B, A%B);}

}}

El cuerpo del if contiene más de una instrucción, por lo que hacen falta

llaves.

Diagrama de flujo

if (condición_1)

sentencia_cierto_1

else

if (condición_2)

sentencia_cierto_2

else

sentencia_falso_2

Sentencia_Cierto_1

Condición_1

Cierto Falso

Condición_2

Sentencia_Cierto_2 Sentencia_Falso_2

Resto de Instrucciones

Cierto Falso

Page 14: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

14

Si no hay llaves, un else siempre va con el último if escrito.

if (edad>=0)if (edad>=18)

printf(“Mayor de edad\n”);else

printf(“Menor de edad\n”);

Si se quiere variar esta situación, poner llaves.

if (edad>=0){if (edad>=18)

printf(“Mayor de edad\n”);}

elseprintf(“Edad incorrecta\n\n”);

Page 15: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

15

Ejercicio¿Cuál es la salida por pantalla de estos programas?

int a=1;if (a==0)

printf(“Es cero\n”);else

printf(“No es cero\n”);printf(“a=%d\n”,a);

int a=1;if (a=0)

printf(“Es cero\n”);else

printf(“No es cero\n”);printf(“a=%d\n”,a);

No es ceroa=1

No es ceroa=0

Ejercicio

Resolver una ecuación de primer grado ax+b=0

Análisis de las soluciones:

Si a!=0 solución x=-b/aSi a==0

b!=0 solución imposible.b==0 solución indeterminada

Page 16: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

16

#include <stdio.h>void main(){float a, b;printf(“Dame las incógnitas de la ecuación ax+b=0: ”); scanf(“%f%f”, &a, &b); if (a!=0)

printf(“El resultado es: %f”,-b/a);else

if (b!=0)printf(“La solución es imposible”);

elseprintf(“La solución es indeterminada”);

}

#include <stdio.h>void main(){float a, b;printf(“Dame las incógnitas de la ecuación ax+b=0: ”);scanf(“%f%f”, &a, &b); if (a!=0) printf(“El resultado es: %f”,-b/a);elseif (b!=0)printf(“La solución es imposible”);elseprintf(“La solución es indeterminada”); }

Versión que no utiliza identación

Page 17: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

17

#include <stdio.h>void main(){float a,b;printf(“Déme las incógnitas a y b de la ecuación ax+b=0: ”);scanf(“%f%f”,&a,&b);if (a!=0)

printf(“El resultado es: %f”,-b/a);if ((a==0) && (b!=0))

printf(“La solución es imposible”); if ((a==0) && (b==0))

printf(“La solución es indeterminada”); }

Realiza 5 comparacionesfrente las 2 del

programa anterior.

Para evitar la anidación, se desglosan las condiciones explícitamente. Resultado más complejo de escribir y más lento de ejecutar

1

2 3

4 5

Ejercicio

Calcular el mayor de tres números enterosintroducidos por teclado.

Page 18: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

18

#include <stdio.h>void main(){int a, b, c;printf(“Dime tres números: “);scanf(“%d%d%d”, &a, &b, &c);

if (a==b && b==c) printf(“Iguales\n”);if (a==b && b<c) printf(“El mayor es %d\n”, c);if (a==b && b>c) printf(“El mayor es %d\n”, b);

if (a>b && a>=c) printf(“El mayor es %d\n”, a);if (a>b && a<c) printf(“El mayor es %d\n”, c);

if (a<b && b>=c) printf(“El mayor es %d\n”, b);if (a<b && b<c) printf(“El mayor es %d\n”, c);}

Versión sin anidación: 18

comparaciones

#include <stdio.h>void main(){int a, b, c;printf(“Dime tres números: “);scanf(“%d%d%d”, &a, &b, &c);if (a==b)

if (b==c) printf(“Iguales\n”);else

if (b<c) printf(“El mayor es %d\n”,c);else printf(“El mayor es %d\n”,b);

elseif (a>b)

if (a>=c) printf(“El mayor es %d\n”,a);else printf(“El mayor es %d\n”,c);

elseif (b>=c) printf(“El mayor es %d\n”,b);else printf(“El mayor es %d\n”,c);

}

Versión con anidación: 7

comparaciones

Page 19: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

19

#include <stdio.h>void main(){int a, b, c, mayor;printf(“Dime tres números: “);scanf(“%d%d%d”, &a, &b, &c);

if (a>=b) mayor = a;else mayor = b;

If (c>mayor) mayor = c;

printf(“El mayor es %d\n”,mayor);}

Otra versión con anidación: 2

comparaciones

Ejercicio

Se desea diseñar un programa en C que lea desde teclado una calificación alfabética:

A, B, C, D, E

y la convierta en la numérica:

10, 8, 6, 5, 0

Page 20: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

20

void main(){char nota;printf(“Déme una calificación: ”); scanf(“%c”,&nota); if ((nota<‘A’) || (nota>’E’))

printf(“Calificación desconocida”);else

{if (nota==‘A’) printf(“La nota es 10”);if (nota==‘B’) printf(“La nota es 8”);if (nota==‘C’) printf(“La nota es 6”);if (nota==‘D’) printf(“La nota es 5”);if (nota==‘E’) printf(“La nota es 0”);}

}

void main(){char nota;printf(“Déme una calificación: ”); scanf(“%c”,&nota); if (nota==‘A’) printf(“La nota es 10”);else

if (nota==‘B’) printf(“La nota es 8”);else

if (nota==‘C’) printf(“La nota es 6”);else

if (nota==‘D’) printf(“La nota es 5”);else

if (nota==‘E’) printf(“La nota es 0”);else

printf(“Calificación desconocida”);}

Otra versión

Page 21: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

21

EjercicioLa fecha del domingo de Pascua corresponde al primer domingo después de la primera luna llena que sigue al equinoccio de primavera.Dado un año, los cálculos que permiten conocer esta fecha son:

A = año %19B = año % 4C = año % 7D = (19 * A + 24) % 30E = (2 * B + 4 * C + 6 * D + 5) % 7N = (22 + D + E)

Donde N indica el número del día del mes de marzo (o abril si N es superior a 31) correspondiente al domingo de Pascua. Escribir unprograma que lea un año y muestre el día y el mes en el que se celebró o se celebrará el domingo de Pascua ese año.

Por ejemplo: si introducimos el año 2002, los cálculos son los siguientes:

A = 2002 % 19 = 7B = 2002 % 4 = 2C = 2002 % 7 = 0D = (19 * 7 + 24) % 30 = 157 % 30 = 7E = (2 * 2 + 4 * 0 + 6 * 7 + 5) % 7 = 51 % 7 = 2N = (22 + 7 + 2) = 31

Es decir, el año 2002 el domingo de Pascua fue el 31 de marzo.

Page 22: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

22

#include <stdio.h>void main(){int anyo, a, b, c, d, e, n;printf ("Introduce un año:");scanf ("%d", &anyo);

a = anyo % 19;b = anyo % 4;c = anyo % 7;d = (19 * a + 24) % 30;e = (2 * b + 4 * c + 6 * d + 5) % 7;n = 22 + d + e;

if (n<=31)printf ("El Domingo de Pascua del año %d es el

%d de marzo\n", anyo, n);else

printf ("El Domingo de Pascua del año %d es el %d de abril\n", anyo, n-31);

}

Page 23: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

23

Ejercicio

Calcular el máximo de 4 números introducidos por teclado.

Nota: pensar un método diferente al problema del máximo de 3 números enteros.

Entrada: 4 valoresSalida: el valor máximo de los cuatro

AlgoritmoPedir los valores al usuario (valor1, valor 2, valor3, valor4)

Tomar el primer valor como el máximo actual (máximo=valor1)Si el segundo valor es mayor que el máximo actual

El nuevo máximo es el segundo valor (máximo=valor2)Si el tercer valor es mayor que el máximo actual

El nuevo máximo es el tercer valor (máximo=valor3)Si el cuarto valor es mayor que el máximo actual

El nuevo máximo es el cuarto valor (máximo=valor4)

Mostrar por pantalla el valor máximo

Entrada

P

R

O

C

E

S

O

Salida

Page 24: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

24

#include <stdio.h>void main (){ float a, b, c, d, maximo;

/* Lectura de datos */printf ("Introduzca los 4 números: \n");scanf ("%f%f%f%f", &a, &b, &c, &d);

/* Calculo */maximo = a;if (b > maximo) maximo = b;if (c > maximo) maximo = c;if (d > maximo) maximo = d;

/* Escritura de resultados */printf ("El número máximo es: %f\n", maximo);}

4. Detección de errores en la apertura de un fichero

¿Cómo saber si el fichero se ha abierto correctamente?

Si el fichero no se puede abrir, fopen retorna NULL.

FILE *fichero;

if ((fichero = fopen (“c:\\temp\\prueba.txt”, “r”))==NULL)printf(“Fichero no existe\n”);

fichero = fopen (“c:\\temp\\prueba.txt”, “r”);If (fichero==NULL)

printf(“Fichero no existe\n”);

Page 25: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

25

EjercicioAbrir el fichero “pepito.txt” para lectura.

Detectar si se ha abierto correctamente el fichero. Si no se abre correctamente dar un mensaje de error.

Leer un valor entero. Indicar por pantalla si es par o impar.

Cerrar el fichero.

void main(){int x; FILE *f;if ((f=fopen(“pepito.txt”, “r”))==NULL)

printf(“No se puede abrir el fichero\n”);else

{fscanf(f, “%d”, &x); if (x%2==0) printf(“El número %d es par\n”,x);else printf(“El número %d es impar\n”,x); fclose(f);}

}

Page 26: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

26

void main(){int x; FILE *f;if ((f=fopen(“pepito.txt”, “r”))==NULL)

{printf(“No se puede abrir el fichero\n”);exit (0);}

fscanf(f, “%d”, &x); if (x%2==0) printf(“El número %d es par\n”,x);else printf(“El número %d es impar\n”,x);fclose(f);}

Otra versión.

La instrucción exit termina el programa, por lo que ya no se ejecuta el resto del

programa si el fichero no se abre.

Ejercicio

Leer la edad de 2 personas de un fichero “edad.txt”.

Mostrarlas ordenadas de menor a mayor en el fichero “salida.txt”.

Page 27: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

27

void main () {FILE *e, *s; int edad1, edad2;

if ((e=fopen(“edad.txt”, “r”))==NULL)printf(“No se puede abrir el fichero edad.txt.\n”);

else {if ((s=fopen(“salida.txt”, “w”))==NULL)

printf(“No se puede abrir el fichero salida.txt.\n”);else {

fscanf (e, “%d%d”, &edad1, &edad2);if (edad1>=edad2)

fprintf (s, “%d - %d\n”, edad2, edad1);else

fprintf (s, “%d - %d\n”, edad1, edad1);fclose(s);}

fclose(e);}

}

void main () {FILE *e, *s; int edad1, edad2;

if ((e=fopen(“edad.txt”, “r”))==NULL){printf(“No se puede abrir el fichero edad.txt.\n”);exit(0);}

if ((s=fopen(“salida.txt”, “w”))==NULL){printf(“No se puede abrir el fichero salida.txt.\n”);fclose(e);exit(0);}

fscanf (e, “%d%d”, &edad1, &edad2);if (edad1>=edad2)

fprintf (s, “%d - %d\n”, edad2, edad1);else

fprintf (s, “%d - %d\n”, edad1, edad1);fclose(e);fclose(s);}

Otra versión.

Cuando se termina el programa por no poder

abrir el fichero de salida, debe cerrarse el

fichero que estáabierto.

Page 28: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

28

5. Selección múltiple: switchPermite seleccionar entre múltiples caminos sin necesidad de anidar y evaluando una única expresión

switch (expresión){case valor1:

instrucciones_1;break;

case valor2:instrucciones_2;break;

......default:

instrucciones_n; break;

}

Ejemploint opc;printf(“1. Ingreso.\n”);printf(“2. Reintegro.\n”);printf(“3. Consulta de saldo.\n”);scanf(“%d”,&opc);switch (opc)

{case 1: printf(“Ha elegido ingreso.\n”); break;case 2: printf(“Ha elegido reintegro.\n”); break;case 3: printf(“Ha elegido consulta.\n”); break;default: printf(“Opción incorrecta.\n”);}

Aunque haya más de una instrucción

dentro de cada case, no hay que poner

llaves.

Page 29: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

29

Ejemploif (opc==1)

printf(“Ha elegido ingreso.\n”);else

if (opc==2)printf(“Ha elegido reintegro.\n”);

elseif (opc==3)

printf(“Ha elegido consulta.\n”);else

printf(“Opción incorrecta.\n”);

If equivalente

PropiedadesSólo se puede seleccionar en base a la evaluación de una única expresión.La evaluación de la expresión de switch siempre debe generar un único valor (entero o char).Los valores de cada case debe ser constantes. No se puede utilizar nombres de variables.La ejecución de un case no para hasta que encuentra un break (o finaliza), sobrepasando incluso otros case.

Page 30: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

30

Ejemplo#include <stdio.h>void main(){char nota;printf(“Déme una calificación: ”);scanf(“%c”, &nota);switch (nota)

{case ‘A’: printf(“La nota es 10”); break;case ‘B’: printf(“La nota es 8”); break;case ‘C’: printf(“La nota es 6”); break;case ‘D’: printf(“La nota es 5”); break;case ‘E’: printf(“La nota es 0”); break;default : printf(“Nota desconocida”);}

}

La expresión es de tipo carácter

Ejemplochar c;printf(“Opción: “);scanf(“%c”,&c);switch (c)

{case ‘1’: printf(“Elegida opción 1.\n”);

break;case ‘2’: printf(“Elegida opción 2.\n”);

break;case ‘3’: printf(“Elegida opción 3.\n”);

break;default: printf(“Opción incorrecta.\n”);}

La expresión es de tipo carácter

Page 31: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

31

Ejemploint c;printf(“Opción: “);scanf(“%d”,&c);switch (c)

{case 1: printf(“Elegida opción 1.\n”);

break;case 2: printf(“Elegida opción 2.\n”);

break;case 3: printf(“Elegida opción 3.\n”);

break;default: printf(“Opción incorrecta.\n”);}

La expresión es de tipo entero

Ejemplo, NO se puede:#include <stdio.h>void main(){float nota;printf(“Déme una calificación: ”);scanf(“%f”,&nota);switch (nota)

{case (nota<5.0): printf(“La nota es 4”); break;case 5.0: printf(“La nota es 5”); break;case 6.0: printf(“La nota es 6”); break;case 7.0: printf(“La nota es 7”); break;case 8.0: printf(“La nota es 8”); break;case 9.0: printf(“La nota es 9”); break;default : printf(“Nota desconocida”);}

}

La expresión debe ser int o char

El valor de case debe ser constante, no puede

ser una expresión, no puede contener

variables

Page 32: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

32

Ejemploint c;printf(“Opción: “);scanf(“%d”,&c);switch (c)

{case 1:

printf(“Elegida opción 1.\n”);case 2:

printf(“Elegida opción 2.\n”);case 3:

printf(“Elegida opción 3.\n”);default:

printf(“Opción incorrecta.\n”);}

¿Qué muestra por pantalla este programa si se elige cada una de

las opciones?

Opción 1:Elegida opción 1.Elegida opción 2.Elegida opción 3.Opción incorrecta.Opción 2:Elegida opción 2.Elegida opción 3.Opción incorrecta.Opción 3:Elegida opción 3.Opción incorrecta.Otra opción:Opción incorrecta.

EjercicioMostrar al usuario un menú por pantalla de una máquina de café con las opciones:

1. Café sólo2. Cortado3. Chocolate4. Leche

Mostrar al usuario el importe de lo que va a tomar cuando elija la opción (café sólo y leche: 35 centimos, cortado 40 centimos, chocolate 30 centimos).

Page 33: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

33

void main(){int opc;printf(“1. Café sólo\n”); printf(“2. Cortado\n”); printf(“3. Chocolate\n”); printf(“4. Leche\n”); scanf(“%d”,&opc);

switch(opc){case 1: printf(“El precio de café solo es 35 céntimos\n”); break;case 2: printf(“El precio del cortado es 40 céntimos\n”); break;case 3: printf(“El precio del chocolate es 30 céntimos\n”); break;case 4: printf(“El precio de la leche es 35 céntimos\n”); break;default: printf(“Opción incorrecta\n”);}

}

EjercicioConvertir un valor numérico en una nota: suspendido, aprobado, notable, sobresaliente, matricula, etc...

Valores: [0-5[ corresponde a Suspendido[5-7[ corresponde a Aprobado[7-9[ corresponde a Notable[9-10[ corresponde a Sobresaliente10 corresponde a Matricula.

Hacerlo con if (anidados y no anidados) y con switch.

Page 34: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

34

void main(){int nota;printf(“Déme una calificación”); scanf(“%d”,&nota);if ((nota<0) || (nota>10))

printf(“Calificación desconocida”);if ((nota>0) && (nota<5))

printf(“Nota %d = Suspenso”,nota);if ((nota>=5) && (nota<7))

printf(“Nota %d = Aprobado”,nota);if ((nota>=7) && (nota<9))

printf(“Nota %d = Notable”,nota);if ((nota>=9) && (nota<10))

printf(“Nota %d = Sobresaliente”,nota);if (nota==10)

printf(“Nota %d = Matricula”,nota);}

Versión con ifsecuenciales

void main(){int nota;printf(“Déme una calificación”); scanf(“%d”,&nota);

if ((nota<0)||(nota>10))printf(“Calificación desconocida”);

else if (nota<5) printf(“Nota %d = Suspenso”,nota);else

if (nota<7) printf(“Nota %d = Aprobado”,nota);else

if (nota<9) printf(“Nota %d = Notable”,nota);else

if (nota<10)printf(“Nota %d = Sobresaliente”,nota);

elseprintf(“Nota %d = Matricula”,nota);

}

Versión con if anidados

Page 35: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

35

void main(){int nota;printf(“Déme una calificación”); scanf(“%d”,&nota);switch (nota)

{case 0:case 1:case 2:case 3:case 4: printf(“Nota %d = Suspendido”,nota); break;case 5:case 6: printf(“Nota %d = Aprobado”,nota); break; case 7:case 8: printf(“Nota %d = Notable”,nota); break;case 9: printf(“Nota %d = Sobresaliente”,nota); break;case 10: printf(“Nota %d = Matricula”,nota); break;default : printf(“Nota desconocida”);}

}

Versión con switch

Inconvenientes de switchNo se puede emplear cuando la elección está basada en una comparación de variables o expresiones de tipo float.No se puede usar cuando la variable estácomprendida en un cierto rango y no es un valor concreto.Se deben usar constantes como etiquetas, no variables. En general, switch es más eficiente que if.

Page 36: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

36

Ejemploif (n < 100 && n > 2) ...

switch (n){case 3:case 4:...case 99: ...}

La versión con if es más corta y más eficiente.

Con switch hay que escribir todos los posibles valores.

EjercicioEscribir un programa que construya una calculadora básica.

Debe mostrarse un menú con las siguientes opciones: suma, resta, multiplicación, división, raíz cuadrada y potencia.

Se debe de elegir una operación. Para la opción elegida se piden y validan los datos de la opción correspondiente y se realiza la operación correspondiente.

Page 37: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

37

Utilizar:

Función sqrt(a): obtiene la raíz cuadrada de a.

Función pow(a, b): obtiene a elevado a b.

AlgoritmoMostrar el menú.Pedir al usuario la opción del menú.Realizar la operación según la opción:

Si la operación es sumar:Pedir dos valores al usuarioSumarlos

Si la operación es restar:Pedir dos valores al usuarioRestarlos

Si la operación es multiplicar:Pedir dos valores al usuarioMultiplicarlos

Si la operación es dividir:Pedir dos valores al usuarioSi divisor ≠ 0

DividirlosSi la operación es raíz cuadrada:

Pedir un valor al usuarioSi valor >0

Calcular raízSi la operación es potencia:

Pedir dos valores al usuarioCalcular ab

Page 38: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

38

Menú

#include <stdio.h>#include <math.h>void main(){int opcion;float a, b;

printf("Menú\n");printf("1. Sumar.\n");printf("2. Restar.\n");printf("3. Multiplicar.\n");printf("4. Dividir.\n");printf("5. Raíz cuadrada.\n");printf("6. Potencia.\n");printf("Opción elegida: ");scanf("%d",&opcion);

switch(opcion){case 1: /* Sumar */

printf("Introduce los valores a sumar (a+b): ");scanf("%f%f", &a, &b);printf("%f + %f = %f\n", a, b, a+b);break;

case 2: /* Restar */printf("Introduce los valores a restar (a-b): ");scanf("%f%f", &a, &b);printf("%f - %f = %f\n", a, b, a-b);break;

case 3: /* Multiplicar */printf("Introduce los valores a multiplicar (a*b): ");scanf("%f%f", &a, &b);printf("%f * %f = %f\n", a, b, a*b);break;

Page 39: Tema 03. Selecci.nCambio de la secuencia de ejecución de instrucciones zInstrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición. zCondicionales:

39

case 4: /* Dividir */printf("Introduce los valores a dividir (a/b): ");scanf("%f%f", &a, &b);if (b==0) printf("Divisor 0\n");else printf("%f / %f = %f\n", a, b, a/b);break;

case 5: /* Raíz cuadrada */printf("Introduce el valor para calcular la raíz: ");scanf("%f", &a);if (a<0) printf("No se puede calcular la raíz cuadrada.\n");else printf("Raíz de %f = %f\n", a, sqrt(a));break;

case 6: /* Potencia */printf("Introduce los valores para calcular la potencia (a^b): ");scanf("%f%f", &a, &b);printf("%f^%f = %f\n", a, b, pow(a,b));break;

default: printf("Opción incorrecta.\n");}

}