Está en la página 1de 17

UNIVERSIDAD NACIONAL DEL CALLAO

FACULTAD DE CIENCIAS NATURALES Y MATEMÁTICA


ESCUELA PROFESIONAL DE FÍSICA

CAPITULO 8. TABLAS Y VECTORES


EN FORTRAN
MAYO 2020

LENGUAJE DE PROGRAMACIÓN
CIENTIFICO FORTRAN
Profesor Dr. Juan Méndez
Docente Principal
jamendezv@unac.edu.pe

ELABORADO POR Dr. JUAN MENDEZ


Capitulo 8. Tablas y vectores en Fortran
Hay casos en los que necesitamos almacenar diferentes valores para la misma variable. Estas
variables se conocen como variables compuestas o simplemente tablas. Las variables
compuestas más conocidas son: (i) Vectores (tabla de rango 1) y (ii) Matrices (tabla de rango
2). Un vector puede ser considerado una matriz bajo ciertas condiciones, en cuyo caso se
llama matriz de columna o matriz de filas.
1. PARAMETROS PARA EVALUAR UNA TABLA
Son los siguientes:
o Rango (R).- Es el número de dimensiones. Ejemplo: (i) un escalar posee rango cero (R=0),
(ii) un vector tiene rango uno (R=1), (ii) una matriz posee rango dos (R=2), etc.
o Extensión.- Es el número total de componentes que posee en cada una de sus
dimensiones. Ejemplo: (i) una matriz de 5 filas y 3 columnas, la extensión de su
dimensión primera (filas) es 5 y la de su dimensión segunda (columnas) es 3.
o Tamaño.- Es el total de elementos que tiene, es decir, el producto de sus extensiones.
Ejemplo: la matriz de 5 filas x 3 columnas el tamaño es 15.
o Perfil.- Es un vector formado por los valores de la extensión de la tabla. Ejemplo: P =
[5,3].

ELABORADO POR Dr. JUAN MENDEZ


Capitulo 8. Tablas y vectores en Fortran
2. DECLARACIÓN DE TABLAS
Puede ser:
o Declaración estática.- Se declaran las dimensiones de la tabla ya durante la compilación.
Esto significa que el recuento de la memoria necesaria para almacenar los elementos de
la tabla tiene lugar durante la compilación, que dicha memoria se reserva cuando se
carga el programa en memoria y que el tamaño de la tabla, y por tanto la cantidad de
memoria que usa, se mantiene constante durante la ejecución del programa.
o Declaración dinámica.- Permite indicar que se va a utilizar una tabla, pero sin
especificar el numero y extensión de sus dimensiones hasta el momento en que se
necesite, durante la ejecución del programa.

ELABORADO POR Dr. JUAN MENDEZ


Capitulo 8. Tablas y vectores en Fortran
3. DECLARACIÓN DE TABLAS ESTÁTICAS
La sintaxis de la sentencia es:

tipo DIMENSION (dimensiones) :: lista de tablas


tipo DIMENSION :: lista de tablas (dimensiones)
tipo :: lista de tablas (dimensiones)

Ejemplo 1.- Un vector


INTEGER, DIMENSION(100) :: N
INTEGER, DIMENSION :: N(100)
INTEGER :: N(100)

Ejemplo 2.- Una matriz


REAL*4, DIMENSION(20,30) :: R
REAL*4, DIMENSION :: R(20,30)
REAL*4, :: R(20,30)

ELABORADO POR Dr. JUAN MENDEZ


Capitulo 8. Tablas y vectores en Fortran
4. DECLARACIÓN DE TABLAS DINÁMICAS
La sintaxis de la sentencia es:

tipo, ALLOCATABLE :: VECTOR(:)


tipo, ALLOCATABLE :: MATRIZ(:,:)
PRINT*,’INGRESAR LA DIMENSION DEL VECTOR’
READ*, N1
ALLOCATABLE(VECTOR(N1))
PRINT*,’INGRESAR LA DIMENSION DE LA MATRIZ, FILAS Y COLUMNAS’
READ*, N2,M2
ALLOCATABLE(MATRIZ(N2,M2))



DEALLOCATABLE(VECTOR,MATRIZ)

ELABORADO POR Dr. JUAN MENDEZ


