You are on page 1of 10

.

LENGUAJE DE PROGRAMACION FORTRAN 90 PARA WINDOWS


ESTRUCTURAS DE REPETICIN ANIDADAS
1.- INTRODUCCIN:
A veces se necesita elaborar programas donde involucre un proceso repetitivo controlado por uno o mas ndices,
generalmente se dan en fusiones que involucren dos o mas variables el cual irn cambiando de valores, es por esta
razn que debemos tener cuidado a la hora de programar este tipo de procedimientos anidados.

2.- PROCEDIMIENTO:
Un bucle puede estar contenido completamente dentro de otro bucle. En este caso, se dice que ambos bucles estn anidados.
Cuando dos bucles estn anidados, el bucle interno se ejecuta completamente para cada iteracin del bucle externo. Es decir,
el ndice del bucle interno toma todos los valores posibles permitidos por su condicin de desigualdad para cada uno de los
valores posibles del ndice del bucle externo permitidos por su condicin de desigualdad.
Los bucles anidados se cierran en orden inverso a cmo se abren. As, cuando el compilador encuentra una sentencia END DO,
asocia esa sentencia con el bucle ms interno abierto.
Es conveniente asignar nombres a todos los bucles anidados para que sean ms fciles de comprender y de localizar los errores
de compilacin.
Los ndices de bucles anidados deben tener identificadores distintos.
Si aparecen sentencias CYCLE o EXIT sin nombre en bucles anidados, stas se asocian por defecto con el bucle ms interno
abierto. Para evitar asociaciones automticas no deseadas, es conveniente escribir las sentencias CYCLE o EXIT con nombre,
que ser el mismo que el dedicado al cabecero y fin del bucle involucrado.

Sintaxis general de dos bucles anidados DO general con nombre aadido y sin nombre:
[externo:] DO
bloque_de_sentencias1 DO
[IF (expresin_lgica) CYCLE [externo]] bloque_de_sentencias1
bloque_de_sentencias2 [IF (expresin_lgica) CYCLE]
IF (expresin_lgica) EXIT [externo] bloque_de_sentencias2
bloque_de_sentencias3 IF (expresin_lgica) EXIT o]
[interno:] DO bloque_de_sentencias3
bloque_de_sentencias4 [interno:] DO
[IF (expresin_lgica) CYCLE [interno]] bloque_de_sentencias4
bloque_de_sentencias5 [IF (expresin_lgica) CYCLE [interno]]
IF (expresin_lgica) EXIT [interno] bloque_de_sentencias5
bloque_de_sentencias6 IF (expresin_lgica) EXIT [interno]
END DO [interno] bloque_de_sentencias6
bloque_de_sentencias7 END DO [interno]
END DO [externo] bloque_de_sentencias7
END DO [externo]

Otras formas:
A.- Do estructurado: Cuando se conoce el numero de repeticiones de un proceso o procesos
DO indice1 = Valor_inicial_1, Valor_final_1, Paso1
DO indice2 = Valor_inicial_2, Valor_final_2, Paso2
Sentencia(s)
END DO
END DO

Donde Indice1, Indice2 son variables de tipo entero


Valor_inicial_1, Valor_final_1, Paso1, Valor_inicial_2, Valor_final_2, Paso2, son valores de tipo entero que indica el valor
inicial del proceso de repeticin hasta el ultimo valor que indica el valor final generalmente de uno en uno (Paso)

B.- DO WHILE ANIDADO


DO WHILE (CONDICION1)
DO WHILE (CONDICION2)
Sentencia(s)
END DO
END DO
Nota: debe repasar los puntos dados para hacer uso de estas estructura anidada.

EJEMPLOS DE BUCLES ANIDADOS


1.-En este programa visualizamos los valores de las variables ndice y al final de cada ciclo interior completado muestra
un mensaje Hola
Program ejemplo1 2 6
implicit none 2 7
2 8
integer:: n, i
Hola
Do n=2,4 3 6
Do i=6,8 3 7
print*, n, i 3 8
End Do Hola
print*,"Hola" 4 6
End Do 4 7
4 8
End Program ejemplo1
Hola
Press any key to continue
1
2.-En el siguiente programa observaremos que la variable suma se ajusto a 0 para cada valor nuevo de n, mientras que la
variable cuenta se ajusto a 0 una sola vez antes de los ciclos anidados.
Program ejemplo2
implicit none n es: 2
integer::cuenta,n,i,suma Suma es: 21
cuenta=0 n es: 3
Do n=2,4 Suma es: 21
print*,"n es: ",n n es: 4
suma=0 Suma es: 21
Do i=6,8 Cuenta es: 9
suma=suma+i Press any key to continue
cuenta=cuenta+1
End Do
print*,"Suma es: ",Suma
End Do
Print*,"Cuenta es: ", cuenta
End program ejemplo2


