43
Arrays (introducción) A cada valor individual del array se le denomina elemento del array. Los subíndices han de tomar valores enteros y pueden ser positivos, negativos o ceros Ejemplos: Un array es un conjunto de variables o constantes, todas del mismo tipo, asociadas a un mismo nombre. Los elementos del array se identifican por el nombre del array junto con los subíndices que definen su posición dentro del array X 5 se representa como X(5). mat 5 3 se representa como mat(5, 3). Nombre i-3 se representa como Nombre(i-3).

Fortran5 Arrays

Embed Size (px)

DESCRIPTION

arrays

Citation preview

Page 1: Fortran5 Arrays

Arrays (introducción)

A cada valor individual del array se le denomina elemento del array.

Los subíndices han de tomar valores enteros y pueden ser positivos, negativos o ceros

• Ejemplos:

Un array es un conjunto de variables o constantes, todas del mismo tipo,asociadas a un mismo nombre.

Los elementos del array se identifican por el nombre del array junto con los subíndices que definen su posición dentro del array

X5 se representa como X(5).

mat5 3 se representa como mat(5, 3).

Nombrei-3 se representa como Nombre(i-3).

Page 2: Fortran5 Arrays

Parámetros de un array

• Rango: es el número de sus dimensiones.

Por tanto, dos arrays tienen el mismo perfil si tienen el mismo rango y la misma extensión en cada una de sus dimensiones.

• Extensión: es el total de componentes que posee en cada una de sus dimensiones.

• Tamaño: es el total de elementos que tiene, es decir, el producto de sus extensiones.

• Perfil: es la combinación del rango y la extensión del array en cada dimensión.

Así, un escalar posee rango cero, un vector rango uno, una matriz rango dos, etc. En Fortran, el rango máximo de un array es 7.

Por ejemplo, en 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.

En el ejemplo anterior, el tamaño de una matriz de 5 filas x 3 columnas es 15.

Page 3: Fortran5 Arrays

Almacenamiento de un array

Matriz almacenada en su orden natural

Los elementos de un array ocupan posiciones consecutivas en la memoria del ordenador.

a(1)

a(2)

a(5)

a(4)

a(6)

a(3)

x(1,1)

x(2,1)

x(1,3)

x(2,2)

x(2,3)

x(1,2)

Almacenamiento de un vector

Page 4: Fortran5 Arrays

Declaración de arrays• Antes de usar un array, es necesario especificar su tipo y el número de elementos mediante una sentencia de declaración de tipo.Sintaxis general:

TIPO, DIMENSION (d1[,d2]…) :: lista de arrays

INTEGER, DIMENSION (4) :: vector1,vector2INTEGER, DIMENSION (-3:0) :: vector3CHARACTER (len=20), DIMENSION (50) :: nombres_alumnosREAL, DIMENSION (2,3) :: matriz1,matriz2REAL, DIMENSION (0:2,-2:3) :: matriz3,matriz4

Ejemplos:

• TIPO es cualquiera de los tipos de datos válidos en Fortran.

• DIMENSION( ) permite especificar los valores máximos y, opcionalmente, mínimos de los índices de cada una de las dimensiones. Así, en d1 se escribiría [límite_inferior_d1:]límite_superior_d1 y análogamente para las demás dimensiones, si las hay.

• lista de arrays es un conjunto de nombres de arrays separados por comas. Han de ser identificadores válidos.

Como los elementos de un array ocupan posiciones consecutivas en la memoria. El compilador ha de reservar el espacio de memoria adecuado a las dimensiones. Estas se especifican en las sentencias de declaración de arrays.

Page 5: Fortran5 Arrays

Referencia a los elementos de un array• Cada elemento de un array es una variable como cualquier otra y puede ser utilizado en cualquier expresión en la que se pueda usar una variable del mismo tipo.La sintaxis general para referirse a un elemento de un array:

nombre_array( i1 [,i2] ... )

Con la declaración REAL, DIMENSION (-1:1,3) :: XEjemplo:

Los valores de los índices han de estar dentro de los límites especificados en la declaración del array.

•En algunos casos, el sistema chequea los subíndices que se van utilizando en ejecución y produce un mensaje de error cuando uno está fuera de los límites.

• nombre_array es el identificador del nombre del array.• i1, i2, ... son los valores enteros de los correspondientes subíndices.

¿Qué sucede si, por error, se utiliza un valor fuera de los límites del subíndice?

