Fundamentos de Informática Tema 5 Estructuras de Control 1
Contenidos La estructura secuencial La estructura condicional Condicional simple Multicondicional Sentencia SELECT CASE Estructuras de control iterativas Bucles controlados por contador Bucles controlados por condición Bucle DO Implícito 2
Contenidos La estructura secuencial La estructura condicional Condicional Condicional simple Multicondicional Sentencia SELECT CASE Estructuras de control iterativas Bucles controlados por contador Bucles controlados por condición Bucle DO Implícito 3
La estructura secuencial Orden secuencial de ejecución: El que no altera el flujo de control respecto al orden de escritura de las instrucciones. 4 1. PROGRAM ec2grado 2. IMPLICTI NONE 3. REAL:: a, b, c, x1, x2 4. PRINT*,"Dame los coeficientes:" 5. READ*,a,b,c 6. x1=( -b+sqrt(b*b-4*a*c) ) / 2*a 7. x2=( -b-sqrt(b*b-4*a*c) ) / 2*a 8. PRINT*,"Soluciones=",x1," y ",x2 9. END Una tarea es normal tener en cuenta condiciones que decidan sobre el camino que hay que seguir al resolverla. Por ese motivo se utilizan estructuras de control más complejas que la secuencial.
Contenidos La estructura secuencial La estructura condicional Condicional Condicional simple Multicondicional Sentencia SELECT CASE Estructuras de control iterativas Bucles controlados por contador Bucles controlados por condición Bucle DO Implícito 5
La estructura condicional 6
Estructura condicional.f90 IF (<expresión-lógica>) THEN <bloque> ELSE <bloque-else> ENDIF 1. IF (x>4) THEN 2. PRINT*, x, es mayor que 4 3. ELSE 4. PRINT*, x, es menor o igual que 4 5. ENDIF 7
Estructura condicional 1. PROGRAM ec2grado 2. IMPLICIT NONE 3. REAL:: a, b, c, x1, x2 4. PRINT*,"Dame el coeficiente de segundo grado:" 5. READ*,a 6. PRINT*,"Dame el coeficiente de primer grado:" 7. READ*,b 8. PRINT*,"Dame el termino independiente:" 9. READ*,c 10. IF (a.ne.0) THEN 11. x1=( -b+sqrt(b*b-4*a*c) ) / 2*a 12. x2=( -b-sqrt(b*b-4*a*c) ) / 2*a 13. PRINT*,"Soluciones=",x1," y ",x2 14. ELSE 15. x1=-c/b 16. PRINT*,"Solucion=",x1 17. ENDIF 18. END 8
Estructura condicional Simple.f90!LA PARTE ELSE NO ES OBLIGATORIA IF (<expresión-lógica>) THEN <bloque> ENDIF!UNA SÓLA SENTENCIA: IF LÓGICO IF (<expresión-lógica>) <sentencia> 1. IF (Edad > 30) THEN 2. ContMay30 = ContMay30 + 1 3. ENDIF 4. IF (i.ne.0.and. j.ge.9) THEN 5. h=1(2*j+3) 6. k=-h*20 7. ENDIF 8. IF (x.gt.4) y=6 9
Estructura condicional - anidamiento Anidamiento: se pueden incluir condionales unas dentro de otras. 1. IF (x>4) THEN 2. PRINT*, x, es mayor que 4 3. ELSE 4. IF (x<4) THEN 5. PRINT*, x, es menor que 4 6. ELSE 7. PRINT*, x, es igual a 4 8. ENDIF 9. ENDIF 10
Estructura condicional - anidamiento 1. IF (condic_1) THEN 2. inst_1 3. IF (condic_2) THEN 4. inst_2 5. ELSE 6. inst_3 7. ENDIF 8. inst_4 9. ELSE 10. inst_5 11. ENDIF 12. inst_6 condic_1 condic_2 inst_1.true. indistinto inst_2.true..true. inst_3.true..false. inst_4.true. indistinto inst_5.false. indistinto inst_6 indistinto indistinto 11
Estructura condicional - anidamiento 1. IF (nota<5) THEN 2. PRINT*, Suspenso 3. ELSE 4. IF (nota<8)then 5. PRINT*, Aprobado 6. ELSE 7. IF (nota<9) THEN 8. PRINT*, Notable 9. ELSE 10. PRINT*, Matricula 11. ENDIF 12. ENDIF 13. ENDIF 1. IF (nota<5) THEN 2. PRINT*, Suspenso 3. ELSE IF (nota<8) THEN 4. PRINT*, Aprobado 5. ELSE IF (nota<9) THEN 6. PRINT*, Notable 7. ELSE 8. PRINT*, Matricula 9. ENDIF 10. ENDIF 11. ENDIF 12
Estructura multicondicional.f90 IF (<expresión-lógica1>) THEN <bloque1> ELSEIF (<expresión-lógica2>) THEN <bloque2> ELSE <bloque-else> ENDIF 1. IF (x>4) THEN 2. PRINT*, x, es mayor que 4 3. ELSEIF (x<4) THEN 4. PRINT*, x, es menor que 4 5. ELSE 6. PRINT*, x, es igual a 4 7. ENDIF 1. IF (nota<5) THEN 2. PRINT*, Suspenso 3. ELSEIF (nota<8) 4. PRINT*, Aprobado 5. ELSEIF (nota<9) 6. PRINT*, Notable 7. ELSE 8. PRINT*, Matricula 9. ENDIF 13
Sentencia SELECT CASE 14
Sentencia SELECT CASE.f90 SELECT CASE (<expresion>)!expresión tipo ordinal: Lógico, Entero, Carácter!Selector: Un valor:(3) ; Varios :(2,4,6); rango de valores: (3:7), (:5), (5:) CASE (<selector1>) <bloque1> CASE (<selector1>) <bloque1> CASE DEFAULT!! Es opcional, como el ELSE <bloque-def> END SELECT Toda Estructura Mul.Condicional, se puede escribir también: - Con varias condicionales (sin alterna.va) con condiciones compuestas - Con una estructura anidada (condiciones simples) 15
Sentencia SELECT CASE 1. PROGRAM Multicondicional 2. IMPLICIT NONE 3. INTEGER :: x 4. PRINT*, "Dime un número" 5. READ*, x 6. SELECT CASE (x) 7. CASE (1) 8. PRINT*, "x vale 1" 9. CASE (2,3,4) 10. PRINT*, "x vale 2, 3 ó 4" 11. CASE (5:10) 12. PRINT*, "x esta entre 5 y 10" 13. CASE (11:) 14. PRINT*, "x es mayor o igual que 11" 15. CASE DEFAULT 16. PRINT*, "x es menor que 1" 17. END SELECT 18. END 16
Sentencia SELECT CASE 1. PROGRAM Menu 2. IMPLICIT NONE 3. INTEGER :: op 4.! Mostrar menu en pantalla 5. PRINT*, "1 - Listado de alumnos" 6. PRINT*, "2 - Buscar un alumno" 7. PRINT*, "3 - Añadir un alumno" 8. PRINT*, "4 - Borrar un alumno" 9. PRINT*, "5 - Finalizar" 10.! Leer opcion y ejecutar 11. PRINT*, " Que opción quieres ejecutar?" 12. READ*, op 13. SELECT CASE (op) 14. CASE (1) 15. PRINT*, "Has seleccionado listar a los alumnos" 16. CASE (2) 17. PRINT*, "Has seleccionado buscar a un alumno" 18. CASE (3) 19. PRINT*, "Añadirás a alguno" 20. CASE (4) 21. PRINT*, "Cuidado con quien borras" 22. CASE (5) 23. PRINT*, "Hasta la próxima" 24. CASE DEFAULT 25. PRINT*, "Te has equivocado" 26. END SELECT 27. END 17
Ejemplo ecuación segundo grado 1. PROGRAM ec2grado 2. IMPLICTI NONE 3. REAL:: a, b, c, x1, x2, raiz 4. PRINT*,"Dame los coeficientes:" 5. READ*,a,b,c 6. raiz=b**2-4*a*c 7. IF (a==0) THEN 8. IF (b/=0) THEN 9. x1=-c/b 10. PRINT*, "Ecuacion grado 1 con solucion=",x1 11. ELSE 12. PRINT*, "Ecuacion sin sentido",c, "=0" 13. ENDIF 14. ELSE 15. IF (raiz<0) THEN 16. PRINT*, "Ecuacion sin soluciones reales 17. ELSE 18. x1=( -b+sqrt(raiz) ) / 2*a 19. x2=( -b-sqrt(raiz) ) / 2*a 20. PRINT*,"Soluciones=",x1," y ",x2 21. ENDIF 22. ENDIF 23. END 18
Contenidos La estructura secuencial La estructura condicional Condicional Condicional simple Multicondicional Sentencia SELECT CASE Estructuras de control iterativas Bucles controlados por contador Bucles controlados por condición Bucle DO Implícito 19
Estructuras de control iterativas 1. PROGRAM Media! Cálculo de la media de 5 valores 2. IMPLICIT NONE 3.! Declaración de variables 4. REAL :: v, tot, med 5. tot = 0 6.! Leemos 5 datos por teclado y los vamos acumulando 7. PRINT*, "Dame 5 números reales" 8. READ*, v 9. tot = tot + v 10. READ*, v 11. tot = tot + v 12. READ*, v 13. tot = tot + v 14. READ*, v 15. tot = tot + v 16. READ*, v 17. tot = tot + v 18.! Calculamos e imprimimos la media 19. med = tot / 5.0 20. PRINT*, "La media es ",med 21. END 20
Estructuras de control iterativas 1. PROGRAM Media2 2. IMPLICIT NONE 3.! Cálculo de la media de 5 valores 4.! Declaración de variables 5. REAL :: v, tot, med 6. tot = 0 7.! Leemos 5 datos por teclado y los vamos acumulando 8. PRINT*, "Dame 5 números reales" 9. REPITE 5 VECES: 10. READ*, v 11. tot = tot + v 12. FIN-REPETIR 13.! Calculamos e imprimimos la media de los 5 datos 14. med = tot / 5.0 15. PRINT*, "La media es ",med 16. END 21
Estructuras de control iterativas 1. PROGRAM Media3 2. IMPLICIT NONE 3.! Cálculo de la media de N valores leidos por teclado 4.! Declaración de variables 5. REAL :: v, tot, med 6. INTEGER :: N 7. PRINT*, "Dime cuántos números vamos a procesar" 8. READ*, N 9. tot = 0 10.! Leemos N datos por teclado y los vamos acumulando en tot 11. PRINT*, "Dame ",N," números reales" 12. REPITE N VECES: 13. READ*, v 14. tot = tot + v 15. FIN-REPETIR 16.! Calculamos e imprimimos la media de los N datos 17. med = tot / N 18. PRINT*, "La media es ",med 19. END 22
Bucles controlados por contador DO <varcont>=<exprini>,<exprfin> [,<exprinc>].f90 END DO <Bloque> donde: <varcont> es una variable de tipo entero <exprini> es una expresión (de tipo entero) que indica el primer valor de la variable <varcont> <exprfin> es una expresión (de tipo entero) que indica el último valor que ha de tomar <varcont> <exprinc> es una expresión (de tipo entero) que indica el incremento de la variable <varcont> en cada iteración del bucle. Expresión opcional, cuando se omite se asume que vale 1. Obviamente, no puede tomar el valor 0 en ningún caso. <Bloque> es el ámbito del bucle (el bloque de instrucciones que se ejecuta en cada iteración). 23
Bucles controlados por contador 24
Bucles controlados por contador 1. PROGRAM QueSalida 2. IMPLICIT NONE 3.! Declaración de variables 4. INTEGER :: N, i, k 5. N = 0 6. DO i=1,2,1 7. DO k=5,1,-2 8. N = N + i + k 9. END DO 10. END DO 11. PRINT*, "N vale ",N 12. END 25
Bucles controlados por contador 1. PROGRAM Iteraciones 2. IMPLICIT NONE 3. INTEGER :: c1,c2,c3,c4 4. DO c1=30, 1, -2! Bucle 1 5. PRINT*,c1 6. ENDDO 7. DO c2=30, 1, 2! Bucle 2 8. PRINT*,c2 9. ENDDO 10. DO c3=1, 30! Bucle 3 11. PRINT*,c3 12. ENDDO 13. DO c4=30, 1! Bucle 4 14. PRINT*,c4 15. ENDDO 16. PRINT*,"c1=",c1,"c2=",c2,"c3=",c3,"c4=",c4 17. END 26
Bucles controlados por contador 1. PROGRAM Test 2. IMPLICIT NONE 3. INTEGER :: a,c 4. c=5 5. DO a=1,c 6. c=c-1 7. PRINT*,a,"",c 8. ENDDO 9.!! Aunque C se modifique dentro, se 10.!! hacen todas las iteraciones 11.!! A no se puede modificar en el Bucle 12. END 27
Bucles controlados por condición Y si, en lugar de ejecutar el bloque un número predefinido de veces, controlamos su ejecución en relación con una determinada condición?.f90.f90 28
Bucles controlados por condición.f90 DO WHILE <condición> END DO <Bloque> donde: <condición> es la condición (expresión lógica) que se comprueba en cada iteración. <Bloque> es el bloque de instrucciones que se ejecuta en cada iteración. ES EL BUCLE MAS GENERAL. TODOS OTROS BUCLES SE PUEDEN ESCRIBIR DE ESTA FORMA Condición: Inicializar ANTES de Evaluarla Modificar DENTRO del Bucle Valores de las Variables son válidos Después Bucle Puede no ejecutarse nunca 29
Bucles controlados por condición 1. PROGRAM Divisores 2. IMPLICIT NONE 3.! Calcular los divisores de un número 4.! Declaración de variables 5. INTEGER :: c,n 6.! Leer número por teclado 7. PRINT*, "Dime un número" 8. READ*, n 9.! Calcular divisores e ir escribiéndolos en pantalla 10. PRINT*, "Los divisores son:" 11. c = n 12. DO WHILE (c>0) 13. IF (MOD(n,c).EQ.0) PRINT*, c 14. c = c - 1 15. ENDDO 16. END 30
Bucles controlados por condición 1. PROGRAM Factorial_1 2. IMPLICIT NONE 3.! Cálculo del factorial de un número 4.! Declaración de variables 5. INTEGER :: f,n,c 6.! Leer el número 7. PRINT*, "Dime un número«8. READ*, n 9.! Calcular el factorial 10. f = 1 11. c = 1 12. DO WHILE (c<n) 13. c = c + 1 14. f = f * c 15. ENDDO 16.! Escribir resultado 17. PRINT*, "El factorial es ",f 18. END 31
Bucles controlados por condición 1. PROGRAM Factorial_2 2. IMPLICIT NONE 3.! Cálculo del factorial de un número 4.! Declaración de variables 5. INTEGER :: f,n,c 6.! Leer el número 7. PRINT*, "Dime un número" 8. READ*, n 9.! Calcular el factorial 10. f = 1 11. DO c=1,n 12. f = f * c 13. ENDDO 14.! Escribir resultado 15. PRINT*, "El factorial es ",f 16. END 32
Bucles controlados por condición: REPITE HASTA (Con Do While) El bucle REPITE HASTA no existe en Fortran, pero se puede implementar. Se ejecuta siempre una vez al menos. La condición se evalúa después (POSTEST).f90.f90 REPITE Acciones HASTA (Condición) REPITE MIENTRAS (No Condicion) Acciones FINREPITE!! Entrar la primera vez 33
Bucles controlados por condición: REPITE HASTA (Con Do While) 1. REAL:: Nota = 11 2. CHARACTER (25):: Alum 3. DO WHILE (Nota < 0.or. Nota > 10) 4. PRINT*, Introduce alumno y nota 5. READ*, Alum, Nota 6. ENDDO 7. PRINT*, La nota de `, Alum, es, Nota Inicializar la condición para que la primera vez se entre en el bucle (antes del bucle). 34
Bucle DO Implícito.f90 ( <lista_expr>, <var>=<ini>,<fin>,<inc> ) donde: <lista_expr> es una lista de expresiones separadas por comas <var> es una variable que se utiliza como contador <ini>es una expresión (de tipo entero), primer valor de la variable <var> <fin> es una expresión (de tipo entero), último valor que ha de tomar <var> <inc> es una expresión (de tipo entero), incremento de la variable <var> en cada iteración del bucle. SE USA SOLO CON READ O PRINT 1. PRINT*, "Listado = ", (I, I=1,7,2) 2. PRINT*, (" 3x",I,"=", 3*I, I=1,10) 35