3.-Elaborar un programa que calcule la suma de la serie:
= para x=0.1,0.2,0.3,,1.0
!
Program ejemplo3
Implicit none 0.1000000 1.105171
Integer:: fact, n 0.2000000 1.221403
real::X, suma 0.3000000 1.349859
X=0.0 0.4000000 1.491825
Do while (X<=1.0) 0.5000000 1.648721
X=X+0.1 0.6000000 1.822119
Suma=1.0 0.7000000 2.013753
Fact=1 0.8000001 2.225541
N=1 0.9000001 2.459603
Do 1.000000 2.718282
Fact=Fact*N Press any key to continue
Suma=Suma+(x**N)/Fact
N=N+1
if (n>10) exit
end do
print*,x, suma
end do
end program ejemplo3

4.-Elabore un programa en Fortran que tabule la siguiente funcin usando sentencias Do, para controlar cualquier
( )
proceso iterativo. (, ) = , para x = 0, 1, 2, 3, 4 e y = 3, 5, 7, 9, 11 para cada valor de x,
( + )

Program Ejemplo4 0.0000000E+00 3.000000 -1.000000


Implicit none 0.0000000E+00 5.000000 -1.000000
0.0000000E+00 7.000000 -1.000000
Real::x, y, fxy 0.0000000E+00 9.000000 -1.000000
Integer::I,J 0.0000000E+00 11.00000 -1.000000
Do I=1,5 1.000000 3.000000 -0.8000000
1.000000 5.000000 -0.9230769
x=I-1 1.000000 7.000000 -0.9600000
Do J=3,11,2 1.000000 9.000000 -0.9756098
y=j 1.000000 11.00000 -0.9836066
2.000000 3.000000 -0.3846154
fxy=(x**2-y**2)/(x**2+y**2) 2.000000 5.000000 -0.7241379
print*,x, y, fxy 2.000000 7.000000 -0.8490566
End DO 2.000000 9.000000 -0.9058824
2.000000 11.00000 -0.9360000
read* 3.000000 3.000000 0.0000000E+00
End Do 3.000000 5.000000 -0.4705882
End program Ejemplo4 3.000000 7.000000 -0.6896552
3.000000 9.000000 -0.8000000
3.000000 11.00000 -0.8615385
4.000000 3.000000 0.2800000
4.000000 5.000000 -0.2195122
4.000000 7.000000 -0.5076923
4.000000 9.000000 -0.6701031
4.000000 11.00000 -0.7664233
Press any key to continue

5.-Escribir un programa para producir todos los tringulos rectngulos que tiene los tres lados de longitud enteras (y
cuyos permetros son menores que 100) adems visualice el total de triangulo.
Program ejemplo5
Integer::A, B, C, N !N variable que nos dar el total de tringulos rectngulos
Real::D
N=0
A=1
DO
B=A+1
2
DO
D=A**2+B**2
3 4 5
5 12 13
C=SQRT(D) 6 8 10
IF ((A+B+C)>100) EXIT 7 24 25
IF (C**2==A**2+B**2) THEN 8 15 17
PRINT*,A,B,C 9 12 15
N=N+1 9 40 41
10 24 26
END IF
12 16 20
B=B+1 12 35 37
IF (B>100) EXIT 15 20 25
END DO 15 36 39
A=A+1 16 30 34
IF (A>100) EXIT 18 24 30
END DO 20 21 29
PRINT*,"TOTAL DE TRIANGULOS RECTANGULOS= ", N 21 28 35
24 32 40
END PROGRAM ejemplo5
TOTAL DE TRIANGULOS RECTANGULOS= 17
Press any key to continue