•Cada uno de estos chequeos absorbe tiempo del ordenador, por lo que la mayor parte de los compiladores Fortran lo incluyen como una opción.

•El programador debe tener cuidado de que los subíndices que utiliza no excedan sus límites.

X(-1,1) X(-1,2) X(-1,3)X( 0,1) X( 0,2) X( 0,3)X( 1,1) X( 1,2) X( 1,3)

Los elementos válidos son

Page 6: Fortran5 Arrays

Inicialización de arrays

Al igual que las variables, los arrays deben inicializarse antes de usarse.

• En la propia sentencia de declaración de tipo del array, en tiempo de compilación.

• En sentencias de asignación.

• En sentencias de lectura (READ).

Cuando se trata de inicializar todos los elementos de un array a un único valor, lo más lógico es hacerlo en la propia instrucción de declaración de tipo o mediante una simple instrucción de asignación.

Ejemplos:

Hay tres formas de inicializar un array:

Para inicializar todos los elementos de un array a valores diferentes hay varias alternativas.

INTEGER, DIMENSION (100) :: v1INTEGER, DIMENSION (2,3) :: matv1= 0mat=0

INTEGER, DIMENSION (100) :: v = 0

INTEGER, DIMENSION (2,3) :: mat = 0

Page 7: Fortran5 Arrays

Inicialización de arrays en sentencias de declaración I

Para inicializar vectores pequeños, se usa el constructor de arrays, con los delimitadores (/ y /).Ejemplo: inicializar un vector v1 de 5 elementos con los valores 1, 2, 3, 4 y 5

INTEGER, DIMENSION (5) :: v1 = (/ 1, 2, 3, 4, 5/)

Para inicializar arrays de rango>1 se usa una función intrínseca especial llamada RESHAPE que cambia el perfil de un array sin cambiar su tamaño. Esta función tiene dos argumentos principalmente:

• fuente es un vector de constantes con los valores de los elementos del array.

RESHAPE (fuente, perfil)

• perfil es un vector de constantes con el perfil deseado.

El array construido toma sus elementos en su orden natural, es decir, si se trata de un array de rango dos, por columnas.

Ejemplo:

INTEGER, DIMENSION (2,3) :: mat1 = &RESHAPE ( (/ 1, 2, 3, 4, 5, 6/) , (/2,3/) )

=

642

5311mat

Símbolo para continuar la instrucción

Page 8: Fortran5 Arrays

Orden de inicialización con varias dimensiones

k 2

SI

i = i +1

k = 1

NO≤

Inicializa x(i,j,k)

j 3

SI

j = 1

NO≤

i 2

SI

i = 1

NO≤

j = j +1

k = k +1

En la inicialización comienza recorriendo el primer índice, dentro del recorrido del segundo, etc. Es el orden natural de Fortran

Page 9: Fortran5 Arrays

Inicialización de arrays en sentencias de declaración II

Para inicializar arrays de tamaño grande, se puede usar un bucle DO implícito para construir los valores dentro de los delimitadores /.../.

• arg1, [arg2], ... se evalúan en cada iteración del bucle.

(arg1[, arg2] …, índice = inicio, fin [, paso])

• El índice del bucle y los parámetros (inicio, fin y paso) funcionan exactamente igual que en el caso de los bucles DO iterativos.

INTEGER, DIMENSION (5) :: v1 = (/ ( i , i = 1, 5) /)

Ejemplos:

INTEGER, DIMENSION (10) :: v2 = (/ (1 , 1*i , i = 5, 1, -1 ) /)

v1 = ( 1 2 3 4 5 )

INTEGER, DIMENSION (20) :: v3 = (/ ( (0, i = 1, 4), 5*j , j = 1, 4) /)

v2 = ( 1 5 1 4 1 3 1 2 1 1 )

Los bucles DO implícitos pueden anidarse. La sentencia siguiente inicializa los elementos del vector v3 a 0 si no son divisibles por 5 y al número de elemento si son divisibles por cinco.

v3 = ( 0 0 0 0 5 0 0 0 0 10 0 0 0 0 15 0 0 0 0 20)

La forma general de un bucle implícito es:

Page 10: Fortran5 Arrays

Inicialización de arrays en sentencias de asignación

La utilización de constructores, la función RESHAPE y los DO implícitos son también válidos para inicializar arrays mediante instrucciones de asignación en el cuerpo del programa. INTEGER, DIMENSION (5) :: v1,v2

