35
Fundamentos de Informática Tema 5 Estructuras de Control 1

Fundamentos de Informática - flanagan.ugr.esflanagan.ugr.es/docencia/2010-2011/fiic/apuntes/FI-IC-Tema5.Estru... · La estructura secuencial Orden secuencial de ejecución: El que

  • Upload
    lamanh

  • View
    226

  • Download
    0

Embed Size (px)

Citation preview

Fundamentos de Informática 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

.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

Sentencia SELECT CASE

14

.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

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?

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)