Vous êtes sur la page 1sur 16

TEMA 8

Arrays

8.1 El concepto de array


zLos datos pueden ser:
Simples: cada identificador representa una
direccin de memoria donde guardar un valor
escalar, p.e. un nico valor de una variable:
Datos de los tipos entero, real, carcter o lgico.

Compuestos: cada identificador representa una


direccin de memoria a partir de la cual se guardan
varios valores. Guardan varios valores bajo un
mismo identificador.
z Registros: contienen varios datos que pueden ser de distinto
tipo.
z Arrays: contienen varios datos todos del mismo tipo.

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

z Es una coleccin de datos todos del mismo tipo y


agrupados bajo el mismo identificador (nombre del
array).
z Los datos o elementos de un array pueden ser de tipo:
INTEGER
REAL
CHARACTER
LOGICAL
REGISTRO

z Segn su dimensin, los arrays se clasifican en:


Arrays unidimensionales (tambin llamados vectores o listas)
Arrays bidimensionales (tambin llamados matrices o tablas)

Utilidad de los Arrays

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)

Array unidimensional cuyo nombre


es A.Contiene 10 elementos reales

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

Son tiles (y en muchas ocasiones imprescindibles) cuando en un


programa hay varios elementos del mismo tipo y que se procesan
igual: si se realiza una misma instruccin (u operacin) sobre
cada elemento, basta con escribir dicha instruccin una sola vez y
repetirla para cada elemento (mediante una instruccin de
repeticin).
Ejemplo:
z Dado un programa que maneje los 100 salarios de 100
empleados. Con datos simples tendramos que utilizar 100
variables reales:

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

Con arrays bastara con declarar 1 nico vector o array de 100


elementos reales, que contenga los 100 salarios.
z Si hay que calcular un incremento del salario del 4% para cada
empleado, en lugar de realizar 100 veces el mismo clculo, repito
100 veces la instruccin (que escribo una sola vez) mediante una
instruccin de repeticin.

Utilidad de los arrays


salarios
1

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)

Array bidimensional B, de 7x5


elementos reales

100 2500.00

salarios(100)

Utilidad de los arrays


zEjemplo: Una constructora construye un
bloque de 7 plantas y en cada planta 3
viviendas (Vivienda vendida: .TRUE. /
Vivienda no vendida: .FALSE.)
zCon datos simples tendramos que utilizar
7*3=21 identificadores diferentes
zCon arrays bastara con declarar un array
7 x 3 de dimensin 2.

Utilidad de los arrays

Ejemplo: array bidimensional de 7x3 Componentes denominado CasasVendidas


Filas:

Columnas:

.true.

.false.

.true.

.true.

.false.

.true.

.true.

.true.

.false.

.true.

.false.

.false.

.false.

.true.

.true.

.true.

.false.

.true.

.true.

.true.

.false.

(Declaracin, acceso a las componentes y recorrido)

Declaracin
zLa sintaxis general de declaracin de un array
unidimensional es:

8.2. Arrays unidimensionales

TIPO, DIMENSION(num_componentes):: nombre_array

TIPO: Es el tipo de los datos que contiene el array

(INTEGER, REAL, CHARACTER, LOGICAL o REGISTRO).

CasasVendidas(5,3)
Indice
de fila Indice
de col

num_componentes : es la longitud del vector, el nmero


mximo de datos que caben en el array. Debe ser una
expresin entera. Indica el espacio que hay que reservar
en la memoria principal para albergar el vector.
Nombre_array : es el identificador o nombre del array.
Debe ser un identificador vlido de Fortran.

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:

Acceso a los elementos


de un array
z Se accede a los diferentes elementos de un array a
travs del nombre del array seguido de un nmero
entero entre parntesis llamado ndice que indica
la posicin a la que se quiere acceder:
z Ejemplo:
ndice

u(3) = u(1)*5
a = 2 !a es variable entera
u(2*a-2) = 4.5

El acceso a los elementos de un array sirve para poder usar cada


elemento como si fuera una variable, y puede hacerse en cualquier
expresin del programa. Ejemplos:

1. Asignacin del resultado de una expresin a un elemento de un array:

!Ejemplos de declaracin de arrays


