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
.f90
Estructura condicional IF (<expresión-lógica>) THEN
<bloque>
ELSE
<bloque-else>
ENDIF
7
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
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
.f90
Estructura condicional Simple !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>
9
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
Estructura condicional - anidamiento Anidamiento: se pueden incluir condionales unas dentro
de otras.
10
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
Estructura condicional - anidamiento
11
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
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
12
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
.f90
Estructura multicondicional IF (<expresión-lógica1>) THEN
<bloque1>
ELSEIF (<expresión-lógica2>) THEN
<bloque2>
…
ELSE
<bloque-else>
ENDIF
13
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
.f90
Sentencia SELECT CASE
15
Toda Estructura Mul.Condicional, se puede escribir también: -‐ Con varias condicionales (sin alterna.va) con condiciones compuestas -‐ Con una estructura anidada (condiciones simples)
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
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
.f90
Bucles controlados por contador DO <varcont>=<exprini>,<exprfin> [,<exprinc>]
<Bloque>
END DO
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 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?
28
.f90 .f90
.f90
Bucles controlados por condición
DO WHILE <condición>
<Bloque>
END DO
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.
29
Condición: Inicializar ANTES de Evaluarla Modificar DENTRO del Bucle Valores de las Variables son válidos Después
Bucle Puede no ejecutarse nunca
ES EL BUCLE MAS GENERAL. TODOS OTROS BUCLES SE PUEDEN ESCRIBIR DE ESTA FORMA
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)
33
.f90 .f90
REPITE Acciones HASTA (Condición)
REPITE MIENTRAS (No Condicion) Acciones FINREPITE !! Entrar la primera vez
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)
Bucles controlados por condición: REPITE HASTA (Con Do While)
34
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).
.f90
Bucle DO Implícito ( <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
35
1. PRINT*, "Listado = ", (I, I=1,7,2)
2. PRINT*, (" 3x",I,"=", 3*I, I=1,10)