INTEGER, DIMENSION (2,3) :: mat1 v1 = (/ 1, 2, 3, 4, 5/) v2 = (/ (i, i= 10, 6, -1) /)mat1 = RESHAPE ( (/ 1, 2, 3, 4, 5, 6/) , (/2,3/) )

Ejemplos:

Los arrays también se pueden inicializar usando bucles DO iterativos.

INTEGER :: i,j,k=0INTEGER, DIMENSION (5) :: v1,v2INTEGER, DIMENSION (2,3) :: mat1DO i=1,5

v1(i)=iEND DODO i=10,6,-1

v2(i)=iEND DOexterno : DO j=1,3

interno :DO i=1,2k=k+1mat1(i,j)=k

END DO internoEND DO externo

Ejemplos:

Page 11: Fortran5 Arrays

Inicialización de arrays en sentencias de lectura I

Se pueden leer arraysusando bucles DO iterativos que contengan instrucciones READ

INTEGER :: i, jINTEGER, PARAMETER :: TM=5, TMF=2, TMC=3INTEGER, DIMENSION (TM) :: v1,v2INTEGER, DIMENSION (TMF, TMC) :: mat1

DO i=1, TMWRITE (*,*) ‘DAME ELEMENTO’,i,’DE v1 Y v2’READ (*,*) v1(i),v2(i)

END DO

DO i=1, TMFDO j=1, TMCWRITE (*,*) ‘DAME ELEMENTO’,i,j,’DE mat1’READ (*,*) mat1(i,j)

! lectura por filasEND DO

END DO

DO j=1, TMCDO i=1, TMFWRITE (*,*) ‘DAME ELEMENTO’,i,j,’DE mat1’READ (*,*) mat1(i,j)

! lectura por columnasEND DO

END DO

Ejemplos:

En programas largos y complicados, es conveniente usar el atributo PARAMETER para dar nombres a los tamaños de los arrays declarados. De esta manera, sus valores se cambiarán fácilmente.

Page 12: Fortran5 Arrays

Inicialización de arrays en sentencias de lectura II

Un array también se puede leer usando bucles DO implícitos en instrucciones READ

INTEGER, DIMENSION (5) :: wINTEGER, DIMENSION (0:3,2) :: m

READ (*,*) ( w(i), i=5,1,-1)READ (*,*) ( (m(i,j), i=0,3) , j=1,2) !lectura por columnasREAD (*,*) ( (m(i,j), j=1,2) , i=0,3) !lectura por filas

Ejemplos:

También es posible leer un array escribiendo únicamente su nombre, sin especificar su(s) índice(s). En ese caso, el compilador asume que se va a leer todo el array, es decir, todos sus elementos en el orden natural de Fortran.

READ (*,*) (arg1[, arg2] …, índice = inicio, fin [, paso])

Sintaxis:

INTEGER, DIMENSION (10) :: vINTEGER, DIMENSION (2,3) :: matREAD (*,*) vREAD (*,*) mat

Ejemplos:

Todas estas formas para leer arrays son también válidas para escribir arrays, sin más que sustituir la palabra reservada READ por WRITE, en las instrucciones correspondientes.

Page 13: Fortran5 Arrays

Operaciones sobre arrays completos

• Cualquier elemento de un array se puede usar como cualquier otra variable en un programa Fortran. Por tanto, un elemento de un array puede aparecer en una sentencia de asignación tanto a la izquierda como a la derecha del signo igual.

• Los arrays completos también se pueden usar en sentencias de asignación y cálculos, siempre que los arrays involucrados tengan el mismo perfil, aunque no tengan el mismo intervalo de índices en cada dimensión. Además, un escalar puede operarse con cualquier array.

• Una operación aritmética ordinaria entre dos arrays con el mismo perfil se realiza elemento a elemento.

• Si los arrays no tienen el mismo perfil, cualquier intento de realizar una operación entre ellos provoca un error de compilación.

•La mayoría de las funciones intrínsecas comunes (ABS, SIN, COS, EXP, LOG, etc.) admiten arrays como argumentos de entrada y de salida, en cuyo caso la operación se realiza elemento a elemento. A este tipo de funciones intrínsecas se las llama funciones intrínsecas elementales.

Page 14: Fortran5 Arrays

Operaciones sobre arrays completos (ejemplos) I

Ojo, no es la multiplicación de matrices

Page 15: Fortran5 Arrays

Operaciones sobre arrays completos (ejemplos) II

Esta es otra forma de obtener los resultados de caso anterior, operando con bucles