REAL, DIMENSION(3) :: u, v !reserva espacio en la memoria
!para dos arrays de 3 reales
!cada uno.
LOGICAL, DIMENSION(7) :: CasasVendidas
INTEGER, DIMENSION(20) :: Notas !contiene 20 elem. enteros
CHARACTER(len=20),DIMENSION(30)::nombre
CHARACTER(len=20),DIMENSION(30)::apellido1
TYPE (tipo_persona), DIMENSION(100)::alumnos

u(1) = 3.0

u
3.0
4.5

15.0

z El ndice puede venir dado por cualquier


expresin entera.

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

nombre_descalificado = nombres_jugadores(7) !Lectura del array

Recorrido por los elementos de


un array 1D
z Se realiza un recorrido por los elementos de un array para
procesarlos realizando la misma operacin repetidamente con
todos o con algunos de sus elementos, por ejemplo para:

Leer de teclado el valor de cada elemento


Escribir cada elemento en la pantalla
Utilizar cada elemento en una expresin
Procesar cada elemento,
Buscar un elemento en un array
Buscar la posicin de un elemento en un array
Sumar los elementos de un array
Contar el nmero de veces que aparece un elemento en un array, etc

z Para recorrer un array se utiliza una instruccin de


repeticin en la que se repite una instruccin donde variando
el ndice (posicin del elemento en el array) en cada repeticin,
se recorre el array pasando por los elementos deseados.

Recorrido por los elementos de


un array 1D

Recorrido por los elementos de


un array 1D

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:

NOTA: Los elementos de un array tambin se pueden leer sin realizar un


recorrido por todos ellos, p.e. cuando el usuario los introduce a travs de
teclado todos en la misma lnea y separados por espacios o por comas. En
este caso todos los elementos pueden leerse con un nico read:

Modifquelo para que


la lectura de los elem.
se realice en una
subrutina.

PRINT*,Teclee 15 datos en la misma lnea


READ*, vector

Recorrido por los elementos de


un array 1D
z Ejemplo: calcular la nota media a partir de dos parciales para todos los
alumnos de una clase de 80 alumnos. Las notas de cada parcial se hallan en
sendos arrays nota1 y nota2 de 80 elementos. Gurdense las notas finales
en el array final de 80 elementos.
INTEGER, PARAMETER::NUM_ALUMNOS=80
REAL, DIMENSION(NUM_ALUMNOS)::nota1,nota2,final
INTEGER:: i
............
! Se asignan valores a nota1 y nota2

! Se recorren los arrays variando el ndice desde la posicin 1 hasta la


! posicin NUM_ALUMNOS para procesar cada elemento:
DO i = 1,NUM_ALUMNOS
final(i) = (nota1(i)+nota2(i))/2
END DO

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

SUBROUTINE leer_lados(bases, alturas, N)


IMPLICIT NONE
INTEGER, INTENT(in):: N
!Debe declararse antes de usarlo en la siguiente declarac.
REAL, DIMENSION(N), INTENT(out):: bases, alturas
INTEGER::i
DO i=1,N
PRINT*, Escriba la base y la altura del rectngulo, i, :
READ*,
bases(i), alturas(i)
END DO

Acceso a los elementos de un


array de registros (contina):

END SUBROUTINE leer_lados


!**************************************************************
SUBROUTINE calcular_areas_rectangulos(bases, alturas, areas, N)
IMPLICIT NONE
INTEGER, INTENT(in):: N
REAL, DIMENSION(N), INTENT(in):: bases, alturas
REAL, DIMENSION(N), INTENT(out):: areas
INTEGER::i

!Lectura de nombres y salarios


DO i=1, 100
PRINT*, Escriba el nombre y el salario del empleado , i
READ*, empleados(i)%nombre, empleados(i)%salario
END DO

DO i=1,N
areas(i) = bases(i)*alturas(i)
END DO

!Subida del salario un 4% a todos los empleados

END SUBROUTINE calcular_areas_rectangulos


!**************************************************************
SUBROUTINE escribir resultados(areas, N)
IMPLICIT NONE
INTEGER, INTENT(in):: N
REAL, DIMENSION(NUM_RECTANGULOS):: bases, alturas, areas
INTEGER::i
DO i=1,N
PRINT*, El rea del rectngulo , i, es:, areas(i)
END DO

DO i=1, 100
empleados(i)%salario = empleados(i)%salario + &
& empleados(i)%salario *4 / 100
END DO