Capitulo 8. Tablas y vectores en Fortran
Ejemplo 3.- Arreglo dinámico para un vector
REAL, ALLOCATABLE :: VECTOR(:)
PRINT*,’INGRESAR LA DIMENSION DEL VECTOR’
READ*, N1
ALLOCATABLE(VECTOR(N1))
Ejemplo 4.- Arreglo dinámico para una matriz
PROGRAM ARREGLO_DINAMICO
IMPLICIT NONE
REAL, DIMENSION(:,:), ALLOCATABLE:: A
INTEGER:: DIM1, DIM2
INTEGER:: I,J
PRINT*, “INGRESAR LAS DIMENSIONES DIM1 Y DIM2:“
READ*, DIM1, DIM2
! AHORA QUE EL TAMAÑO ES CONOCIDO, INMEDIANTAMENTE SE ALOJA EN LA MEMORIA
ALLOCATE ( A(DIM1,DIM2) )
DO I = 1, DIM2
DO J = 1, DIM1
A(J,I) = I*J
PRINT *, “A(“,J,”,”,I,”) = “, A(J,I)
END DO
END DO
DEALLOCATE (A)
END PROGRAM ARREGLO_DINAMICO

ELABORADO POR Dr. JUAN MENDEZ


5. COMO SE ALMACENAN LAS TABLAS EN LA MEMORIA
Las tablas se almacenan en direcciones consecutivas de memoria. En caso de tablas de
una sola dimensión se almacena consecutivamente. En caso de las matrices se
almacenan en memoria siguiendo las columnas.
Ejemplo 5. Almacenamiento en memoria de un vector
REAL, DIMENSION(7) ::A
REAL, DIMENSION ::A(7)
REAL ::A(7)
A(1) A(2) A(3) A(4) A(5) A(6) A(7)

Ejemplo 6. Almacenamiento en memoria de una matriz


REAL, DIMENSION(4,3) ::A
REAL, DIMENSION ::A(4,3)
REAL ::A(4,3)

A(1,1 A(1,2) A(1,3)


)
A(2,2) A(2,3)
A(2,1)
A(3,2) A(3,3)
A(3,1)
A(4,2) A(4,3)
ELABORADO POR Dr. JUAN MENDEZ A(4,1)
6. ASIGNACION DE VALORES A LOS ELEMENTOS Ejemplo 10. Asignar valores a un vector
DE LA TABLA REAL*4 :: V(10)
A continuación mostramos algunos ejemplos: V=(/0.,(LOG(REAL(I)),I=1,9) /)
Ejemplo 7. Asignar valores a un vector Ejemplo 11. Asignar valores a una matriz
REAL*4 :: V(5),W(5) REAL*4 :: A(10,10)
V=(/ 1.,2.,3.,4.,5. /) A=0.0
X=1.1 Ejemplo 12. Asignar valores a un vector
W=(/ 0.,x,x-1,0.,-1. /) INTEGER :: NVECES(10)
REAL*4 :: V(10)
Ejemplo 8. Asignar valores a un vector PI=3.141593
REAL*4 :: V(5),W(3) H=PI/9.
W=(/ 1.2,3.1,-1.2 /) NVECES=(/ (I,I=2,20,2) /)
V=(/ 0., W ,0. /) V=(/ (cos((I-1)*h),I=1,10) /)
Ejemplo 9. Asignar valores a un vector Ejemplo 13. Asignar valores a una matriz
INTEGER :: NVECES(5) REAL*4 :: A(10,10)
NVECES=(/ (I,I=1,5) /) DO J=1,10
INTEGER, DIMENSION (5) :: v1 = (/ 1, 2, 3, 4, 5/) DO I=1,10
A(I,J)=REAL(I+J)
END DO
ELABORADO POR Dr. JUAN MENDEZ
END DO
Ejemplo 14. Sea la declaración siguiente:  Ejemplo 15. Asignar valores a una matriz
REAL, DIMENSION (-1:1,3) :: X
Elementos válidos de X son: INTEGER, DIMENSION (3,4) :: MAT1,MAT2
X(-1,1) X(-1,2) X(-1,3) MAT1 = RESHAPE ( (/ 1, 2, 3, 4, 5, 6/),(/3,4/),(/0/),(/2,1/))
X( 0,1) X( 0,2) X( 0,3)
X( 1,1) X( 1,2) X( 1,3)
MAT2 = RESHAPE ( (/ 1, 2, 3, 4, 5, 6/),(/3,4/),(/0/),(/1,2/))
7. ASIGNACION DE VALORES A LOS ELEMENTOS
DE UNA MATRIZ USANDO RESHAPE

RESHAPE (fuente, perfil, relleno, orden)