6.- Calcular la siguiente funcin usando sentencias DO para controlar cualquier proceso iterativo: (, ) =
( ++ )
, para x = 3,4,5,6,7 e y=0,1,2,3,4,5 para cada valor de x.
(+)
Program ejemplo6
3.000000 0.0000000E+00 3.000000
Implicit none
3.000000 1.000000 4.750000
Real::x, y, z, fxy 3.000000 2.000000 11.00000
Integer::i,j 3.000000 4.000000 -17.00000
!Usando la sentencia Do estructurado 3.000000 5.000000 -10.75000
Do i=3,7 4.000000 0.0000000E+00 9.333333
x=i 4.000000 1.000000 14.50000
Do j=1,6 4.000000 2.000000 32.00000
4.000000 4.000000 -44.00000
y=j-1
4.000000 5.000000 -26.50000
!Asignando el valor del denominador a otra variable 6.000000 0.0000000E+00 -18.00000
z=x*y-5*y-3*x+15 6.000000 1.000000 -27.50000
if (z==0) cycle Evaluamos el denominador 6.000000 2.000000 -58.00000
fxy=(x**2+3*x+y**2)/z 6.000000 4.000000 70.00000
print*,x, y, fxy 6.000000 5.000000 39.50000
End Do 7.000000 0.0000000E+00 -11.66667
7.000000 1.000000 -17.75000
End Do
7.000000 2.000000 -37.00000
End Program ejemplo6 7.000000 4.000000 43.00000
7.000000 5.000000 23.75000
Press any key to continue


7.- Computar el nmero de puntos con coordenadas enteras contenidas dentro de la elipse: + =

Program ejemplo7
Implicit none -3.000000 -3.000000 0.0000000 1.000000
-3.000000 -2.000000 0.0000000 2.000000
Real::x,y !Coordenadas de los puntos -3.000000 -1.000000 0.0000000 3.000000
Integer::i, j, n -3.000000 0.0000000 0.0000000 4.000000
!Resolviendo la ecuacion de la elipse -3.000000 1.000000 1.000000 -4.000000
-3.000000 2.000000 1.000000 -3.000000
!observamos que x varia de -4 a 4 -3.000000 3.000000 1.000000 -2.000000
!y la ordenada y varia de -5 a 5 -2.000000 -4.000000 1.000000 -1.000000
n=0 -2.000000 -3.000000 1.000000 0.0000000
-2.000000 -2.000000 1.000000 1.000000
Do i=1,9 -2.000000 -1.000000 1.000000 2.000000
x=i-5 -2.000000 0.0000000 1.000000 3.000000
Do j=1,11 -2.000000 1.000000 1.000000 4.000000
-2.000000 2.000000 2.000000 -4.000000
y=j-6 -2.000000 3.000000 2.000000 -3.000000
if ((x**2/16.0+y**2/25.0)>=1.0) cycle -2.000000 4.000000 2.000000 -2.000000
n=n+1 -1.000000 -4.000000 2.000000 -1.000000
-1.000000 -3.000000 2.000000 0.0000000
Print*,x,y !Visualizamos las coordenadas -1.000000 -2.000000 2.000000 1.000000
End Do -1.000000 -1.000000 2.000000 2.000000
End Do -1.000000 0.0000000 2.000000 3.000000
-1.000000 1.000000 2.000000 4.000000
Print*,n !Total de puntos interiores de la elipse -1.000000 2.000000 3.000000 -3.000000
End Program ejemplo7 -1.000000 3.000000 3.000000 -2.000000
-1.000000 4.000000 3.000000 -1.000000
0.0000000 -4.000000 3.000000 0.0000000
0.0000000 -3.000000 3.000000 1.000000
0.0000000 -2.000000 3.000000 2.000000
0.0000000 -1.000000 3.000000 3.000000
0.0000000 0.0000000 59
Press any key to continue

3
PROBLEMAS DIVERSOS USANDO ESTRUCTURAS DE REPETICION

1.- Escriba un programa que permita la lectura de 6 nmeros enteros, calcule el promedio e imprima el promedio.
program promedios
Integer::I,A,S Ingrese 6 numeros enteros a promediar
Real::p 10
s=0 15
print*, "Ingrese 6 numeros enteros a promediar" 12
Do I=1,6 14
read*, a 13
s=s+a 11
End Do Promedio= 12.00000
p=s/6 Press any key to continue
print*, "Promedio= ", p
end program promedios