END SUBROUTINE escribir_resultados

Acceso a los elementos de un


array de registros
!Declaracin de tipo
TYPE tipo_persona
CHARACTER(LEN=50):: nombre
CHARACTER:: nacionalidad
REAL:: salario
END TYPE tipo_persona
!Declaracin de un array de elementos de tipo tipo_persona
TYPE(tipo_persona), dimension(100):: empleados
!Inicializacin de la nacionalidad de los 10 primeros
! empleados a e (espaola):
DO i = 1, 10
empleados(i)%nacionalidad = e
END DO

Bsqueda de un elemento en un array


INTEGER FUNCTION posicion_elemento (A, num_elementos, elemento)
IMPLICIT none
! Funcin que busca un elemento entero en un array. Si lo encuentra, devuelve como
! resultado la 1 posicin donde lo halla, y si no encuentra el elemento en el
! array, da como resultado cero (0)
! Declaracin de argumentos:
INTEGER, INTENT(IN):: num_elementos
INTEGER, INTENT(IN), DIMENSION(num_elementos)::A
INTEGER, INTENT(IN):: elemento

!Nmero de elementos del array A


!array
!Elemento a buscar en el array.

!Declaracin de variables locales


LOGICAL:: encontrado
! Indica si se encuentra el elemento.
INTEGER:: i
encontrado = .false.
posicion_elemento = 0

! Se inicializa a .false. (todava no lo ha encontrado)


! Cuando encuentre el elemento tomar el valor de la
! posicin donde se halla

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)

REAL, DIMENSION(3,3) :: matriz1, matriz2


LOGICAL, DIMENSION(7,3):: CasasVendidas
INTEGER, DIMENSION(20,3) :: Notas
CHARACTER(len=20),DIMENSION(30,5)::nombres
!Array para guardar 6 medidas de contaminacin
!cada mes del ao:
REAL, DIMENSION(12,6)::medidas !reserva espacio para 12x6
1 ..
5 6
!reales.
1

.
.

Declaracin
zLa sintaxis general de declaracin de arrays
bidimensionales es:
TIPO,DIMENSION(numfilas,numcolumnas)::nombrearray

TIPO: Es el tipo de datos que contendr el array (INTEGER,


REAL, CHARACTER, LOGICAL o REGISTRO).

numfilas, numcolumnas : son el nmero de filas y de


columnas de datos que contendr el array,
respectivamente. Deben ser expresiones enteras.
nombrearray : es el identificador de la coleccin o array.
Debe ser identificador vlido en Fortran 90.

11

12

medidas(2,6)

Acceso a los elementos


de un array (2D)
z Se accede a los diferentes elementos de un
array a travs del nombre de la coleccin
seguido de dos nmeros enteros entre
parntesis que indican la fila y columna del
elemento al que se quiere acceder:
z Ejemplo:
velocidades

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

Acceder a una posicin de


un array (2D)
Acceso a elementos de un array como si fueran variables:
1. Asignacin del resultado de una expresin al elemento de un
array de la fila fil y columna col:
nombre_array(fil,col) = expresion
Ej: medidas(2,6)= 6.3
2. Lectura de un elemento del array procedente del teclado:
READ*, nombre_array(fil, col)

Recorrido por los


elementos de un array 2D
zRecorridos por columnas:
DO col=1,numero_columnas
DO fil=1,numero_filas
...nombre_array(fil,col)...
END DO
END DO
zSe fija el nmero de columna y se recorren todas las filas. Se repite esta
operacin para cada columna.
zEjemplo: Leer 12 elem. y almacenarlos en el array A en el orden que resulta al
recorrer el array por columnas:

2. Asignacin de un valor guardado en la fila fil y columna col, a


una variable de nombre nombre_var:
nombre_var = nombre_array(fil,col)

Ej: real:: medida


medida = medidas(2,6)

Recorrido por los elementos de


un array 2D

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

Recorrido por los elementos


de un array 2D

z Recorridos por filas:


DO fil=1,numero_filas
DO col=1,numero_columnas
...nombre_array(fil,col)...
END DO
END DO
z Se fija el nmero de fila y se recorren todas las columnas.
Se repite esta operacin para cada fila.
z Ejemplo:

Leer 12 elem. y almacenarlos en el array A en el orden que resulta al


