[ anterior ] [ Contenidos ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ siguiente ]


Lecciones de Fortran 90 para la asignatura Química Computacional
Capítulo 5 - Estructuras de control


5.1 Objetivos

Los objetivos de esta clase son los siguientes:

  1. presentar las diferentes estructuras de control condicionales en Fortran (branching).

  1. presentar las diferentes formas de ejecutar bucles en programas Fortran (loops).

Estas estructuras de control son básicas para dominar el flujo de un programa, permitiendo que la ejecución del programa pueda depender de los datos implicados o de la decisiones del usuario que lo corra.

Es importante tener en cuenta que para cualquier proyecto medianamente complejo es preciso tener una idea clara del problema, de los inputs y outputs del mismo y del algoritmo que se utilizará, así como de la estructura del programa que se llevará a cabo como un diagrama de flujo o como pseudocódigo antes de comenzar a escribir el código Fortran.

Los problemas complejos deben dividirse en tareas más simples, y si es necesario estas se subdividirán en otras tareas aún más simples (top-down design) y cada una de estas tareas debe codificarse y comprobarse de forma independiente.


5.2 Puntos destacables.

Daremos de forma esquemática el formato que tienen las estructuras de control. En primer lugar las condicionales y en segundo lugar los bucles.


5.3 Programas usados como ejemplo.


5.3.1 Programa ejemplo_5_1.f90

     PROGRAM EJEMPLO_5_1
       !
       IMPLICIT NONE
       !
       REAL :: NOTA
       CHARACTER (3), DIMENSION(1:5) :: NT, LISTNT=(/'S','A','N','Sob','MH'/)
       INTEGER :: IN
       ! READ NOTE
       PRINT *, "Nota del estudiante?"
       READ 50, Nota
     50 FORMAT(F4.1)
       !
       IF (Nota>=0.0.AND.Nota<5.0) THEN 
          IN=1
       ELSE IF (Nota>=5.0.AND.Nota<7.0) THEN 
          IN=2
       ELSE IF (Nota>=7.0.AND.Nota<9.0) THEN 
          IN=3
       ELSE IF (Nota>=9.0.AND.Nota<10.0) THEN 
          IN=4
       ELSE IF (Nota==10.0) THEN 
          IN=5
       ELSE
          IN=0
       ENDIF
     !
       IF (IN==0) THEN
          PRINT *, "LA NOTA : ", Nota," NO ES UNA NOTA ACEPTABLE."
       ELSE
          PRINT 100,  Nota, LISTNT(IN)
       ENDIF
     !
       100 FORMAT(1X,'LA NOTA DEL ALUMNO ES ',F4.1,' (',A3,')')
     !
     END PROGRAM EJEMPLO_5_1

5.3.2 Programa ejemplo_5_2.f90

     PROGRAM EJEMPLO_5_2
       IMPLICIT NONE
       REAL :: Nota
       INTEGER :: IN, Inota
       CHARACTER (3), DIMENSION(1:5) :: LISTNT=(/'S','A','N','Sob','MH'/)
       ! READ NOTE
       PRINT *, "Nota del estudiante?"
       READ(*,*), Nota
       !
       Inota = NINT(Nota)
       !
       SELECT CASE (Inota)
       CASE (0:4) 
          IN = 1
       CASE (5,6) 
          IN = 2
       CASE (7,8) 
          IN = 3
       CASE (9) 
          IN = 4   
       CASE (10) 
          IN = 5
       CASE DEFAULT 
          IN = 0
       END SELECT
       !
       IF (IN==0) THEN
          PRINT *, "LA NOTA : ", Nota," NO ES UNA NOTA ACEPTABLE."
       ELSE
          PRINT 100,  Nota, LISTNT(IN)
       ENDIF
       !
     100 FORMAT(1X,'LA NOTA DEL ALUMNO ES ',F4.1,' (',A3,')')
       !
     END PROGRAM EJEMPLO_5_2

5.3.3 Programa ejemplo_5_3.f90

     PROGRAM EJEMPLO_5_3
     !
       IMPLICIT NONE
     !
       REAL :: Pio2 = ASIN(1.0)
       REAL :: Angle1 = 0.0, Angle2 = 0.0
       INTEGER :: index
     !
       DO index = 0, 16, 2
          Angle1 = index*Pio2/4.0
     !
          WRITE(*,*)
          WRITE(*,*) 'Cos(',index/2,'Pi/4) = ',COS(Angle1),'; Cos(',index/2,'Pi/4) = ',COS(Angle2)
          WRITE(*,*) 'Sin(',index/2,'Pi/4) = ',SIN(Angle1),'; Sin(',index/2,'Pi/4) = ',SIN(Angle2)
          WRITE(*,*) 
     !
          Angle2 = Angle2 + Pio2/2.0
     !
       ENDDO
     END PROGRAM ejemplo_5_3

