Tema 03 Seleccion -...

36
1 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 Introducción. Selección simple y doble: if, if...else. Instrucciones if anidadas. Detección de errores en la apertura de un fichero Selección múltiple: switch.

Transcript of Tema 03 Seleccion -...

Page 1: Tema 03 Seleccion - users.dsic.upv.esusers.dsic.upv.es/~onaindia/TEACHING/FUNDAMENTOS_FI/Tema_3... · 2 Objetivos zEntender los conceptos de la ejecución condicional zConocer funcionamiento

1

Fundamentos de InformáticaETSII

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

Tema 3: Estructuras de Selección.

Índice

Introducción.Selección simple y doble: if, if...else.Instrucciones if anidadas.Detección de errores en la apertura de un ficheroSelección múltiple: switch.

Page 2: Tema 03 Seleccion - users.dsic.upv.esusers.dsic.upv.es/~onaindia/TEACHING/FUNDAMENTOS_FI/Tema_3... · 2 Objetivos zEntender los conceptos de la ejecución condicional zConocer funcionamiento

2

Objetivos

Entender los conceptos de la ejecución condicionalConocer funcionamiento y utilización de sentencias if, if...else empleadas de forma sencillaCombinar estructuras de selecciónswitch – 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 Seleccion - users.dsic.upv.esusers.dsic.upv.es/~onaindia/TEACHING/FUNDAMENTOS_FI/Tema_3... · 2 Objetivos zEntender los conceptos de la ejecución condicional zConocer funcionamiento

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 Seleccion - users.dsic.upv.esusers.dsic.upv.es/~onaindia/TEACHING/FUNDAMENTOS_FI/Tema_3... · 2 Objetivos zEntender los conceptos de la ejecución condicional zConocer funcionamiento

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 Seleccion - users.dsic.upv.esusers.dsic.upv.es/~onaindia/TEACHING/FUNDAMENTOS_FI/Tema_3... · 2 Objetivos zEntender los conceptos de la ejecución condicional zConocer funcionamiento

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 Seleccion - users.dsic.upv.esusers.dsic.upv.es/~onaindia/TEACHING/FUNDAMENTOS_FI/Tema_3... · 2 Objetivos zEntender los conceptos de la ejecución condicional zConocer funcionamiento

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 Seleccion - users.dsic.upv.esusers.dsic.upv.es/~onaindia/TEACHING/FUNDAMENTOS_FI/Tema_3... · 2 Objetivos zEntender los conceptos de la ejecución condicional zConocer funcionamiento

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 Seleccion - users.dsic.upv.esusers.dsic.upv.es/~onaindia/TEACHING/FUNDAMENTOS_FI/Tema_3... · 2 Objetivos zEntender los conceptos de la ejecución condicional zConocer funcionamiento

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 Seleccion - users.dsic.upv.esusers.dsic.upv.es/~onaindia/TEACHING/FUNDAMENTOS_FI/Tema_3... · 2 Objetivos zEntender los conceptos de la ejecución condicional zConocer funcionamiento

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 Seleccion - users.dsic.upv.esusers.dsic.upv.es/~onaindia/TEACHING/FUNDAMENTOS_FI/Tema_3... · 2 Objetivos zEntender los conceptos de la ejecución condicional zConocer funcionamiento

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 Seleccion - users.dsic.upv.esusers.dsic.upv.es/~onaindia/TEACHING/FUNDAMENTOS_FI/Tema_3... · 2 Objetivos zEntender los conceptos de la ejecución condicional zConocer funcionamiento

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 Seleccion - users.dsic.upv.esusers.dsic.upv.es/~onaindia/TEACHING/FUNDAMENTOS_FI/Tema_3... · 2 Objetivos zEntender los conceptos de la ejecución condicional zConocer funcionamiento

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 Seleccion - users.dsic.upv.esusers.dsic.upv.es/~onaindia/TEACHING/FUNDAMENTOS_FI/Tema_3... · 2 Objetivos zEntender los conceptos de la ejecución condicional zConocer funcionamiento