10. Elabore un programa que permita el ingreso de 6 nombres de personas y el sexo respectivo (.T. Para varn y .F. para mujer) y
visualice la cantidad de personas que corresponde a su respectivo sexo.

Program total
Character(len=8)::Nombre ingrese los 6 nombres con su respectivo sexo
Logical::Sexo "Maria" .F..
Integer::I "Pedro" .T.
integer::m=0, f=0 "Luis" .T.
print*, "Ingrese los 6 nombres con su respectivo sexo" "Rosa" .F.
Do i=1,6 "Juan" .T.
read*, nombre, sexo "Carlos" .T.
if(sexo) m= m+1 Total de personas de sexo masculino 4
if(.not.sexo) f=f+1 Total de personas de sexo femenino 2
End Do Press any key to continue
print*,"Total de personas de sexo masculino",m
print*,"Total de personas de sexo femenino",f
End program total

3.- Utilizando la sentencia DO, escriba un programa que imprima una tabla de cuadrados y cubos del 1 al 10 inclusive.
Program potencias
Integer::x=1, y, z NUMERO CUADRADO CUBO
Print*," NUMERO CUADRADO CUBO" 1 1 1
2 4 8
Do while(x<=10)
3 9 27
y=x**2 4 16 64
z=x**3 5 25 125
Print*,x, y, z 6 36 216
x=x+1 7 49 343
End do 8 64 512
End program potencias 9 81 729
10 100 1000
Press any key to continue

4.- Elabore un programa que utilizando la sentencia DO, imprima una tabla de cuadrados para los nmeros pares del 4 al 30, ambos
inclusive.
Program varios 4 16
6 36
Integer::x=4, y 8 64
Do 10 100
y=x**2 12 144
14 196
Print*,x,y 16 256
x=x+2 18 324
If(x>30) Exit 20 400
22 484
End do 24 576
End Program varios 26 676
28 784
30 900
Press any key to continue

5. Elaborar un programa que permita ingresar por teclado, el nombre y el turno de 10 alumnos (m=maana, t=tarde, n=noche) y luego
averiguar cuntos alumnos estudian en cada turno.
Ingrese los datos
Program N_turnos "Rosa Maria" "m"
Integer::a, b, c, i !a,b,c contabiliza el total de cada turno "Pedro Jos" "n"
Character (len=50)::nombre "Mario" "t"
"Elena" "m"
Character (len=1)::turno !m=maana, t=tarde, n=noche "Nelly" "n"
a=0; b=0; c=0 "Juan" "t"
Print*, "Ingrese los datos" "Rosario" "m"
"Carlota" "t"
Do i=1,10 "Maria Pia" "n"
Read*, nombre, turno "Saul" "m"
if(turno=="m") a=a+1 estudian en la maana: 4
estudian en la tarde: 3
estudian en la noche: 3 4
Press any key to continue
if(turno=="t") b= b+1
if(turno=="n") c=c+1
End Do
Print*,"estudian en la maana:",a
Print*,"estudian en la tarde:",b
Print*,"estudian en la noche:",c
End Program N_turnos

1 1 1 1
6.-. Escriba un programa que calcule la suma: =1+ + + +
2 3 4 50
Program suma_serie
Real::s
La suma de la serie = 4.499206
s=0
Press any key to continue
Do i=1,50
s=s + 1.0/i
End Do
Print*,"La suma de la serie = ", s
End Program suma_serie

7.- La suma de los cuadrados 1+4+9+16+25+ en cierto momento es arriba de 1000. Escriba un programa para encontrar un entero
cuyo cuadrado hace que la suma pase de 1000 y que despliegue la suma en ese momento.
Program suma_cuadrados
Integer::s, n, i la suma es: 1015
s=0 el ultimo numero es: 14
Do i=1,50 Press any key to continue
s=s+i**2
If(s>1000) then
n=i
exit
End If
End Do
print*,"la suma es:",s
print*,"el ultimo numero es:",n
End Program suma_cuadrados

1 2 3 4
8.- Elaborar un programa que calcule la suma de: = + + + +
2 22 23 24 2
Program suma
Integer::i, n Ingrese el valor de n
Real::s=0.0 30
Print*, "Ingrese el valor de n" la suma de la serie: 2.000000
Read*,n Press any key to continue
Do i=1, n
s=s+i*1.0/2**i
Ingrese el valor de n
End Do
32
Print*,"la suma de la serie: ",s
la suma de la serie: Infinity
End Program suma
Press any key to continue