Notas:
o Fuente es un vector de constantes con los
valores de los elementos de la matriz.
o Perfil es un vector de constantes con el
perfil deseado y la orden de la matriz es
por columnas.
ELABORADO POR Dr. JUAN MENDEZ
8. ASIGNACION DE VALORES A LOS ELEMENTOS END DO
END DO
DE UNA TABLA USANDO LA SENTENCIA DE
! LECTURA POR FILAS
LECTURA DO I=1,TMC
Se puede asignar valores a las tablas usando DO J=1,TMF
las sentencias DO y READ. WRITE (*,*) ‘DAME ELEMENTO’,I,J,’DE MAT1’
READ (*,*) MAT1(I,J) !LECTURA DE COLUMNAS
END DO
Ejemplo 16. Asignación usando DO y READ END DO
INTEGER :: I,J
INTEGER, PARAMETER :: TM=5,TMF=2,TMC=3 También se puede leer un tabla usando bucles
INTEGER, DIMENSION (TM) :: V1,V2
DO implícitos. La sintaxis general de lectura
INTEGER, DIMENSION (TMF,TMC) :: MAT1
… con un bucle implícito es:
DO I=1,TM
PRINT*, ‘DAME ELEMENTO’, I,‘DE V1 Y V2’ READ (*,*) (arg1[, arg2] …, índice = inicio, fin [, paso])
READ*, V1(I),V2(I)
END DO Ejemplos 17. Asignación implícita
! LECTURA POR COLUMNAS INTEGER, DIMENSION (5) :: W
DO I=1,TMF INTEGER, DIMENSION (0:3,2) :: M
DO J=1,TMC …
PRINT*, ‘DAME ELEMENTO’,I,J,’DE MAT1’ READ (*,*) ( w(i), i=5,1,-1)
READ*, MAT1(I,J) READ (*,*) ( (m(i,j), i=0,3) , j=1,2) !lectura por columnas
READ (*,*) ( (m(i,j), j=1,2) , i=0,3) !lectura por filas
ELABORADO POR Dr. JUAN MENDEZ
También es posible leer un tabla escribiendo Ejemplo 19. Asignación usando DO y READ
únicamente su nombre, sin especificar su(s) INTEGER, DIMENSION (5) :: V1 =(/ 9,8,7,6,5 /)
INTEGER, DIMENSION (20:24) :: V2 =(/ -9,-8,-7,-6,-5 /)
índice(s). En ese caso, el compilador asume
INTEGER, DIMENSION (50:54) :: V3,V4
que se va a leer todo el tabla, es decir, todos V3=V1+V2
sus elementos en el orden natural Fortran. V4=V1*V2
PRINT*,‘V3, DOS VECES EXPONENCIAL DE V3’, V3,
2*EXP(REAL(V3))
Ejemplo 18. Asignación natural de una tabla PRINT*, ‘V4, VALOR ABSOLUTO DE V4’, V4, ABS(V4)
INTEGER, DIMENSION (10) :: V La salida será:
INTEGER, DIMENSION (2,3) :: MAT V3 = [0,0,0,0,0] 2*EXP(REAL(V3)) = [2,2,2,2,2]
READ*, V V4 = [-81,-64,-49,-36,-25] ABS(V4) = [81,64,49,36,25]
READ*, MAT Otra forma de codificar lo anterior, usando los bucles DO
iterativos.
9. OPERACIONES CON TABLAS Ejemplo 20. Usando bucles DO
Para poder realizar operaciones con tablas INTEGER :: I
INTEGER, DIMENSION (5) :: V1 =(/ 9,8,7,6,5 /),&
en Fortran se debe verificar que tengan el V2 =(/ -9,-8,-7,-6,-5 /),V3,V4
mismo perfil. Además, un escalar puede DO I=1,5
operarse con cualquier tabla. V3(I)=V1(I)+V2(I)
V4(I)=V1(I)*V2(I)
PRINT*, V3(I), 2*EXP(REAL(V3(I)))
ELABORADO POR Dr. JUAN MENDEZ
PRINT*, V4(I), ABS(V4(I))
END DO
10. CONSTRUCCION WHERE Ejemplo 21. Calcular la raíz cuadrada de los
Es una estructura de decisión para los datos elementos positivos de una tabla.
tipo tabla es muy similar Al bloque IF THEN REAL, DIMENSION (5,4) :: MATI,MATF

para escalares. La sintaxis general es:
WHERE (MATI>0)
MATF=SQRT(MATI)
[nombre:] WHERE (ER/L1) ELSEWHERE
SS1 MATF=0
END WHERE
ELSEWHERE (ER/L2)
SS2 11. SENTENCIA WHERE
ELSEWHERE (ER/L3) La estructura general es
SS3
…. WHERE (ER/L) SS
ELSEWHERE
SSN
END WHERE [nombre]

ELABORADO POR Dr. JUAN MENDEZ


LABORATORIO N° 8

