Arreglos vectores matrices Un arreglo es un grupo












- Slides: 12
Arreglos (vectores, matrices, …. ) Un arreglo es un grupo de variables o constantes, todas del mismo tipo referenciadas con un mismo nombre. …. a(1) a(2) a(3) a(4) a(5) a(6) …. . arreglo ØCada valor individual se llama elemento Ø El subíndice indica la posición particular dentro del arreglo. ØEl subíndice es un ENTERO. Es útil para aplicar un algoritmo a un gran número de datos a través de ciclos Ej DO i=1, 100 a(i)=sqrt(a(i)) END DO
Declaración de los Arreglos ØLos arreglos tienen que ser declarados antes de ser utilizados para que el compilador guarde lugar en la memoria según el tipo y número de elementos que contiene. Ej REAL, DIMENSION (100) : : a ØCuando se define la variable CHARACTER se tiene que tener en cuenta la longitud de caracteres y elemento: s Ej CHARACTER(10), DIMENSION (12) : : mes ØLos arreglos pueden ser declarados con más de un subíndice , por lo tanto pueden tener 2 o más dimensiones. ØEl número de dimensiones se llama rango (rank). ØEl número de elementos de cada dimensión se llama extensión (extent). ØLa combinación del rango y la dimensión se llama forma (sharp). Ø El número de elementos declarados en el arreglo tamaño (size) Arreglos constantes: sus elementos son ctes. Pueden definirse entre / Ej: (/1, 2, 3, 4, 5/)
ARREGLOS
Inicialización de los arreglos Los elementos de los arreglos son variables ordinarias y tienen que ser inicializadas antes de ser usadas. Si no se la inicializa su valor es indefinido. Pueden ser inicializados: 1. Sentencias de asignación elemento por elemento Ej de esta forma de inicialización: v REAL, DIMENSION(10) : : arreglo DO i=1, 10 arreglo(i) = REAL(i) END DO v REAL, DIMENSION(10) : : arreglo=(/1. , 2. , 3. , 4. , 5. , 6. , 7. , 8. , 9. , 10. /) v REAL, DIMENSION(10) : : arreglo=0. ! todos los elementos iguales v INTEGER, DIMENSION(10) : : num, cuad DO i=1, 10 num(i)=i+i cuad(i)= num(i)**2 END DO
2. Inicialización por sentencias de declaración Ej de esta forma de inicialización: v INTEGER, DIMENSION (5) : : arreglo = (/1, 2, 3, 4, 5 /) v INTEGER, DIMENSION (5) : : arreglo = (/(i, i=1, 5)/) v INTEGER, DIMENSION (25) : : arreglo = (/((0, i=1, 4), 5*j, j=1, 5) /) v 0, 0, 5, 0, 0, 10, 0, 0, 15, 0, 0, 20, 0, 0, 25 REAL, DIMENSION (100) : : arreglo =1. 0 3. Inicialización de arreglos con READ Valores de borde de los arreglos Normalmente se usan valores de 1 a N Ej: REAL, DIMENSION (3) : : arr ⇒ arr(1), arr(2), arr(3) pero muchas veces resulta útil que los subíndices tomen otros valores. Para definir los: REAL, DIMENSION (imin, imax) : : arr Ej: REAL, DIMENSION (5) aa REAL, DIMENSION (-2 : 2) : : bb REAL, DIMENSION ( 7: 11) : : cc Los 3 arreglos tienen la misma forma (igual dimensión e igual número de elementos
! Controlar que el índice se encuentre dentro de los límites del arreglo A(1) A(2) A(3) A(4) A(5) B(1) Arreglo A B(2) B(3) B(4) …… Arreglo B Si se utiliza el A(6) puede conducir a errores. Los compiladores FORTRAN tienen opción bounds cheking para controlar los valores que toma el índice Las constantes con nombre y la declaración de arreglos Se utiliza para cambiar de manera simple el tamaño de los arreglos. Ej: INTEGER, PARAMETER : : tama=1000 REAL : : arre 1(tama) REAL : : arre 2(2*tama) REAL : : arre 3(tama, tama)
Buena costumbre: declarar el tamaño de los arreglos usando PARAMETER y realizar cambios rápidamente. Usando arreglos completos o un subconjunto a VALOR b VALOR a(1) 1. b(1) a(2) 2. a(3) a(4) a c VALOR 5. c(1) 6. b(2) 6. c(2) 8. 3. b(3) 7. c(3) 10. 4. b(4) 8. c(4) 12. + PROGRAM suma_arreglos IMPLICIT NONE ! INTEGER : : i b = c
REAL, DIMENSION (4) : : a=(/ 1. , 2. , 3. , 4. /) REAL, DIMENSION (4) : : b=(/ 5. , 6. , 7. , 8. /) REAL, DIMENSION (4) : : c, d ! ! Elemento por elemento DO i=1, 4 c(i)= a(i)+b(i) END DO ! ! Suma en forma conjunta todos los elementos de los arreglos d= a+b ! ! Escribo los resultados WRITE(*, *) “c” DO i=1, 4 WRITE(*, *) c(i) END DO WRITE(*, *) “d”, d ! END PROGRAM suma_arreglos
Impresión c 6. 0 d 6. 0 8. 0 10. 0 12. 0 ! La operación puede hacerse si y solo si ambos arreglos tienen la misma forma (igual número de dimensiones y el mismo número de elementos en cada dimensión, (igual rango e igual extensión))⇒ conforme ØLos escalares son conformes con los arreglos: REAL, DIMENSION (4) : : a=(/1. , 2. , 3. , 4. /), c REAL : : b=10 c=b*a El arreglo c será 10. , 20. , 30. , 40. ØTambién se puede realizar estas operaciones con funciones intrínsecas elementales. Las más comunes: ABS, SIN, COS, EXP y LOG REAL, DIMENSION (4) : : a=(/-1. , 2. , -3. , 4. /), c c= ABS(a) El arreglo c será 1. , 2. , 3. , 4.
Subconjunto de un arreglo Para utilizar una sección del arreglo se especifican los índices : inicio: fin: incremento subíndice triple Ej : INTEGER, DIMENSION : : arre(/1, 2, 3, 4, 5, 6, 7, 8, 9, 10/) El subconjunto arre( 1: 10: 2) arre(1), arre(3), arre(5), arre(7) y arre(9) 1, 3, 5, 7 y 9 inicio valor del índice inicial del subconjunto fin valor del índice final del subconjunto Incremento incremento a través de los índices del arreglo. Si falta: inicio → 1 fin → fin del arreglo incremento → 1 Ej: INTEGER : : i=3, j=7 REAL, DIMENSION (10) : : a (/1. , -2. , 3. , -4. , 5. , -6. , 7. , -8. , 9. , -10. /) a(: ) → todos los elementos a( i: j) → del tercer elemento al séptimo ( 3. , -4. , 5. , -6. , 7) a(i: j: i) → del tercer elemento al séptimo saltando de a 3 (3. , -6. ) a(i: j: j) → del tercer elemento al séptimo saltando de a 7 (3. ) a(i: ) → del tercer elemento al final (3. , -4. , 5. , -6. , 7. , -8. , 9. , -10) a(j: ) → del séptimo elemento al final (7. , -8. , 9. , -10) a(: : i) → todos los elementos saltando 3 (1. , -4. , 7. , -10. )
Subindice vector especifica uno los elementos del arreglo a ser usados en el cálculo. Ej: INTEGER, DIMENSION (5): : vec =(/1, 6, 4, 1, 9/) REAL, DIMENSION (10) : : a (/1. , -2. , 3. , -4. , 5. , -6. , 7. , -8. , 9. , -10. /) a(vec ) → es el arreglo [1. , -6. , -4. , 1. , 9. ] Entradas y salidas WRITE( *, *) a(1), a(2), a(3), a(4) Con DO implícito WRITE( *, *) (a(i), i=1, 4) Imprime los valores de a(1), a(2), a(3) y a(4) En general: WRITE( unidad , format) (var 1, var 2, …. Indice= icomienzo, ifin. incre) READ ( unidad , format) (var 1, var 2, …. Indice= icomienzo, ifin. incre) ØDentro del write se pueden incluir tareas Ej: WRITE( *, * ) (i, 2*i, 3*i, i= 1, 3) Imprime 1 2 3 2 4 6 3 6 9
Ciclos anidados WRITE(*, *) ((i, j, j= 1, 3), i= 1, 3) Primero varia j y luego i 1 1 1 2 1 3 2 1 2 2 2 3 3 1 3 2 3 3 Los DO implícitos son muy importantes cuando se trabaja con arreglos que tienen dos o mas dimensiones.