Por qu cuando N es 32 sale infinito u overflow?

9.-Elabore un programa que permita el ingreso de 5 numeros enteros positivos de tal forma que de acuerdo a la cantidad numrica
ingresada visualice si el numero es par o impar use do condicional
Program condicional
Visualizando si un numero es par o impar
Integer:: x
Ingrese un numero
print*, "Visualizando si un numero es par o impar" 10
i=0 x es par
Do Ingrese un numero
12
Print*, Ingrese un numero x es par
read*,x Ingrese un numero
if (mod(x,2)==0) print*, "x es par" 13
x es impar
if (mod(x,2) /=0) print*, "x es impar"
Ingrese un numero
i=i+1 14
If (i>=5) Exit x es par
End Do Ingrese un numero
1
End Program condicional x es impar
Press any key to continue

10.-Elaborar un programa que determine la cantidad de numeros pares e impares ingresados por teclado, el programa debe leer 6
numeros enteros positivos
Program n_pares_impares
integer::x, i, par, jimpar
i=0
jpar=0
5
jimpar=0
Do
Print*, "Ingrese un numero entero positivo"
read*,x
If (MOD(x,2)==0) Then Ingrese un numero entero positivo
jpar=jpar+1 3
Ingrese un numero entero positivo
End If
5
If (MOD(x,2)/=0) Then Ingrese un numero entero positivo
jimpar=jimpar+1 7
Endif Ingrese un numero entero positivo
i=i+1 1
If (i>=6) Exit Ingrese un numero entero positivo
End Do 2
Ingrese un numero entero positivo
Print*,"total de numero impares ingresados ",jimpar
4
Print*,"total de numero pares ingresado", jpar total de numero impares ingresados 4
End Program n_pares_impares total de numero pares ingresado 2
Press any key to continue

ESTRUCTURAS DE DATOS :

Estructuras Simple: Arrays Arreglos:

Arreglo: Es un conjunto finito y ordenado de elementos homogneos (mismo tipo de dato).

Finito: Siempre ser necesario especificar el nmero de elementos que tiene el arreglo.
Ordenado: Qu sea posible identificar el primero, segundo,..n-simo elemento del arreglo.
Homogneo: todos los elementos son del mismo tipo.
Se almacenan normalmente en posiciones contiguas de la memoria a partir de una direccin inicial.

Arreglo Unidimensional Array Simple:


Indice o
Arreglo de una dimensin llamado tambin Vector o lista. Subindice

X 1 2 3 4 N

Vector

Nombre
del Arreglo

Indice o subndice: Indica la posicin de cada elemento en el arreglo

Los valores en un arreglo se guardan en cada una de las celdas.

1 2 3 4 5 n
Nora Pedro Mara Juan
Vector

Para referenciar a una celda, se usa el Nombre del arreglo y el ndice que indica su posicin relativa dentro del arreglo.

Ejemplo:

Vector(4) hace referencia al contenido de la celda Juan

Caractersticas principales de un arreglo:


El menor valor de un ndice de un arreglo se denomina lmite inferior.
El mayor valor de un ndice de un arreglo se denomina lmite superior.
La cantidad de elementos en el arreglo se denomina rango.
En los arreglos, al ser de tamao finito y predefinido, no es posible incluir ni eliminar elementos, slo se puede
alterar los contenidos de un elemento.
Las primitivas bsicas para un arreglo son:
o Creacin
o Almacenamiento
o Extraccin (acceso)
Operacin Acceso. Se realiza a travs del nombre del arreglo y entre parntesis el valor del ndice.
6
Ejemplo: X(I)