5.3.4 Programa ejemplo_5_4.f90

     PROGRAM ejemplo_5_4
     !
       IMPLICIT NONE
     !
       REAL :: X_val = 0.0
       REAL :: X_app = 0.0, X_sum = 0.0
       INTEGER :: I_flag = 1, I_count = 0
     !
     ! APROXIMACIONES SUCESIVAS A SIN(X) = X - X^3/3! + X^5/5! - X^7/7! + ... 
       WRITE(*,*) "INTRODUZCA EL VALOR DEL ANGULO X (RAD) :"
       READ(*,*) X_val
     !
       I_count = 1
       X_app = X_val
       X_sum = X_val
     !
       WRITE(*,*) '         ORDEN     APROX    SIN(X)       APPROX-SIN(X)'
       DO WHILE (I_flag == 1) 
          WRITE(*,*) I_count, X_app, SIN(X_val), X_app - SIN(X_val)
     !
          X_sum = X_sum*(-1)*X_val*X_val/((I_count*2+1)*(I_count*2))
          X_app = X_app + X_sum
     !
          I_count = I_count + 1
     !
          WRITE(*,*) "STOP? (0 SI, 1 NO)"
          READ(*,*) I_flag
          IF (I_flag /= 1 .AND. I_flag /= 0) I_flag = 1
     !
       ENDDO
     END PROGRAM ejemplo_5_4

5.3.5 Programa ejemplo_5_5.f90

     PROGRAM ej_5_5
       !
       IMPLICIT NONE
       REAL , DIMENSION(:), ALLOCATABLE :: X_vec, Y_vec
       INTEGER :: Index, Ierr, Numpoints = 0
       REAL :: Max_x, Min_y
       CHARACTER(LEN=64) :: Filename
       !
       ! READ FILENAME
       READ(5,*) Filename
       ! OPEN FILE
       OPEN( UNIT=10, FILE=Filename, STATUS='OLD', ACTION='READ' )
       !
       DO
          READ(UNIT=10, FMT=100, ERR=10) Numpoints
          IF (Numpoints /= 0) EXIT
     10   READ (UNIT=10, FMT=*) ! JUMP ONE LINE
          CYCLE
       ENDDO
       !
       PRINT*, 'NUMPOINTS = ', Numpoints
       !
       ! ALLOCATE X, Y VECTORS
       ALLOCATE(X_vec(1:NUMPOINTS), STAT = IERR)
       IF (Ierr /= 0) STOP 'X_vec MEM ALLOCATION FAILED'
       ALLOCATE(Y_vec(1:NUMPOINTS), STAT = IERR)
       IF (Ierr /= 0) STOP 'Y_vec MEM ALLOCATION FAILED'
       !
       DO I = 1, Numpoints
          !
          READ(UNIT=10, FMT=110) X_vec(I), Y_vec(I)
          !
       ENDDO
       !
       Max_x = MAXVAL(X_vec)
       Min_y = MINVAL(Y_vec)
       !
       PRINT*, "MAXIMUM X VALUE = ", Max_x
       PRINT*, "MINIMUM Y VALUE = ", Min_y
       ! DEALLOCATE AND CLOSE FILE
       DEALLOCATE(X_vec, STAT = IERR)
       IF (Ierr /= 0) STOP 'X_vec MEM DEALLOCATION FAILED'
       DEALLOCATE(Y_vec, STAT = IERR)
       IF (Ierr /= 0) STOP 'Y_vec MEM DEALLOCATION FAILED'
       !
       CLOSE(10)
       ! FORMAT STATEMENTS
     100 FORMAT(19X,I3)
     110 FORMAT(F6.3,1X,F6.3)
       !
     END PROGRAM ej_5_5
     !# Remark 1
     !# Remark 2
     !Useless line 1
     !Useless line 2
     !Number of points = 4
     !+1.300;-2.443
     !+1.265;-1.453
     !+1.345;-8.437
     !+1.566;+4.455

[ anterior ] [ Contenidos ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ siguiente ]


Lecciones de Fortran 90 para la asignatura Química Computacional

$Id: clases_fortran.sgml,v 1.24 2013/07/02 09:38:58 curro Exp curro $

Curro Pérez Bernal mailto:francisco.perez@dfaie.uhu.es