13

#include <stdio.h>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 Seleccion - users.dsic.upv.esusers.dsic.upv.es/~onaindia/TEACHING/FUNDAMENTOS_FI/Tema_3... · 2 Objetivos zEntender los conceptos de la ejecución condicional zConocer funcionamiento

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 Seleccion - users.dsic.upv.esusers.dsic.upv.es/~onaindia/TEACHING/FUNDAMENTOS_FI/Tema_3... · 2 Objetivos zEntender los conceptos de la ejecución condicional zConocer funcionamiento

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 Seleccion - users.dsic.upv.esusers.dsic.upv.es/~onaindia/TEACHING/FUNDAMENTOS_FI/Tema_3... · 2 Objetivos zEntender los conceptos de la ejecución condicional zConocer funcionamiento

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 Seleccion - users.dsic.upv.esusers.dsic.upv.es/~onaindia/TEACHING/FUNDAMENTOS_FI/Tema_3... · 2 Objetivos zEntender los conceptos de la ejecución condicional zConocer funcionamiento

17

Ejemplo#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 Seleccion - users.dsic.upv.esusers.dsic.upv.es/~onaindia/TEACHING/FUNDAMENTOS_FI/Tema_3... · 2 Objetivos zEntender los conceptos de la ejecución condicional zConocer funcionamiento

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);

system(“PAUSE”);}

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);

system(“PAUSE”);}

Versión con anidación: 7

comparaciones

Page 19: Tema 03 Seleccion - users.dsic.upv.esusers.dsic.upv.es/~onaindia/TEACHING/FUNDAMENTOS_FI/Tema_3... · 2 Objetivos zEntender los conceptos de la ejecución condicional zConocer funcionamiento

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);

system(“PAUSE”);}

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 Seleccion - users.dsic.upv.esusers.dsic.upv.es/~onaindia/TEACHING/FUNDAMENTOS_FI/Tema_3... · 2 Objetivos zEntender los conceptos de la ejecución condicional zConocer funcionamiento

20

#include <stdio.h>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”);}

}

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.

Page 21: Tema 03 Seleccion - users.dsic.upv.esusers.dsic.upv.es/~onaindia/TEACHING/FUNDAMENTOS_FI/Tema_3... · 2 Objetivos zEntender los conceptos de la ejecución condicional zConocer funcionamiento

21

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.

#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;

Page 22: Tema 03 Seleccion - users.dsic.upv.esusers.dsic.upv.es/~onaindia/TEACHING/FUNDAMENTOS_FI/Tema_3... · 2 Objetivos zEntender los conceptos de la ejecución condicional zConocer funcionamiento

22

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);

system(“PAUSE”);}

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

Page 23: Tema 03 Seleccion - users.dsic.upv.esusers.dsic.upv.es/~onaindia/TEACHING/FUNDAMENTOS_FI/Tema_3... · 2 Objetivos zEntender los conceptos de la ejecución condicional zConocer funcionamiento

23

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

#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);}

Page 24: Tema 03 Seleccion - users.dsic.upv.esusers.dsic.upv.es/~onaindia/TEACHING/FUNDAMENTOS_FI/Tema_3... · 2 Objetivos zEntender los conceptos de la ejecución condicional zConocer funcionamiento

24

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”);

EjercicioAbrir el fichero “pepito.txt” para lectura. Leer un valor entero y cerrarlo. Detectar si se ha abierto correctamente 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); fclose(f);}

}

Page 25: Tema 03 Seleccion - users.dsic.upv.esusers.dsic.upv.es/~onaindia/TEACHING/FUNDAMENTOS_FI/Tema_3... · 2 Objetivos zEntender los conceptos de la ejecución condicional zConocer funcionamiento

25

Ejercicio

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

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

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);}

}