DO iterativos, unificando los índices de los arrays pues tiene el mismo rango.

Page 16: Fortran5 Arrays

Operaciones sobre subconjuntos de arrays

Hasta ahora hemos visto que es posible usar elementos de arrays o arrayscompletos en sentencias de asignación y cálculos. Asimismo, es posible usar cualquier subconjunto de un array, llamado sección de array.

Para especificar una sección de un array, basta sustituir el índice del array por:• un triplete de índices o• un vector de índices.

Triplete de índices:

Para la declaración: TIPO, DIMENSION (d1[,d2]…):: nombre_array

La sintaxis general de una sección especificada con tripletes de índices es: nombre_array (tripl1, [tripl2]…)

La sintaxis general de un triplete es: [indice_inicial_tripl] : [indice_final_tripl] [: paso_tripl]

El triplete en una dimensión dada especifica un subconjunto ordenado de índices del array nombre_array para esa dimensión, empezando con indice_inicial y acabando con indice_final con incrementos dados por el valor de paso.

Si indice_inicial no aparece, su valor es el índice del primer elemento del array.Si indice_final no aparece, su valor es el índice del último elemento del array.Si paso no aparece, su valor por defecto es 1.

Page 17: Fortran5 Arrays

Ejemplo de uso de tripletes

Triplete de índices:

Para la declaración: TIPO, DIMENSION (d1[,d2]…):: nombre_array

La sintaxis general de una sección especificada con tripletes de índices es: nombre_array (tripl1, [tripl2]…)

La sintaxis general de un triplete es: [indice_inicial_tripl] : [indice_final_tripl] [: paso_tripl]

• De una matriz de 2x4, escribir los elementos de las dos filas que corresponden a las columnas impares.

Page 18: Fortran5 Arrays

Subconjuntos de arrays definidos por vectores de índices

Un vector de índices es un array entero unidimensional que especifica los elementos de un array a usar en un cálculo.

• Los elementos del array se pueden especificar en cualquier orden y pueden aparecer más de una vez.

