Académique Documents
Professionnel Documents
Culture Documents
Arrays
Array
Contenidos
8.1 El concepto de array
8.2 Arrays unidimensionales
8.3 Arrays bidimensionales
8.4 Arrays en expresiones
8.5 Lectura y escritura de arrays
8.6 Arrays dinmicos
Arrays unidimensionales
Slo tienen una dimensin
Consisten en una lista de
variables todas del mismo
tipo
Se accede a cada una
mediante una expresin que
viene dada por el nombre
del array y entre parntesis,
un ndice (su posicin en el
array):
ndice
Expresin
entera
2.0
9.3
.
6.4
Nombre_array(ndice_fila, ndice_col)
Identificador
Expresin
Expresin
entera
entera
A(i)
.
7
1.1
0.4
9.2
10
2.2
REAL::salario1,salario2,...,salario100
A(8)
A(10)
Arrays bidimensionales
Tienen dos dimensiones (fila
y columna)
Consisten en una matriz de
variables todas de un mismo
tipo.
Se accede a cada una
mediante una expresin que
viene dada por el nombre
del array, y entre parntesis
y separados por coma, dos
ndices (el de fila y el de
columna), que indican su
posicin en el array:
A(2)
Nombre_array(ndice)
Identificador
Acceso a las
componentes
A(1)
ndice
de fila
1
2
ndice de
columna
6.4
6.4
6.4
9.0
9.0
6.4
...
...
2.2
2.2
6.4
...
...
3.7
2.2
9.0
5.5
1.3
2.9
1000.00
salarios(1)
2000.00
salarios(2)
1500.00
salarios(i)
i
Acceso a las B(6,1)
componentes:
B(i,j)
B(2,1)
100 2500.00
salarios(100)
Columnas:
.true.
.false.
.true.
.true.
.false.
.true.
.true.
.true.
.false.
.true.
.false.
.false.
.false.
.true.
.true.
.true.
.false.
.true.
.true.
.true.
.false.
Declaracin
zLa sintaxis general de declaracin de un array
unidimensional es:
CasasVendidas(5,3)
Indice
de fila Indice
de col
Ejemplos
de declaracin
!Declaracin de un tipo:
TYPE tipo_persona
INTEGER:: dni
CHARACTER (LEN = 30):: nombre
CHARACTER:: nacionalidad
END TYPE tipo_persona
nombre_array(ndice) = expresin
2. Lectura de un elemento de un array
Read*, nombre_array(ndice)
2. Uso de un elemento de in array en una expresin:
u(3) = u(1)*5
a = 2 !a es variable entera
u(2*a-2) = 4.5
u(1) = 3.0
u
3.0
4.5
15.0
nombre_var = nombre_array(ndice)
Ejemplo:
character(len = 30), dimension(11)::nombres_jugadores
character(len=30):: nombre_descalificado
nombres_jugadores(7) = Ral
!Escritura en el array
INTEGER:: indice
INTEGER, DIMENSION(15) :: vector
z Ejemplo: lectura de los elementos del vector elemento a elemento, p.e. para
cuando el usuario escribe cada uno en una lnea distinta y hay que usar un
read para leer cada elemento:
PRINT*,Teclee 15 datos, cada uno en una lnea
DO indice = 1, 15
READ*,vector(indice)
!Con cada read hay salto de lnea
END DO
Media de los
elementos
almacenados en
un array de
longitud 10:
Ejercicio:
Ejemplo
z Programa que pregunta las bases y las alturas de 10
rectngulos y las guarda en sendos arrays.
Posteriormente calcula las superficies de los
rectngulos, las guarda en un array, y las escribe en la
pantalla.
PROGRAM areas_rectangulos
IMPLICIT NONE
INTEGER, PARAMETER:: NUM_RECTANGULOS = 10
REAL, DIMENSION(NUM_RECTANGULOS):: bases, alturas, areas
CALL leer_lados(bases, alturas, NUM_RECTANGULOS)
CALL calcular_areas_rectangulos(bases, alturas, areas, NUM_RECTANGULOS)
CALL escribir resultados(areas, NUM_RECTANGULOS)
END PROGRAM areas_rectangulos
DO i=1,N
areas(i) = bases(i)*alturas(i)
END DO
DO i=1, 100
empleados(i)%salario = empleados(i)%salario + &
& empleados(i)%salario *4 / 100
END DO
i=1
DO WHILE ((.NOT.encontrado).and. (i<=num_elementos))
IF (A(i) == elemento) THEN
encontrado = .true.
posicion_elemento = i
END IF
i = i+1
END DO
END FUNCTION posicion_elemento
Ejemplos
de declaracin (2D)
8.3. Arrays bidimensionales
(Declaracin, acceso a las componentes y
recorridos)
.
.
Declaracin
zLa sintaxis general de declaracin de arrays
bidimensionales es:
TIPO,DIMENSION(numfilas,numcolumnas)::nombrearray
11
12
medidas(2,6)
velocidades(1,1) = 3.
velocidades (2,3) = 5.5
velocidades (3,2) = 3.1
3.0
1.0
4.5
5.0
5.5
15.3
3.1
5.2
73.0
INTEGER, DIMENSION(3,4)::a
PRINT*,Escriba 12 elem de la matriz, cada uno en una lnea, por orden de columnas
DO j = 1,4
DO i = 1,3
READ*, a(i,j)
END DO
END DO
!El usuario escribe cada elemento en una lnea
PRINT*,Escriba 12 elem de la matriz, cada uno en una lnea y por orden de filas
DO i = 1,3
DO j = 1,4
READ*, a(i,j)
END DO
END DO
!El usuario escribe cada elemento en una lnea
Arrays en expresiones
z Cualquier expresin en Fortran puede contener arrays
como operandos, si estos tienen el mismo tamao.
z Ejemplo: si definimos a, b y c as:
REAL, DIMENSION(20):: A, B, C
INTEGER, DIMENSION(3,4):: E, F
Son expresiones vlidas:
-A + 3.0*B
2.0*E - 5.0*F
Asignacin a matrices
z Las expresiones anteriores pueden asignarse a otros
arrays, siempre que tengan el mismo tamao.
Asignacin a matrices
z Ejemplo:
REAL, DIMENSION(10, 5):: a, b
INTEGER:: i, j
b = 30.0
!Asigna a todos los elem. de b el valor 30.0
!La instruccin:
a = sin(b)
! asigna a cada elemento de a el seno de su
! correspondiente elemento en b.
! Es equivalente a:
DO i=1,10
DO j=1,5
a(i,j)= sin(b(i,j))
END DO
END DO
Submatrices
Es posible tratar submatrices como si fueran matrices, en expresiones. Se
denotan mediante el nombre de la matriz a la que pertenecen, y entre
parntesis y separados por comas, los rangos del ndice de fila y del
ndice de columna que abarca la submatriz en la matriz, respectivamente.
El rango de variacin de un ndice se denota mediante el valor inicial
del ndice, seguido de dos puntos y del valor final. Los ndices inicial
y final vienen dados por expresiones enteras.
Integer, parameter:: long = ___, long1 = ___, long2 = ____
Integer, dimension(long):: vector
Integer, dimension(long1, long2):: matriz
Integer:: n1, n2, m1, m2
Vector(n1:n2) !Es el subvector contenido
n1 n2
!va de las posiciones n1 a
!cuya longitud es n2-n1+1.
!expresiones como si fuese
Matriz(n1:n2, m1:m2)
m1 . m2
n1
..
n2
en
la
Se
un
el vector, que
n2 del vector y
puede tratar en
vector.
A
A(1)
MP
A(1)
A(2)
A(2)
A(3)
A(3)
A(4)
A(4)
A(5)
B(1,1)
B(2,1)
B(1,2)
B(2,2)
B(1,3)
Array
B(2,3)
A(5)
Array
Disposicin en MP
Disposicin en MP
10
Se pueden introducir los n elementos en la misma lnea separados por comas o blancos.
Ejemplos
z Pedir al usuario que teclee los elementos de una
matriz B, 3x4 por columnas, y calcular la suma de los
elementos de la columna 2:
INTEGER, DIMENSION(3,4):: b
INTEGER:: i, j, suma
PRINT*, Teclee los elementos de B en una fila y por columnas
READ*, b
suma = 0
j = 2
DO i = 1, 3
suma = suma + b(i,j)
END DO
PRINT*, La suma de los elementos de la columna , j, es: suma
Ejemplos
Tambin podemos leer y escribir elemento a elemento, en cuyo caso habr que construir una estructura de
repeticin.
11
Ejemplos
z Sumar todos los elementos de la matriz:
Ejemplos
integer, parameter::n = 3
integer, parameter::m = 2
integer, dimension(n)::lista
real, dimension(n,m)::tabla
INTEGER, DIMENSION(3,4):: b
INTEGER:: i, j, suma
PRINT*, Teclee los elementos de B en una fila y por columnas
READ*, b
suma = 0
DO i = 1, 3
DO j = 1, 4
suma = suma + b(i, j)
END DO
END DO
Lista:
lista
tabla:
tabla
6
Ejemplo de ejecucin:
Escriba
6 5 4
Escriba
6 5 4 3
Lista:
6 5 4
Tabla:
6 5 4 3
Ejemplos
z Suma de los elementos de cada fila de una matriz:
INTEGER, DIMENSION(3,4):: b
INTEGER:: i, j, suma
PRINT*, Teclee los elementos de B en una fila y por columnas
READ*, b
lista
5
4
tabla
2 1
integer, parameter:: n = 3
integer, parameter:: m = 2
integer, dimension(n):: lista
real, dimension(n,m):: tabla
integer::i,j
Ejemplos
DO i = 1,3
suma_fila = 0
DO j = 1,4
suma_fila = suma_fila + b(i,j)
END DO
PRINT*, La suma de los elementos de la fila , i , es: , suma_fila
END DO
do j=1,m
do i=1,n
Read*, tabla(i,j)
end do
end do
!Escritura de los elementos de la lista con cada uno en una lnea:
Do i=1,n
print*, lista(i)
End do
!Escritura de los elementos de la tabla por filas con cada uno en una lnea
do i=1,n
do j=1,m
print*, tabla(i,j)
end do
end do
12
Consejos para la
programacin con arrays
z Escritura de los elementos de una matriz con todos los
elementos de cada fila en una lnea:
INTEGER, PARAMETER::long = 80
REAL, DIMENSION(long)::nota1,nota2,final
integer, dimension(4,3):: a
integer:: i, j
Print*, Escriba cada fila de la matriz en una lnea
! p.ej.:
6 5 2 <INTRO>
!
4 3 2 <INTRO>
!
0 0 1 <INTRO>
!
1 0 0 <INTRO>
DO i = 1, 4
READ*, a(i,1:3)
END DO
As conseguiremos que el subprograma que recibe el array pueda reutilizarse para arrays de
cualquier tamao.
Del mismo modo, tambin es til enviar como argumento la longitud de las cadenas de
caracteres.
13
Ejemplo
z Programa que calcula la traza de una matriz 3x3 (suma de los elementos
de la diagonal principal):
PROGRAM ej_traza
IMPLICIT NONE
INTEGER, PARAMETER:: N = 3
INTEGER, DIMENSION(N, N):: matriz
REAL, EXTERNAL:: traza
INTEGER::i
DO i=1, n
PRINT*, fila: : i
READ*, matriz(i, 1:n)
END DO
PRINT*, La traza es: , traza(matriz, n)
END PROGRAM ej_traza
!___________________________________________
REAL FUNCTION traza(matriz, lado)
Implicit none
INTEGER, INTENT(IN):: lado
INTEGER, DIMENSION(lado, lado), INTENT(IN):: matriz
INTEGER::contador
REAL:: suma
suma = 0.0
DO contador = 1, lado
suma = suma + matriz(contador, contador)
END DO
traza = suma
END FUNCTION traza
Arrays dinmicos
z Los arrays con los que hemos trabajado hasta ahora
son arrays estticos: su tamao se fija en tiempo
de compilacin (o diseo) y no vara a lo largo de la
ejecucin del programa (utilizacin esttica de la
memoria). Ejemplo:
real, dimension (20)::notas
z Si se declaran arrays de un nmero fijo de
elementos se tienen los siguientes inconvenientes:
zSi en algn momento en la ejecucin del programa hay
ms elementos, no hay espacio reservado para
almacenarlos
zSi hay menos, se est desaprovechando memoria
Arrays dinmicos
14
DEALLOCATE
2. Se utiliza la sentencia ALLOCATE dentro del programa para
definir el tamao deseado para el array. Se debe realizar
este paso antes de trabajar con el array. Sintaxis:
ALLOCATE(nombre_vector(longitud))
ALLOCATE(nombre_matriz(num_filas, num_columnas))
Arrays dinmicos 1D
REAL, DIMENSION(:), ALLOCATABLE::nombre_vector
INTEGER::n
.
.
! Durante el programa:
print*, Indique el tamao del vector
read*,n
ALLOCATE(nombre_vector(n))
! Luego n es el tamao de nombre_vector
.
.
.
.
DEALLOCATE(numbre_vector)
Arrays dinmicos 2D
REAL, DIMENSION(:,:), ALLOCATABLE::matriz
INTEGER::n,m
.
.
! Durante el programa:
print*, Filas de la matriz:
read*,n
print*, Columnas de la matriz:
read*,m
ALLOCATE(matriz(n,m))
! Luego n es el tamao de nombre_vector
.
.
.
DEALLOCATE(matriz)
Ejemplo
z Programa que calcula la traza de una matriz cuadrada cuyo tamao se pide al
usuario (suma de los elementos de la diagonal principal):
PROGRAM ej_traza
IMPLICIT NONE
INTEGER, DIMENSION(:,:), ALLOCATABLE:: matriz
REAL, EXTERNAL:: traza
INTEGER::i, n
PRINT*, Cul es nmero de filas de la matriz cuadrada?
READ*, n
ALLOCATE(matriz(n,n))
DO i=1, n
PRINT*, fila: : i
READ*, matriz(i, 1:n)
END DO
PRINT*, La traza es: , traza(matriz, n)
DEALLOCATE(matriz)
END PROGRAM ej_traza
!___________________________________________
REAL FUNCTION traza(matriz, lado)
Implicit none
INTEGER, INTENT(IN):: lado
INTEGER, DIMENSION(lado, lado), INTENT(IN):: matriz
INTEGER::contador
REAL:: suma
suma = 0.0
DO contador = 1, lado
suma = suma + matriz(contador, contador)
END DO
traza = suma
END FUNCTION traza
15
Ejemplo
SUBROUTINE leer_vector(a, n)
IMPLICIT NONE
INTEGER, INTENT(IN):: n
REAL, DIMENSION(n), INTENT(OUT):: a
PRINT*, Introduzca , n, nmeros reales separados por blancos o por comas
READ*, a
END SUBROUTINE leer_vector
!*****************************************************************************
16