Primitivas:
o Creacin de un arreglo; normalmente todos los lenguajes poseen una instruccin que permite crear un arreglo,
en donde se indica:
- Nombre del arreglo
- Nmero de ndices
- Rango para cada ndice
o Se asume que al momento de la creacin los valores contenidos en el arreglo no estan definidos. Ejemplo
Arreglo Vector Dimension[1..20]
o La operacin de almacenamiento acepta un arreglo A un ndice i y un valor x . el resultado es que el valor x
queda almacenado en la posicin i del arreglo A
o Se realiza usando el operador de asignacin y entregando un valor que ser guardada en una posicin del
arreglo.
Ejemplo: x[10] 524, almacena el valor 524 en la posicin 10 del arreglo.
o Antes de asignar un valor a un elemento del arreglo, su valor no est definido.
o La extraccin es una funcin que acepta el nombre del arreglo A y un ndice i y retorna el valor contenido en la
posicin i del arreglo A
o Se realiza a travs de una asignacin de valores:
Ejemplo: Nueva = X[4], donde el contenido de la posicin 4 del arreglo
se extrae y se almacena en la variable Nueva
o Cuando se usan arreglos se deben tomar los siguientes cuidados:
Dar valor inicial a los elementos del arreglo.
Especificar siempre el valor del ndice
Cuidar que los ndices no tomen valores fuera de su rango.

Ejemplos:
Almacenar los nombres de los alumnos
Almacenar para cada da el total de ventas
Almacenar la temperatura ms alta/baja del da
Almacenar el men semanal (plato principal)
Almacenar el gasto diario
Para cada da del mes almacenar el da (lunes, martes, etc)
Para un da realizar levantamiento de temperatura cada hora y almacenar el valor. Determine la temperatura ms
alta y ms baja del da.
Almacenar cada alumno y su nota. Determine el nombre del alumno con la nota ms alta y la mas baja.
Igualmente determine el promedio de notas.

Arreglos( Arrays) de dos dimensiones:( Matriz/Tablas)

Arreglos de dos dimensiones:

Sea la matriz B

B
1 2 3 4 .. N
1
2
3
.
. B(I,J)
.
M

Se puede considerar que un arreglo de dos dimensiones es un arreglo de una dimensin, en donde cada
elemento es a su vez otro arreglo.
Cada posicin en arreglo bidimensional pertenece a una fila y a una columna.
Para referenciar una posicin es un arreglo de dos dimensiones es necesario indicar adems del Nombre del
arreglo un ndice para la fila y otro para la columna.
Ejemplo: B[2,5]

PRIMITIVAS:

Creacin: se deber declarar el nombre del arreglo, y los rangos para las dos dimensiones.
Ejemplo: Arreglo B, Dimensin [1..10,1..20]
Almacenamiento se realiza asignando un valor a una determinada posicin del arreglo: B [5,8] Manuela
Es necesario tener la seguridad de que los valores usados para los ndices sean vlidos, es decir que estn entre
los valores lmites definidos para el arreglo.

7
Extraccin: Se realiza a travs del nombre del arreglo y entre parntesis el valor de los ndices, considerando que
el primero indica el nmero de fila y el segundo el nmero de columna del elemento. Ejemplo: VIEJA B[i,j]

Arreglo Multidimensional:

Plano 4

Plano 3

Plano 2
Plano 1
Fila 2
Fila 1
1 2 3 4 5 6 Columnas

Ejemplos:

Almacenar la temperatura cada hora para 30 das


Determine la temperatura mnima y mxima del mes
Almacene las notas de los 33 alumnos ( 4 notas por alumno). Calcular el promedio. Determine para cada
calificacin la nota ms alta y la ms baja.

Para usar un arreglo hay que declararlo en una sentencia DIMENSION, es necesario especificar:
El nombre del arreglo
El nmero de dimensiones
El rango (lmites) de cada dimensin

Sintaxis:

Dimension <Nombre_Arreglo> (Rango).

Tipo Nombre_Arreglo (Rango)

Nombre_Arreglo: Nombre del arreglo


Rango: Especifica el lmite inferior y superior para la dimensin. Se debe usar un rango para cada dimensin, se puede
usar hasta 7 (siete) dimensiones.

Ejemplo1:

DIMENSION Iarreglo (1:2,0:2)


Donde: Iarreglo es un arreglo de 2 filas (1 y 2) y tres columnas (0,1 y 2)
1. El lmite inferior: Debe ser una constante entera, puede ser negativa, cero o positiva. Por defecto su valor es 1
2. Lmite superior, constante entera, puede ser positiva, cero o negativa. Debe ser mayor o igual al lmite inferior.

Ejemplo2:

DIMENSION Iarreglo (2,0:2)


Es la misma declaracin del ejemplo1

Ejemplos de declaracin de Arrays:

1. REAL A(10,2,3) Declara arreglo real