recorrer el array por filas:

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

z Ejemplos de recorridos: imprimir por pantalla los


elementos de una matriz 3x6 por orden de filas
INTEGER i,j
INTEGER, DIMENSION(3,6) :: matriz
............
! Imprimimos matriz por pantalla
DO i = 1,3
DO j = 1,6
Print*,Elemento fila,i,columna,j,
Print*,matriz(i,j)
END DO
END DO

Recorrido por los elementos


de un array 2D
z Ejemplos de recorridos: pedir por teclado los
elementos de una matriz siguiendo el orden de las
filas:
DO i=1,n_filas
print*,fila: ,i
DO j=1,n_columnas
print*,dame el elemento de la fila: , i, columna: ,j
read*,B(i,j)
END DO
END DO

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.

8.4. Arrays en expresiones

z Ejemplo 1: si definimos A, B y C as:


real, dimension(20)::A, B, C
DO i=1,20
c(i)=-a(i)+3.0*b(i)*C(i)
c=-a+3.0*b*C equivale a:
END DO

A = 8 !Los 20 elem. de A toman valor 8.


B = 0 !Todos los elem. de B toman valor 0.

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.

8.5 Lectura y escritura de


arrays

! 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.

!Es la submatriz contenida en la


! matriz que va desde las filas n1 a la
! n2 y desde las columnas m1 a la m2.
! Se puede tratar en expresiones como
! si fuese una matriz.

Disposicin de los arrays en la


memoria
z Arrays 1D: sus elementos
se almacenan de forma
consecutiva, por orden de su
posicin en el array:
Ej:
integer, dimension(5):: A
Direccin

A
A(1)

z Arrays 2D: sus elementos se


almacenan de forma consecutiva,
siguiendo orden por columnas:
Ej:
Integer, dimension(2,3)::B
direccin MP

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,1) B(1,2) B(1,3)

B(1,2)

B(2,1) B(2,2) B(2,3)

B(2,2)
B(1,3)

Array

B(2,3)

A(5)
Array

Disposicin en MP

Disposicin en MP

10

Lectura y escritura de arrays 1D


Integer, dimension(n):: vector
LECTURA DE UN ARRAY 1D MEDIANTE UNA INSTRUCCIN SIMPLE
read*, vector

!lee los n primeros elementos que


!se introducen desde teclado y los
!almacena en las n posiciones de la MP a
!partir del array, es decir, los almacena
!por ese orden en el array.

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

ESCRITURA DE UN ARRAY 1D MEDIANTE UNA INSTRUCCIN SIMPLE


print*, vector !escribe los n elementos del array en la misma
!lnea en el orden en que estn almacenados en MP.
z Tambin podemos leer y escribir elemento a elemento, en cuyo caso habr que construir una
estructura de repeticin.

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

Lectura y escritura de arrays 2D

Ejemplos

Integer, dimension(n,m):: matriz


LECTURA DE UN ARRAY 2D MEDIANTE UNA INSTRUCCIN SIMPLE
read*, matriz !lee los nxm primeros elementos que
!se introducen desde teclado y los
!almacena en las nxm posiciones de la MP a
!partir del array, es decir, los almacena
!por orden de columnas en el array. Conviene decir al
!usuario que introduzca los elementos de la matriz por
!columnas.
Se pueden introducir los nxm elementos en la misma lnea separados por comas o blancos.
ESCRITURA DE UN ARRAY 2D MEDIANTE UNA INSTRUCCIN SIMPLE
print*, matriz

!escribe los nxm elementos del array en la misma


!lnea en el orden en que estn almacenados en MP, es decir,
!por columnas.

Tambin podemos leer y escribir elemento a elemento, en cuyo caso habr que construir una estructura de
repeticin.

z Sumar todos los elementos de una fila cuyo ndice se pregunta al


usuario:
INTEGER, DIMENSION(3,4):: b
INTEGER:: i, j, suma
PRINT*, Teclee los elementos de B en una fila y por columnas
READ*, b
PRINT*, De qu fila desea calcular la suma?
READ*, i
Suma = 0
DO j = 1, 4
suma = suma + b(i, j)
END DO

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

Print*, Escriba los, n, elementos de la lista


Read*, lista

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

Print*, Escriba los,n*m, elementos de la tabla por columnas