1. Hacer un programa para evaluar la media de 5. Hacer un programa para leer una matriz de 2
cinco números ingresados por teclado filas y 3 columnas por teclado y mostrarla por
usando escalares para almacenar los pantalla.
números ingresados.
2. Hacer un programa para evaluar la media de
cinco números ingresados por teclado
usando vectores para almacenar los
números ingresados.
3. Hacer un programa para buscar un número
en un vector de seis componentes
desordenado. Introduce el vector en la
propia sentencia de declaración de tipo.
4. Hacer un programa para ordenar
ascendentemente las seis componentes de
un vector. Usar el método de la burbuja.

ELABORADO POR Dr. JUAN MENDEZ


SOLUCION PROBLEMA 1 SOLUCION PROBLEMA 2
PROGRAM CAP8_1 PROGRAM CAP8_2
IMPLICIT NONE IMPLICIT NONE
INTEGER :: I INTEGER :: I
REAL :: MEDIA=0 REAL :: V, MEDIA
REAL,DIMENSION (5) :: V MEDIA=0
DO I=1,5 DO I=1,5
PRINT*, ‘INGRESE EL COMPONENTE',I PRINT*, ‘INGRESE EL COMPONENTE',I
READ*, V(i) READ*, V
END DO MEDIA=MEDIA+V
DO I=1,5 END DO
MEDIA=MEDIA+V(I) MEDIA=MEDIA/5
END DO PRINT*,'LA MEDIA ES:',MEDIA
MEDIA=MEDIA/5 END PROGRAM CAP8_2
PRINT*,'LA MEDIA ES:',MEDIA
END PROGRAM CAP8_1

ELABORADO POR Dr. JUAN MENDEZ


SOLUCION PROBLEMA 3 SOLUCION PROBLEMA 4
PROGRAM CAP8_3 PROGRAM CAP8_4
INTEGER :: X,INTERRUPTOR=0,I INTEGER::AUX,I,J
INTEGER, DIMENSION(6):: V=(/17,3,22,11,33,19/) INTEGER, PARAMETER ::NC=6
PRINT*,‘INGRESE UN NUMERO' INTEGER, DIMENSION(NC) :: VEC
READ*, X VEC=(/8,5,15,2,-19,0/)
DO I=1,6 CANTIDAD_PAREJAS:DO I=NC-1,1,-1
IF (X == V(I)) THEN PAREJA:DO J=1,I
PRINT*,'ENCONTRADO EN POSICION',I ORDENAR_PAREJA:IF (VEC(J)>VEC(J+1)) THEN
INTERRUPTOR=1 AUX=VEC(J)
END IF VEC(J)=VEC(J+1)
END DO VEC(J+1)=AUX
IF (INTERRUPTOR == 0) THEN END IF ORDENAR_PAREJA
PRINT*, 'NO SE HA ENCONTRADO EL NUMERO' END DO PAREJA
END IF END DO CANTIDAD_PAREJAS
END PROGRAM CAP8_3 WRITE(*,*) 'EL VECTOR ORDENADO ES'
WRITE(*,*) (VEC(I),I=1,NC)
END PROGRAM CAP8_4
ELABORADO POR Dr. JUAN MENDEZ
SOLUCION PROBLEMA 5 SOLUCION PROBLEMA 6
PROGRAM CAP8_5 PROGRAM CAP8_6
IMPLICIT NONE IMPLICIT NONE
INTEGER::I,J,NF,NC INTEGER,DIMENSION(2,3) ::AR
INTEGER, DIMENSION(2,3):: MAT INTEGER ::I,J
PRINT*, 'INGRESAR LOS NUMEROS DE FILAS' AR=RESHAPE((/1,1,2,2,3,3/),(/2,3/))
READ*, NF COLUMNAS: DO J=1,3
PRINT*,'INGRESAR LOS NUMEROS DE COLUMNAS' FILAS: DO I=1,2
READ*, NC PRINT*
PRINT*,'DAME LAS COMPONENTES DE LA MATRIZ' PRINT* 'COMPONENTE',I,J,'=',AR(I,J)
READ(*,*) MAT PRINT*
FILAS: DO I=1,NF PRINT*,'DIRECCION DE MEMORIA',LOC(AR(I,J))
COLUMNAS: DO J=1,NC END DO FILAS
PRINT*, 'COMPONENTE',I,J,':',MAT(I,J),LOC(MAT(I,J)) END DO COLUMNAS
END DO COLUMNAS END PROGRAM CAP8_6
END DO FILAS
END PROGRAM CAP8_5

ELABORADO POR Dr. JUAN MENDEZ


TEXTO:Curso-Fortran-4.pdf

ELABORADO POR Dr. JUAN MENDEZ

También podría gustarte