Page 26: Tema 03 Seleccion - users.dsic.upv.esusers.dsic.upv.es/~onaindia/TEACHING/FUNDAMENTOS_FI/Tema_3... · 2 Objetivos zEntender los conceptos de la ejecución condicional zConocer funcionamiento

26

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 27: Tema 03 Seleccion - users.dsic.upv.esusers.dsic.upv.es/~onaindia/TEACHING/FUNDAMENTOS_FI/Tema_3... · 2 Objetivos zEntender los conceptos de la ejecución condicional zConocer funcionamiento

27

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.

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

Page 28: Tema 03 Seleccion - users.dsic.upv.esusers.dsic.upv.es/~onaindia/TEACHING/FUNDAMENTOS_FI/Tema_3... · 2 Objetivos zEntender los conceptos de la ejecución condicional zConocer funcionamiento

28

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

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

Page 29: Tema 03 Seleccion - users.dsic.upv.esusers.dsic.upv.es/~onaindia/TEACHING/FUNDAMENTOS_FI/Tema_3... · 2 Objetivos zEntender los conceptos de la ejecución condicional zConocer funcionamiento

29

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

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.

Page 30: Tema 03 Seleccion - users.dsic.upv.esusers.dsic.upv.es/~onaindia/TEACHING/FUNDAMENTOS_FI/Tema_3... · 2 Objetivos zEntender los conceptos de la ejecución condicional zConocer funcionamiento

30

Ejercicio poner otroMostrar al usuario un menú por pantalla con las opciones:

1. Suma2. Resta3. Producto4. División5. Salir

Solicitar los valores al usuario y realizar la operación elegida.

void main(){int opc, a, b;printf(“1. Suma\n”); printf(“2. Resta\n”); printf(“3. Multiplicación\n”); printf(“4. División\n”); scanf(“%d”,&opc);scanf(“%d%d”, &a,&b);switch(opc)

{case 1: printf(“%d + %d = %d\n”, a, b, a+b); break;case 2: printf(“%d - %d = %d\n”, a, b, a-b); break;case 3: printf(“%d * %d = %d\n”, a, b, a*b); break;case 4:

if (b!=0) printf(“%d / %d = %d\n”, a, b, a/b); break;

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

}

Page 31: Tema 03 Seleccion - users.dsic.upv.esusers.dsic.upv.es/~onaindia/TEACHING/FUNDAMENTOS_FI/Tema_3... · 2 Objetivos zEntender los conceptos de la ejecución condicional zConocer funcionamiento

31

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.

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 if

Page 32: Tema 03 Seleccion - users.dsic.upv.esusers.dsic.upv.es/~onaindia/TEACHING/FUNDAMENTOS_FI/Tema_3... · 2 Objetivos zEntender los conceptos de la ejecución condicional zConocer funcionamiento

32

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);

elseif (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);

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

}

Versión con if anidados

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

Page 33: Tema 03 Seleccion - users.dsic.upv.esusers.dsic.upv.es/~onaindia/TEACHING/FUNDAMENTOS_FI/Tema_3... · 2 Objetivos zEntender los conceptos de la ejecución condicional zConocer funcionamiento

33

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.

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.

Page 34: Tema 03 Seleccion - users.dsic.upv.esusers.dsic.upv.es/~onaindia/TEACHING/FUNDAMENTOS_FI/Tema_3... · 2 Objetivos zEntender los conceptos de la ejecución condicional zConocer funcionamiento

34

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.

Utilizar:

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

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

Page 35: Tema 03 Seleccion - users.dsic.upv.esusers.dsic.upv.es/~onaindia/TEACHING/FUNDAMENTOS_FI/Tema_3... · 2 Objetivos zEntender los conceptos de la ejecución condicional zConocer funcionamiento

35

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

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);

Page 36: Tema 03 Seleccion - users.dsic.upv.esusers.dsic.upv.es/~onaindia/TEACHING/FUNDAMENTOS_FI/Tema_3... · 2 Objetivos zEntender los conceptos de la ejecución condicional zConocer funcionamiento

36

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;

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");}

}