INTEGER, DIMENSION (5) :: v_indices =(/ 1,6,3,4,6 /)REAL, DIMENSION (8) :: v =(/ -1.,2.,3.3,4.0,-5.5,0,-7.0,8.8 /

En este caso, la sección del array no puede aparecer a la izquierda de una sentencia de asignación pues ello significaría que dos o más valores diferentes tendrían que ser asignados al mismo elemento del array.

Ejemplo 1:

v(v_indices) especifica los valores de los elementos v(1), v(6), v(3), v(4) y v(6), es decir, -1. 0 3.3 4.0 0.

Ejemplo 2:

De una matriz de 2x4, escribir los elementos de la primera fila que corresponden a las posiciones 1, 2, 3 y 4.

Page 19: Fortran5 Arrays

Construcción WHERE I

La construcción WHERE permite realizar asignaciones y cálculos, sólo sobre determinados elementos de uno o más arrays. Para ello, esta construcción trabaja con la ayuda de un filtro o máscara formada por un array lógico en la propia sentencia WHERE.

La sintaxis general similar a la de un bloque IF:

Expresión máscara es un array lógico del mismo perfil que los arrays manipulados en las sentencias de asignación de arrays de los bloques.

Puede haber cualquier número de cláusulas ELSEWHERE con máscara y, a lo sumo, una cláusula ELSEWHERE.

[nombre:] WHERE (expresión máscara 1)bloque 1 de sentencia(s) de asignación de arrays

[ELSEWHERE (expresión máscara 2) [nombre]bloque 2 de sentencia(s) de asignación de arrays]…

[ELSEWHERE [nombre]bloque n de sentencia(s) de asignación de arrays]

END WHERE [nombre]

Funcionamiento:• Se aplica la operación o conjunto de operaciones del bloque 1 a todos los elementos del arraypara los cuales la expresión máscara 1 es cierta.• Se aplica la operación o conjunto de operaciones del bloque 2 a todos los elementos del arraypara los cuales la expresión máscara 1 es falsa y la expresión máscara 2 es cierta.• Se repite el razonamiento anterior para todas las cláusulas ELSEWHERE con máscara que haya.• Finalmente, se aplica la operación o conjunto de operaciones del bloque n a todos los elementos del array para los cuales todas las expresiones máscara anteriores han sido falsas.

Page 20: Fortran5 Arrays

Construcción WHERE II

Ejemplo: Calcular la raíz cuadrada de los elementos positivos de un array. Poner un cero en el resto de los elementos.

De otro modo, combinando dos bucles anidados con un bloque IF:

La expresión máscara mati>0 produce un array lógico cuyos elementos son cierto cuando los elementos correspondientes de mati son positivos y falso cuando los elementos correspondientes de mati son negativos o cero.

REAL, DIMENSION (5,4) :: mati, matf…WHERE (mati>0)

matf=SQRT(mati)ELSEWHERE

matf=0END WHERE

recorre_filas: DO i=1,5recorre_columnas: DO j=1,4

elemento_positivo: IF (mati(i,j)>0) THENmatf(i,j)=SQRT(mati(i,j))

ELSEmatf(i,j)=0

ENDIF elemento_positivoEND DO recorre_columnas

END DO recorre_filas

La construcción WHERE es generalmente más elegante que las operaciones efectuadas elemento a elemento, especialmente con arrays multidimensionales.

Page 21: Fortran5 Arrays

Sentencia WHERE

Es el caso particular más simple de una construcción WHERE.

Sintaxis general:

La sentencia de asignación se aplica sólo sobre aquellos elementos del arraypara los cuales la expresión máscara es cierta.

WHERE (expresión máscara) sentencia de asignación de arrays

Ejemplo: Calcular la raíz cuadrada de los elementos positivos de un array dejando igual el resto de sus elementos.

Page 22: Fortran5 Arrays

Construcción FORALLAparece en Fortran 95 para realizar un conjunto de operaciones efectuadas elementoa elemento sobre un subconjunto de elementos de un array.

Sintaxis general:

Los valores de cada índice se especifican mediante un triplete de la forma ya conocida � [ind_inicial_tripl] : [ind_final_tripl] [: paso_tripl].

La sentencia o sentencias que forman el cuerpo de la estructura se ejecutan sólo sobre aquellos elementos del array que cumplen las restricciones de índices y la expresión lógica dada en la cláusula FORALL.

[nombre:] FORALL (ind1=tripl1 [,ind2=tripl2]…[,expresión lógica])sentencia1[sentencia2]…

END FORALL [nombre]

Ejemplo: calcular el inverso de cada elemento perteneciente a la diagonal principal de una matriz de 7x7 evitando las divisiones por cero.

REAL, DIMENSION (7,7) :: mat…FORALL (i=1:7, mat(i,i)/=0)mat(i,i)=1./mat(i,i)

END FORALL

recorre_diagonal: DO i=1,7IF (mat(i,i)/=0) mat(i,i)=1./mat(i,i)

END DO recorre_diagonal

De otro modo, con un bucle DO iterativo y una instrucción IF:

Todo lo que se programa con una construcción FORALL se puede programar con un conjunto de bucles anidados combinado con un bloque IF.

Page 23: Fortran5 Arrays

Construcción FORALL IILa diferencia entre el uso de la construcción FORALL o de bucles es que, mientras en los bucles las sentencias deben ser ejecutadas en un orden estricto, con la construcción FORALL pueden ser ejecutadas en cualquier orden, seleccionadas por el procesador.

Así, un computador con varios procesadores en paralelo puede repartir las sentencias entre ellos optimizando la velocidad de cálculo.

Cuando el cuerpo de la estructura FORALL contiene más de una sentencia, el computador procesa completamente todos los elementos involucrados en cada una de ellas antes de pasar a la siguiente.

Como debe ser posible que cada elemento sea procesado de forma independiente, no pueden usarse funciones cuyo resultado dependa de los valores de un array completo (funciones transformacionales).

FORALL (ind1=tripl1 [,ind2=tripl2]…[,expresión lógica]) sentencia

Es el caso particular más simple de una construcción FORALL.

REAL, DIMENSION (7,7) :: mat…FORALL (i=1:7, j=1:7,mat(i,j)/=0)mat(i,j)=SQRT(ABS(mat(i,j)))mat(i,j)=1./mat(i,j)

END FORALL

Sintaxis general:

La sentencia de asignación se aplica sólo sobre aquellos elementos del arraycuyos índices cumplen las restricciones y la expresión lógica dadas.

Sentencia FORALL

Ejemplo

Page 24: Fortran5 Arrays

Arrays dinámicosHasta aquí el tamaño de los arrays se ha especificado en las sentencias de declaración de tipo. El tamaño se fija en tiempo de compilación y a partir de entonces no se puede modificar. Se dice que estos son arrays estáticos.

Sería interesante que, para aprovechar eficazmente la memoria del computador, el programador pudiera asignar el tamaño de los arrays al ejecutar el programa.

A partir del Fortran 90, es posible usar arrays cuyo tamaño se fija en tiempo de ejecución, estos son los llamados arrays dinámicos.

Con ALLOCATABLE se declara que los arrays de la lista serán dimensionados dinámicamente. Cada una de sus dimensiones se declara con dos puntos (:), sin especificar sus límites.

TIPO, ALLOCATABLE, DIMENSION (:[,:]…):: lista_de_arrays

STAT= estado. Cualquier fallo en la localización de memoria causa un error en tiempo de ejecución, a menos que se use este parámetro. La variable entera estadodevuelve un cero si se ha conseguido reservar espacio suficiente en memoria, en otro caso devuelve un número de error que depende del compilador.

Esta instrucción asigna memoria en tiempo de ejecución para la lista de arrayspreviamente declarada con el atributo ALLOCATABLE. Establece para cada arraysu tamaño, con los límites inferior y superior de cada dimensión.

Para asignar memoria en tiempo de ejecución a los arrays dinámicos se usa la sentencia ALLOCATE, en la que se especifican los tamaños. Su sintaxis es:

Sintaxis general:

ALLOCATE ( arr1( d1 [ ,d2] ... ) [, arr2( d1 [ ,d2]] ...) [,STAT=estado] )

Page 25: Fortran5 Arrays

Arrays dinámicos II

A partir de su ejecución, los arrays relacionados ya no juegan ningún papel y se libera su espacio de memoria que queda disponible para realizar nuevas reservas de espacio.

DEALLOCATE (lista_de_arrays [, STAT=estado])

Sintaxis general:

INTEGER ::estado_reserva, estado_liberaREAL, ALLOCATABLE, DIMENSION (:,:) :: alfa,beta…ALLOCATE (alfa(1:100, -1:200), STAT=estado_reserva)IF (estado_reserva/=0) STOP ‘array alfa NO guardado en memoria’…DEALLOCATE (alfa, STAT= estado_libera)IF (estado_libera/=0) STOP ‘NO liberada memoria para array alfa’ALLOCATE (beta(1:1000, 200), STAT=estado_reserva)IF (estado_reserva/=0) STOP ‘array beta NO guardado en memoria’…

Ejemplo:

Asignar y liberar espacio de memoria para arrays es útil en programas grandes con necesidades grandes de memoria. Para liberar espacio se utiliza la instrucción DEALLOCATE-

Cualquier fallo al intentar liberar la memoria causa un error en tiempo de ejecución, a menos que el parámetro STAT= estado esté presente. La variable estado devuelve un cero si la liberación de memoria se hizo con éxito, en otro caso devuelve un número de error que depende del compilador.

Page 26: Fortran5 Arrays

Ejercicio resuelto 1

1.- Pedir cinco números por teclado y calcular su media usando un vector para almacenar los números.

Los cinco números pueden guardarse en cinco variables o en un vector de 5 componentes. Lógicamente, la utilidad de un vector aumenta cuantos más números tengamos que almacenar.

Para contener los números puede declararse únicamente una variable (como se hizo en el capítulo anterior). Almacenar en memoria los cinco números estaría justificado si se necesitaran sus valores en operaciones posteriores.

Page 27: Fortran5 Arrays

Ejercicio resuelto 2

2.- Calcular y presentar en pantalla los valores de los elementos 3 a N (100 como máximo) de la sucesión: X

i=X

i-1+ 3X

i-2+ 4 / 3. El programa leerá por teclado los

valores de N, X1y X

2.

Un bucle controla que el usuario escribe un valor para N menor o igual que el máximo, 100. También ha de ser mayor o igual que 3, pues sólo se pueden calcular términos a partir del tercero.

Se dimensiona el vector X a 100 componentes, valor máximo que pide el ejercicio. De este modo, se reserva el máximo espacio en memoria que se puede ocupar, aunque generalmentesobre.

Page 28: Fortran5 Arrays

Ejercicio resuelto 3

3.- Buscar un número en un vector de seis elementos de valores desordenados. Introduce los valores del vector en la propia sentencia de declaración de tipo.

El bucle DO iterativo permite recorrer todas las componentes del vector y mostrar todas las posiciones del mismo en que encuentra el valor buscado X, si las hay.

Cuando el valor buscado no coincide con ninguna componente del vector, la variable interruptor o switch tendrá el valor cero y sirve de “chivato” para recordar este hecho.

Page 29: Fortran5 Arrays

Ejercicio resuelto 4

4.- Realizar la búsqueda de un número en un vector. Reducir la búsqueda a encontrar la primera posición del array en que se encuentra coincidencia. Si no existe el número en el array, mostrar un mensaje en consecuencia.

La sentencia EXIT del bucle WHILE permite reducir la búsqueda a la primera coincidencia en el vector.

Page 30: Fortran5 Arrays

Ejercicio resuelto 5

5.- Buscar un número en un vector de siete componentes ordenado ascendentemente. Introduce el vector en la propia sentencia de declaración de tipo.

• Este algoritmo recorre todas las componentes del vector de izquierda a derecha hasta que, o bien llega a la última componente, o bien el valor buscado es inferior o igual a algún elemento del vector (pues está ordenado).

• El programa encuentra únicamente la primera posición del vector en que se halla el valor buscado, aunque éste aparezca repetido en varias posiciones del mismo.

Page 31: Fortran5 Arrays

Ejercicio resuelto 6

6.- Buscar un número en un vector de siete componentes ordenado ascendentemente. Introduce el vector en la propia sentencia de declaración de tipo. Usa el algoritmo de la búsqueda binaria o dicotómica.

• La búsqueda dicotómica es un algoritmo más eficiente que el anterior. Aquí la búsqueda se realiza siempre en la componente central de un vector cuya longitud se va reduciendo a la mitad izquierda o derecha del centro (según sea el número) sucesivamente hasta que, o bien encontramos el valor buscado, o bien el intervalo de búsqueda se ha reducido a una componente.

Page 32: Fortran5 Arrays

Ejercicio resuelto 7 (algoritmo)

7.- Ordenar ascendentemente las seis componentes de un vector. Usar el método de la burbuja. ...

mayor valor colocado

Se repite el proceso con el conjunto que queda y así sucesivamente

...

...

Page 33: Fortran5 Arrays

Ejercicio resuelto 7 (solución)

7.- Ordenar ascendentemente las seis componentes de un vector. Usar el método de la burbuja.

• Este algoritmo usa dos bucles DO iterativos anidados.

• El bucle externo controla el número de parejas consideradas en el tratamiento.

• El bucle interno controla la pareja evaluada.

• El bloque IF comprueba si la pareja esta ordenada de forma ascendente e intercambia sus valores en caso contrario.

• Al terminar el bucle interno estará bien ubicado el mayor de los elementos considerados.

•Por ello, en la siguiente iteración del bucle externo ya no se considera este valor.

• Para ordenar el vector descendentemente (de mayor a menor) basta cambiar el operador relacional “mayor que” (>) por “menor que” (<) en el código del programa.

Page 34: Fortran5 Arrays

Ejercicio resuelto 8

8.- Leer una matriz de 2 filas y 3 columnas por teclado y mostrarla por pantalla.

• El interés del ejercicio radica en conocer cómo se almacenan las matrices en memoria.

• Por defecto, las matrices almacenan sus componentes en posiciones de memoria consecutivas por columnas.

• El nombre de la matriz es un puntero a la primera componente, es decir, es una variable que almacena la dirección de memoria de la primera componente de la matriz.

• LOC(arg) es una función intrínseca que recibe como argumento una variable de cualquier tipo o elemento de array y devuelve la dirección de memoria en la que está almacenado.

4 bytes por cada entero

Page 35: Fortran5 Arrays

Ejercicio resuelto 9

9.- Inicializar las componentes de una matriz de 2x3 en su sentencia de declaración de tipo a

• La función intrínseca RESHAPE se utiliza para inicializar el arraybidimensional ar. Se comprueba que la carga de los valores de la matriz se realiza por columnas.

321

321ar =

Page 36: Fortran5 Arrays

Ejercicio resuelto 10

10.- Buscar un número en una matriz desordenada de tres filas y cinco columnas (3x5). Leer la matriz con un bucle implícito anidado.

• El algoritmo de búsqueda utilizado es el mismo que el del ejercicio CAP4_4.

Page 37: Fortran5 Arrays

Ejercicio resuelto 1111.- Calcular el vector suma de 3 vectores de 4 componentes conocidas y el módulo del vector suma, escribiendo los resultados por pantalla.

• ¿Cómo cambia el programa si el número de componentes de los vectores es 5?. Gracias al atributo PARAMETER usado para especificar la dimensión de los vectores en el programa, el único cambio que hay que hacer en el código es sustituir 4 por 5 en esa sentencia.

•Para calcular el vector suma de un número grande de vectores, se puede seguir el mismo procedimiento que en este ejercicio. Sin embargo, es más práctico usar una matriz bidimensional en la que cada fila o cada columna de la misma sea uno de los vectores a sumar.

Page 38: Fortran5 Arrays

Ejercicio resuelto 12

12.- Calcular el vector suma de 3 vectores de 4 componentes conocidas y el módulo del vector suma, escribiendo los resultados por pantalla. Utilizar una matriz para almacenar los 3 vectores.

• Notar que el vector suma juega el papel de un acumulador, de ahíque sea necesario inicializarlo antes de que aparezca en la sentencia de asignación en el siguiente bucle.

• Recordar que en Fortran el orden de cierre de los bucles es inverso al orden de apertura de los mismos.

Page 39: Fortran5 Arrays

Ejercicio resuelto 13

13.- Calcular la suma de dos matrices de 3 filas y 2 columnas (3x2) y escribir el resultado por pantalla.

•Para evitar corregir el atributo PARAMETER cada vez que cambien las dimensiones de las matrices, teniendo que compilar el nuevo programa, un truco puede ser reservar más espacio en memoria del necesario habitualmente.

•En este ejercicio, tanto la lectura de las matrices, como el cálculo de la matriz suma se ha realizado por filas. Repite el ejercicio trabajando por columnas.

•Para sumar un número grande de matrices bidimensionales podríamos usar el mismo procedimiento que en este ejercicio. Sin embargo, es más práctico usar un array tridimensional en el que la tercera dimensión se corresponda con el número de matrices bidimensionales a sumar. Por ejemplo, para sumar 15 matrices de 3X2, declarar un array de dimensiones (3,2,15). Gráficamente, equivale a imaginar 15 planos en cada uno de los cuales tenemos una matriz de 3X2. Repite la segunda versión del ejercicio trabajando con secciones dearrays.

Page 40: Fortran5 Arrays

Ejercicio resuelto 14 (formulación)

14.- Calcular el producto de dos matrices de n x m y m x l y escribir la matriz producto por pantalla.

11 12 1

21 22 2

1 2

...

...

... ...

...

m

m

ik

n n nm

A A A

A A A

A

A A A

11 12 1

21 22 2

1 2

...

...

... ...

...

l

l

kj

m m ml

B B B

B B B

B

B B B

11 12 1

21 22 2

1 2

...

...

... ...

...

l

l

ij

n n nl

P P P

P P P

P

P P P

=

1

k m

ij ik kj

k

P A B=

=

= ×∑

x

Page 41: Fortran5 Arrays

Ejercicio resuelto 14

14.- Calcular el producto de dos matrices de N x M y M x L y escribir la matriz producto por pantalla. Las matrices son:

• Recuerda que la inicialización de matrices se hace por columnas por defecto.

• Notar que la matriz PROD juega el papel de un acumulador, puesto que cada elemento se calcula como una suma de productos. Por esta razón, es imprescindible inicializar esta matriz en el bucle con índice j antes de entrar al bucle con índice k.

=

321

3211MAT

−−

−−

−−

=

63

52

41

2MATy

Page 42: Fortran5 Arrays

Ejercicio resuelto 14 (organigrama)

14.- Calcular el producto de dos matrices de N x M y M x L y escribir la matriz producto por pantalla.

i ≤≤≤≤ Ni = 1

i= i + 1

.FALSE. .TRUE.

j ≤≤≤≤ Lj = 1

j = j + 1

.TRUE.

.FALSE.

k ≤≤≤≤ Mk = 1

k = k + 1

.TRUE.

prod(i,j) = prod(i,j) + mat1(i,k)* mat2(k,j)

.FALSE.

prod(i,j) = 0

Page 43: Fortran5 Arrays

Ejercicio resuelto 15

15.- Calcular la media de NUM números. Usar un vector para almacenarlos, el cual se dimensiona dinámicamente en tiempo de ejecución.

• ALLOCATABLE es el atributo que declara que elarray VECTOR serádimensionado dinámicamente. Se trata de un arrayunidimensional puesto que sólo aparece una vez el carácter “:”.

• ALLOCATE dimensiona dinámicamente el arrayVECTOR, previamente declarado con el atributo ALLOCATABLE. Establece los límites inferior y superior de su dimensión.

•DEALLOCATE libera la memoria para el arrayVECTOR, reservada previamente en la sentencia ALLOCATE.