Read*, tabla
Print*,
Print*,
Print*,
Print*,

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

los 3 elementos de la lista

5
4

los 6 elementos de la tabla por columnas


2 1

tabla

2 1

integer, parameter:: n = 3
integer, parameter:: m = 2
integer, dimension(n):: lista
real, dimension(n,m):: tabla
integer::i,j

Ejemplos

!Lectura de los elementos cada uno en una lnea


Print*, Escriba los, n, elementos de la lista, cada uno en una lnea
Do i=1,n
Read*, lista(i)
End do
!Lectura de los elementos de la matriz con cada uno en una lnea
Print*, Escriba los,n*m, elementos de la tabla por filas cada uno en una lnea
do i=1,n
do j=1,m
Read*, tabla(i,j)
end do
end do
!Lectura de los elementos de la matriz con cada uno en una lnea
Print*, Escriba los,n*m, elementos de la tabla por columnas

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:

zEs conveniente declarar las


dimensiones del array con una
constante no literal. Ejemplo:

integer, dimension(n, m):: matriz


integer::i,j
do i = 1, n
print*, matriz(i, 1:m) !Acceso a subtablas
end do

INTEGER, PARAMETER::long = 80
REAL, DIMENSION(long)::nota1,nota2,final

Salida por pantalla:


1 2 3
4 5 6
7 8 9

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

!mediante acceso a subtablas

Arrays como argumentos


! Al enviar un array como argumento a un subprograma, conviene enviar adems otro argumento:
! el tamao del array. Ejemplo:
INTEGER, PARAMETER:: NUM_ELEMENTOS = 100, F=30, C=2
REAL, DIMENSION(NUM_ELEMENTOS):: a
REAL, DIMENSION(F,C):: b
.
CALL leer_datos(a, NUM_ELEMENTOS, b, F, C)
.
!*********************************************
SUBROUTINE leer_datos(lista, longitud, matriz, num_filas, num_columnas)
INTEGER, INTENT(IN):: longitud, num_filas, num_columnas
! Antes de declarar los arrays deben estar declarados los tamaos, para que estos sean
! conocidos a la hora de usarlos:
REAL, DIMENSION(longitud), INTENT(OUT):: lista
REAL, DIMENSION(num_filas, num_columnas), INTENT(OUT):: matriz
.
.
.
!
!
!
!

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

8.6. Arrays dinmicos

z Fortran 90 permite reservar memoria de forma


dinmica, es decir, en tiempo de ejecucin, en
funcin de las necesidades que surgen a lo largo de
la ejecucin.
z Para ello debemos utilizar arrays dinmicos,
siguiendo estos 3 pasos:

1. Se declara el array con el atributo ALLOCATABLE, sin dar informacin


sobre su tamao, que se definir ms tarde. Sintaxis:

!Array dinmico 1D:


Tipo, dimension(:), ALLOCATABLE::
nombre_vector
!Array dinmico 2D:
Tipo, dimension(:,:), ALLOCATABLE::
nombre_matriz

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))

3. Una vez se ha utilizado un array dinmico, si ya no se


necesita ms, se puede liberar la memoria que ocupa
mediante la sentencia DEALLOCATE. Sintaxis:
DEALLOCATE(nombre_vector)
DEALLOCATE(matriz)

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

Clculo de la media de los elementos de un vector a cuyo tamao n se pregunta al usuario.


PROGRAM media_reales
IMPLICIT none
REAL, DIMENSION(:), ALLOCATABLE:: a
INTEGER:: n
REAL, EXTERNAL:: media
PRINT*, Cuntos elementos tiene el vector?
READ*, n
ALLOCATE(a(n))
!reserva n celdas en la MP para n reales
CALL leer_vector(a, n)
PRINT*, La media de los elementos del vector es: , media(a,n)
DEALLOCATE(a)
!libera la memoria ocupada por el vector a
END PROGRAM media_reales
!*****************************************************************************

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
!*****************************************************************************

REAL FUNCTION media(a, n)


IMPLICIT NONE
INTEGER, INTENT(IN):: n
REAL, DIMENSION(n), INTENT(IN):: a
INTEGER:: i, suma
suma = 0
DO i=1, n
suma = suma + a(i)
END DO
media = suma/n
END FUNCTION media

16

Vous aimerez peut-être aussi