2. DIMENSION A(10,2,3) Declara un arreglo
3. INTEGER M(10,10,10), K(-3:6,4:13,0:9) Declara arreglos M, K entero
4. REAL IMAN(10),B(10),AA(3,3) Declara tres arreglos reales

Ejemplo3

REAL A(3,3),B(3,3),C(89),R
B(2,2) = 4.5
R=7.0
C(INT( R )*2+1)=2.0 Elemento 15 de C = 2.0
A(1,2)=B(INT(C(15)),INT(SQRT(R)))
!Elemento A(1,2) = Elemento B(2,2) = 4.5

Ejemplo4

8
Plantear el pseudo cdigo para sumar dos matrices n X m
Dimension Nmat(1:10,1:20), Mmat(1:10,1:20), Nresult(1:10,1:20)
Read*, n,m
Do I = 1,n
Do J = 1,m
Nresult(I,J)=Nmat(I,J)+Nmat(I,J)
End do
End do

Expresiones Escalares:

Las expresiones pueden ser escalares o de arreglos. Son escalares si usan variables simples (no declaradas como arreglos)
Ejemplo5
Q + 2.3 + R, donde Q y R son variables simples.
Expresiones Arreglo:
Si tenemos:
DIMENSION A(10), B(10
Entonces:
A+B, C*D, son expresiones arreglo para sumar, multiplicar dos arreglos, siendo que ambos deben ser compatibles.

Si un operando es escalar, es tratado como un arreglo compatible, con cada uno de sus elementos igual al valor escalar: Ejemplo s: A+r
En este ejemplo si r es escalar su valor es sumado a cada elemento del arreglo A.

DECLARACION - Where

Permite ejecutar asignaciones de forma selectiva sobre los elementos de un arreglo


.WHERE (Condicin)
Sentencia-asignacin
[ELSEWHERE]
Sentencia-asignacin
END
- Solo se usan sentencias de asignacin.
- Para cada elemento del arreglo se verifica la condicin:
a. Si se cumple se ejecuta la asignacin que sigue al Where
b. Sino se cumple se ejecuta la asignacin que sigue al Elsewhere (si existe)

Ejemplo6:

El siguiente ejemplo usa dos mtodos diferentes para obtener el cuadrado de todos los elementos que son positivos:

Mtodo 1: Usando la sentencia IF


REAL, DIMENSION(10)::A 2
DO I =1,10 -2
READ*,A(I) 2
END DO -2
DO I = 1,10 2
IF (A(I) > 0) A(I)=A(I)**2 -2
END DO 2
3
Mtodo 2: Usando la sentencia WHERE 2
REAL, DIMENSION(10):: A -2
DO I = 1,10 4.000000 -2.000000 4.000000 -2.000000
READ*,A(I) 4.000000 -2.000000 4.000000 9.000000
END DO 4.000000 -2.000000
WHERE (A>0) A=A**2 Press any key to continue

Ejemplo7: 1
2
INTEGER, DIMENSION(100):: IN, OUT 15
DO I = 1,100 16
READ*, IN(I) 2
END DO 16
13
WHERE (IN<8)
15
OUT=0
18
ELSEWHERE
20
OUT=15 0
END WHERE 0
DO I = 1,100 15
PRINT*, OUT(I) 15
0
15
END DO
15
END
15
15
15 9
Press any key to continue
LECTURA DE ARREGLOS

Dimension A(1:20), B(1:2,1:5)


Read(*,*) A(1) Lee una posicin del arreglo
Read(*,*) A Lee todo el arreglo
Read(*,*) B
Lee el arreglo por columnas: 1,1;2,1;2,1; etc. 3456
Se puede usar un Do implicto en el Read: ejemplo 3
INTEGER Mat(2,2) 4
READ(*,*) ((Mat(J,K), K=1,2), J=1,2) 5
6
WRITE(*,*) Mat(1,1);WRITE(*,*) Mat(1,2)
Press any key to continue
WRITE(*,*) Mat(2,1);WRITE(*,*) Mat(2,2)
!write(*,*) ((Mat(J,K), K=1,2), J=1,2)
END

FUNCIONES PARA VECTORES Y MATRICES


La funcin para multiplicar las matrices A y B es MATMUL(A, B). Esta funcin opera con dos matrices, o con una matriz y un vector y
devuelve el correspondiente producto.
La funcin DOT_PRODUCT(C, D) calcula el producto escalar de los vectores C y D.
La funcin TRANSPOSE(A) nos devuelve el array transpuesto de A.
Otras funciones menos importantes son:
ALL(MASK, DIM) que devolver el valor verdadero cuando todos lo valores de la mscara sean ciertos.
ANY(MASK, DIM) que devolver el valor verdadero cuando algn valor de la mscara sea cierto.
COUNT(MASK, DIM) que nos dar el nmero de elementos verdaderos en la mscara. MAXVAL(ARRAY, DIM, MASK) nos da el mayor
valor del array sujeto a la mscara y a esa dimensin.
MINVAL(ARRAY, DIM, MASK) nos da el menor valor del array sujeto a la mscara y a esa dimensin.
PRODUCT(ARRAY, MASK) multiplica los elementos del array sujetos a la mscara. SUM(ARRAY, MASK) suma los elementos del array
sujetos a la mscara.
MAXLOC(ARRAY, MASK) nos devuelve la posicin del mayor elemento del array sujeto a la mscara.
MINLOC(ARRAY, MASK) nos devuelve la posicin del menor elemento del array sujeto a la mscara.
NOTA: Los argumentos DIM y MASK son opcionales. Y su funcionamiento ya ha sido explicado con anterioridad.
Otra funcin para arrays es la funcin ALLOCATED(A) que nos devuelve el valor verdadero si el array ha sido dimensionado.

RESERVA DINMICA DE MEMORIA


Es una caracterstica nueva del Fortran90 y permite declarar arrays de forma dinmica, es decir, podremos declarar un array segn la
memoria que vaya a utilizar. Un array dinmico ser declarado con una sentencia de declaracin de tipo, junto con el atributo
ALLOCATABLE. Por ejemplo, un array dinmico real de dos dimensiones lo declararamos as:
REAL, DIMENSION(:,:), ALLOCATABLE :: A
Con esta declaracin, no reservamos ningn espacio de memoria para el array A, ya que este espacio ser asignado dinmicamente en el
programa cuando el array sea usado y mediante la sentencia ALLOCATE:
ALLOCATE A(0:n,0:m)
Si posteriormente deseamos liberar este espacio de memoria, tambin podremos hacerlo, para ello usaremos la sentencia DEALLOCATE:
DEALLOCATE (A)
Ambas sentencias, la ALLOCATE y la DEALLOCATE pueden ir acompaadas por el argumento opcional STAT. STAT ser una variable
entera cuyo valor ser un nmero positivo en caso de haber un error en la ejecucin de alguna de esas sentencias y valdr cero si no lo
hay.
Con la sentencia ALLOCATED(A) sabremos si tenemos reservada memoria para el array A.
Un array dinmico puede ser declarado dentro de un mdulo, en este caso, la memoria para el array se mantendr a lo largo de la
ejecucin de la unidad del programa que use este mdulo.
Reglas para el uso de arrays dinmicos:
Los arrays dinmicos no pueden ser falsos argumentos de un procedimiento y hay que asignarle la memoria en la unidad del programa
donde se usen.
El resultado de una funcin no puede ser un array dinmico.
Con la sentencia SIZE tambin podemos asignarle memoria a un array, es decir, con la sentencia:
REAL, DIMENSION (SIZE(A)) :: C
lo que hacemos es definir C, como un array de dimensin uno con el mismo tamao que el array unidimensonal A.
PROGRAM LOCALIZAR
IMPLICIT NONE
REAL, DIMENSION ( 4 ) : : A
REAL, DIMENSION ( : , : ), ALLOCATABLE : : B
REAL : : MAX1, MAX2
A = (/ 3.2, 1.3, 4.5, 2.0 /)
ALLOCATE ( B ( SIZE( A ) - 2 , SIZE( A ) -2 ) )
B(1 : 2, 1) = A(1 : 2)
B(1 , 2) = 7.0
B(2 , 2) = A( 4 ) + 6.
MAX1 = MAXVAL ( A )
MAX2 = MAXVAL ( B )
PRINT*,'La posic. del mayor valor de A es',MAXLOC(A)
PRINT*,'y su valor es',MAX1
PRINT*,'La posic. del mayor valor de B es',MAXLOC(B)
PRINT*,'y su valor es',MAX2
END PROGRAM LOCALIZAR

10

You might also like