Вы находитесь на странице: 1из 117

ESCUELA SUPERIOR POLITECNICA DEL LITORAL

FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR


PROGRAMACION APLICADA 1

Presentacin .................................................................................................................. 5
1.0 Programacin bsica con FORTRAN ...................................................................... 6
1.1 Etapas para la preparacin de un programa .......................................................... 6
1.2 Programa fuente .................................................................................................. 6
1.2.1 Formatos para cdigo fuente y lmites del programa ..................................... 6
1.2.2 Esquema bsico de un programa tpico en Fortran ........................................ 7
1.2.3 Caracteres indicadores .................................................................................. 7
1.2.4 Variables y expresiones matemticas ............................................................ 8
1.2.5 Formatos numricos y alfanumricos ............................................................ 9
1.3 Declaraciones bsicas .......................................................................................... 9
1.3.1 OPEN ........................................................................................................... 9
1.3.2 CLOSE ....................................................................................................... 10
1.3.3 READ - WRITE ......................................................................................... 11
1.3.4 IF................................................................................................................ 11
1.3.5 DO ............................................................................................................. 12
1.3.6 DO WHILE ................................................................................................ 12
1.3.7 SELECT CASE .......................................................................................... 12
1.3.8 WHERE ..................................................................................................... 13
1.4 Funciones implcitas .......................................................................................... 13
2.0 Vectores y Matrices............................................................................................... 13
2.1 Declaracin y disposiciones de memoria ........................................................... 14
2.1.1 Vectores ..................................................................................................... 14
2.1.2 Matrices...................................................................................................... 16
2.2 Dimensionamiento dinmico ............................................................................. 20
2.2.1 Punteros...................................................................................................... 20
2.2.2 Alojamiento de memoria............................................................................. 22
2.2.3 Arreglos Automticos ................................................................................. 23
2.2.4 Ejercicios de aplicacin .............................................................................. 23
2.3 Almacenamiento por defecto en FORTRAN...................................................... 24
3.0 Tipos derivados de datos ....................................................................................... 25
3.1 Generalidades .................................................................................................... 25
3.2 Ejemplos ........................................................................................................... 26
4.0 El ambiente de trabajo Developer Studio ........................................................... 28
4.1 Iniciando un proyecto ........................................................................................ 29
4.2 Ejemplos ........................................................................................................... 31
5.0 Subprogramas, creacin y usos .............................................................................. 34

-1 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

5.1 Subrutinas ......................................................................................................... 34


5.1.1 Definicin................................................................................................... 34
5.1.2 Ejemplo ...................................................................................................... 34
5.2 Mdulos ............................................................................................................ 35
5.2.1 Definicin................................................................................................... 35
5.2.2 Ejemplo ...................................................................................................... 36
5.3 Funciones .......................................................................................................... 38
5.3.1 Definicin................................................................................................... 38
5.3.2 Ejemplo ...................................................................................................... 38
5.4 Interfaces........................................................................................................... 39
5.4.1 Definicin................................................................................................... 39
6.0 Libreras, creacin y usos ...................................................................................... 40
6.1 Libreras Estticas (Static Libraries) .................................................................. 40
6.1.1 Definiciones ............................................................................................... 40
6.1.2 Forma de usar ............................................................................................. 40
6.2 Libreras dinmicas (Dynamic Link Libraries)................................................... 41
6.2.1 Definiciones ............................................................................................... 41
6.2.2 Forma de usar ............................................................................................. 41
6.2.3 Ejemplo ...................................................................................................... 42
7.0 Personalizacin de programas ............................................................................... 44
7.1 Generalidades .................................................................................................... 44
7.2 Propiedades de la ventana .................................................................................. 44
7.3 Creacin de mltiples ventanas.......................................................................... 44
7.4 Graficacin y escritura en la pantalla ................................................................. 45
7.5 Insertando imgenes .......................................................................................... 47
7.6 Mensajes de aviso ............................................................................................. 47
7.7 Personalizar el men de opciones ...................................................................... 48
7.8 Iconos de programas .......................................................................................... 50
7.9 Eventos del ratn ............................................................................................... 51
7.9.1 Funciones basadas en eventos ..................................................................... 51
7.9.2 Ejemplo ...................................................................................................... 52
7.9.3 Funciones de bloqueo de ejecucin ............................................................. 53
7.9.4 Ejemplo ...................................................................................................... 53
7.10 Cuadros de dilogo personalizados .................................................................. 54
7.10.1 Agregar controles al cuadro de dilogo: .................................................... 55
8.0 Grficos en Visual Fortran .................................................................................... 62
8.1 Array Visualizer ................................................................................................ 62

-2 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

8.1.1 Generalidades ............................................................................................. 62


8.1.2 Descripcin ................................................................................................ 62
8.1.3 Sintaxis....................................................................................................... 63
8.1.4 Ejemplo ...................................................................................................... 64
8.2 Librera Plot88 .................................................................................................. 65
8.2.1 Generalidades ............................................................................................. 65
8.2.2 Etapas del proceso de graficacin ............................................................... 66
8.2.3 Sintaxis de cada subrutina ........................................................................... 66
8.2.4 Ejemplo ...................................................................................................... 68
8.3 CVFGraf ........................................................................................................... 70
8.3.1 Generalidades ............................................................................................. 70
8.3.2 Codificacin y subrutinas ........................................................................... 71
8.3.3 Ejemplo ...................................................................................................... 72
8.4 DXFortran ......................................................................................................... 73
8.4.1 Generalidades ............................................................................................. 73
8.4.2 Forma de uso .............................................................................................. 74
8.4.3 Descripcin de subrutinas ........................................................................... 74
8.4.4 Ejemplo ...................................................................................................... 76
9.0 Libreras IMSL en Fortran..................................................................................... 78
9.1 Generalidades .................................................................................................... 78
9.2 Uso de la Librera desde Visual Fortran ............................................................. 78
9.3 Ejemplo ............................................................................................................. 78
10.0 Aplicaciones Utiles ............................................................................................. 80
10.1 Creacin de archivos de ayuda......................................................................... 80
10.2 Abrir y guardar un archivo desde el men ........................................................ 81
10.3 Presentacin de una tabla ................................................................................. 83
10.3 Rutina de intercambio CVFDif ........................................................................ 86
10.5 Ventanas virtuales amplias .............................................................................. 91
10.6 Resolucin de sistemas de ecuaciones lineales ................................................. 92
10.6.1 Resolucin Numrica ................................................................................ 92
10.6.2 Mtodos de resolucin .............................................................................. 93
10.6.3 Ejercicio de aplicacin .............................................................................. 98
11.0 Normas Europeas para escribir y documentar cdigos fuente en Fortran 90 ....... 100
11.1 Documentacin ............................................................................................. 100
11.1.1 Documentacin Externa .......................................................................... 100
11.1.2 Documentacin Interna ........................................................................... 100
11.2 Obsolescencias de otras versiones.................................................................. 101

-3 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

11.3 Reglas bsicas de codificacin ....................................................................... 101


11.4 Encabezados para programas y subprogramas................................................ 102
11.4.1 Programas principales ............................................................................. 102
11.4.2 Subrutinas ............................................................................................... 103
11.4.3 Funciones ............................................................................................... 104
11.4.4 Mdulos ................................................................................................. 105
12.0 Ejercicios Propuestos ........................................................................................ 107
Referencias ............................................................................................................... 117

-4 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

Presentacin
El presente texto gua, resume algunos aspectos fundamentales de la programacin con
Fortran 90, de manera que el estudiante estar en capacidad de implementar
herramientas numricas eficientes para resolver problemas de ingeniera.
La
organizacin del texto es la misma estructura del programa de la materia aprobado por
el consejo de facultad para el ao 2005, y abarca desde nociones generales hasta la
creacin de programas usando herramientas de Visual y libreras estadsticas y
matemticas (IMSL).
El compilador Visual Fortran, se encuentra disponible en la facultad, en su versin 6.0,
actualmente se encuentra en el mercado la versin 9.1; la actualizacin de la versin
disponible a 6.5A puede ser obtenida de internet, en el sitio web de Compaq Co.
http://www.compaq.com/fortran. La versin disponible es del antiguo propietario de los
derechos del compilador, Digital Co., http://www.digital.com/fortran que los vendi a
Compaq Co., se hace esta aclaracin porque seguramente encontrar dentro de las
opciones de instalacin las siglas DVF (Digital Visual Fortran), y si obtiene
informacin de internet o baja alguna librera o actualizacin, encontrar las siglas CVF
(Compaq Visual Fortran), desde el ao 1999. Desde la versin 8.0 a partir del ao
2004, los derechos del compilador fueron comprados por el fabricante de
microprocesadores Intel, por lo que se encontraran referencias con las siglas IVF (Intel
Visual Fortran), http://www.intel.com
Es necesario mencionar que las versiones ms avanzadas de un compilador no son ms
que optimizadores respecto la anterior. Lo que quiere decir que su trabajo ser ms
eficiente y talvez ms amigable en el entorno de programacin.
FORTRAN tiene una ventaja realmente importante sobre otros lenguajes y es que se
pueden generar algoritmos matemticos altamente eficientes con l, es un lenguaje para
desarrolladores y no para usuarios comerciales, el compilador genera programas tiles
para cualquier plataforma. Lo que lo ubica entre los programas compilados y no
evaluados (Visual Basic de aplicaciones, MatLab, etc.) La desventaja son los sistemas
de graficacin, sin embargo, existen interfaces amigables que hacen ms fcil el manejo
de grficos y su exportacin a formatos ms conocidos, como BMP, JPG y DXF.
Espero que disfruten aprendiendo de estas notas, como yo lo hice escribindolas.

Juan Fernando Moreno Garca


Ingeniero Naval
Mayo-Julio de 2006

-5 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

1.0 Programacin bsica con FORTRAN


1.1 Etapas para la preparacin de un programa
Fortran es un lenguaje compilado, es decir, se obtiene un archivo ejecutable, extensin
.EXE, que puede trabajar en cualquier plataforma o sistema operativo. Existen
lenguajes de programacin que son evaluados como Turbo Pascal, Visual Basic para
aplicaciones, Basic y otros, estos programas necesitan tener instalado en la mquina el
compilador, para poder ejecutarse ya que van ejecutando lnea por lnea, si existe un
error detienen la ejecucin en esa lnea. Los programas compilados no tienen esta
opcin, es decir, trabajan o no trabajan.
Fortran, cumple tres etapas en la preparacin de un programa:
1. Codificacin del programa fuente.- hecho por el programador en un editor de
texto. El archivo final debe tener las extensiones de FORTRAN *.for, *.f90, *.f
*.fpp
2. Compilacin del programa fuente.- el producto de esta operacin genera un
archivo objeto, *.obj, que es del tipo intermedio, es decir transforma el cdigo
fuente en lenguaje de mquina.
3. Concatenacin o enlace.- el programa objeto se enlaza con las libreras
matemticas o grficas, segn sea el caso, y generan el programa ejecutable,
*.exe.

1.2 Programa fuente


Est conformado por una unidad de programa, que es una secuencia de comandos que
definen el ambiente de datos y los pasos necesarios para optimizar clculos entre ellos,
toda unidad de programa concluye con la declaracin END. Las unidades de programas
pueden ser: un programa principal, un subprograma externo o subrutina, un mdulo
(contiene definiciones de datos y tipos, definen un procedimiento o funcin, e incluye
interfases), y un bloque de datos (valores para objetos de datos).
Las lneas de programa son de dos clases
1. Ejecutables: definen una accin
2. No ejecutables: definen un atributo.

1.2.1 Formatos para cdigo fuente y lmites del programa


El Compilador Visual Fortran, soporta dos formatos de edicin del cdigo fuente,
formato fijo y formato libre.
1.

2.

El formato fijo.- Fortran Fixed Format Source File, que es rgido y una herencia
del Fortran 77, admite solo 72 columnas por lnea y tiene una columna fija, la
sexta, debiendo empezar la escritura en la sptima, las cinco primeras se las usa
para numerar las lneas. El Compilador DVF 6.0, disponible en la facultad
admite archivos fuente codificados en F77, a pesar que para la versin F90 este
tipo de formato es considerada obsoleto.
El formato libre.- Fortran Free Format Source File, es ms flexible en cuanto a
la ubicacin de comandos, admite 132 columnas por lnea.

-6 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

Los lmites del tamao y complejidad de una unidad de programa o declaracin


contenida en l se detallan en la tabla No. 1.[1]
Elementos del lenguaje
Lmite
Nmero de llamadas a subrutina
Sin lmite
Argumentos para una subrutina
Sin lmite
Dimensiones de matrices
7
Nmero de elementos por dimensin 9*1018
Lneas de continuacin total
511
Anidar DO e IF combinadas
128
Grupos de COMMON
250
Anidar con parntesis
40
Nmero de caracteres del nombre
63
Tabla No. 1.- Lmites del programa

1.2.2 Esquema bsico de un programa tpico en Fortran


El esquema que se presenta en la figura No.1, es solo referencial y hace nfasis en los
tipos de elementos de programas que se usarn en el curso, para obtener el cuadro
completo, vase la referencia [2].

PROGRAM, FUNCTION, MODULE


SUBROUTINE, BLOCK DATA

Declaracin de variables
FORMATOS

COMENTARIOS

USE declaraciones

Declaracin ejecutables

END

Figura No. 1.- Esquema bsico de un programa tpico

1.2.3 Caracteres indicadores


En la tabla No. 2, se describen los indicadores comnmente usados en programacin
con FORTRAN, se hace una comparacin de los usados en el formato fijo y en el libre,
hay que aclarar que el uso de stos de manera indistinta genera errores en la
compilacin del programa fuente, por lo que debe respetarse la sintaxis en el tipo de
formato que se est usando.

-7 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

Descripcin
Comentario
Lnea de comentario

Smbolo

C,c,*

Separador de
declaraciones
Nmero de lnea
Separador de lnea

Observaciones
En cualquier parte
Al inicio de la lnea

Al final y al inicio mximo 39


lneas seguidas
En la 6. Columna mximo 19
Menos 0
Fijo
lneas seguidas
Separa declaraciones en la misma
;
Todos
lnea
Libre
Al inicio de la lnea
5 dgitos
Fijo
De la columna 1 a 5
/
Todos
Al final de la lnea
Tabla No. 2.- Caracteres Indicadores
&

Continuacin

Formatos
Todos
Libre
Fijo
Libre

1.2.4 Variables y expresiones matemticas


Los tipos de variables admitidos en FORTRAN son los descritos en la tabla 3, el valor
que se encuentra entre parntesis es el valor que asume el compilador por defecto. La
tabla 4 muestra los operadores admitidos.
Variable

Sintaxis
Observaciones
Enteros
INTEGER(N)
N = 1,2,4,8 (4)
Real
REAL(N)
N = 4,8,16 (4)
Complejos
COMPLEX(N)
N = 8,16 (8)
Complejo doble precisin DOUBLE COMPLEX(N) N = 8,16 (8)
Lgica
LOGICAL(N)
N = 1,2,4,8 (4)
Alfanumricos
CHARACTER
Mximo 256
Matrices
DIMENSION
Mximo 7 dimensiones
Tabla No. 3.- Tipos de Variables principales
Descripcin
Suma y resta
Multiplicacin
Divisin
Potencia
Menor que
Mayor que
Igual
Mayor o igual
Menor o igual
Diferente
Y
O
No equivalente
Equivalente
No (negacin)

Smbolo
Tipo
Resultado
+,*
Aritmtico
Valor numrico
/
**
.LT., <
.GT., >
.EQ., ==
Comparacin
.GE.,>=
.LE., <=
.TRUE.
.NE.,/=
.FALSE.
.AND.
.OR.
.NEQV. .XOR.
Lgicas
.EQV.
.NOT.
Tabla No. 4.- Operadores admitidos

-8 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

1.2.5 Formatos numricos y alfanumricos


Los descritos en la tabla No. 5 son los formatos numricos para escritura o lectura de
variables admitidos por el lenguaje.
Variable
Enteros
Lgica
Binarios
Hexadecimales
Reales decimales

Cientfica

Complejos
Alfanumricos

Formato
In
Ln
Bn
Zn

Ejemplo
I3 : 125
L1 : Y
B4 : 1001 (9)
Z3 : A94

Fn.m

F4.2 : 3.45

En.m

E6.1 : .2E+02

Observaciones
n nmero de cifras
n nmero de caracteres
n nmero de cifras
n nmero de cifras
n nmero de cifras,
m nmero de decimales
n nmero de cifras,
m nmero de decimales
Cientfica de doble densidad
n nmero de cifras,
m nmero de decimales

Dn.m
D8.2 : 0.53D+01
Fn.m,Fn.m
(F5.2,F5.1) :
2Fn.m
(23.56,125.7)
En.m,En.m
An
A5 : varia
n nmero de caracteres
Tabla No. 5.- Formatos usados en Fortran

Los formatos por defecto en el programa, a menos que sean definidos previamente son
los que se detallan en la tabla No. 6.
Variable
Formato
Enteros
I12
Lgica
L2
7
Reales (1 a 10 ) F15.6
Reales (1 a -107) E15.6
Complejos
F23.15,F23.15, 2F23.15
Alfanumricos
A1
Tabla No. 6.- Formatos por defecto

1.3 Declaraciones bsicas


1.3.1 OPEN

Descripcin
Sirve para abrir un archivo o una variable para posteriormente leer o escribir en ella
informacin producto de una ejecucin o de una asignacin directa de valores.

Sintaxis
OPEN unidad , file

nombre, status

estado, err

-9 -

nmero, iostat

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

1. Unidad: es un nmero entero que se asigna al elemento con el que se realizar el


trabajo.
2. File: el nombre de la variable o del archivo, si se utiliza directamente el nombre
del archivo ste debe ser colocado entre comillas.
3. Status: Evala el estado del archivo al ser abierto y toma los siguientes valores:
a. new: el archivo es nuevo, el programa lo crea y su estado pasa a ser
old, si ya existe se produce un error y la ejecucin se detiene.
b. old: es un archivo ya existente.
c. scratch: se trata de un archivo nuevo que no ha sido nombrado, cuando
se lo cierra o termina la ejecucin del programa, este archivo se borra.
d. replace: el archivo que se crea reemplaza a uno ya existente, si lleva el
mismo nombre, borra el anterior y se actualiza.
e. unknown: el archivo puede o no existir, si no existe se crea uno nuevo
y su estado pasa a ser old. Este estado se aplica por omisin.
4. Err: cuando se produce un error en la ejecucin del comando, el programa pasa
a la lnea que se especifica, si se omite err, la ejecucin del programa se
detiene.
5. Iostat: es una variable entera, que toma el valor de 1 se existe error, y 0 si no lo
hay.

1.3.2 CLOSE

Descripcin
Sirve para cerrar un archivo o una variable que ha sido previamente abierta usando la
declaracin OPEN.

Sintaxis
CLOSE unidad , STATUS

1.
2.

3.

4.

" estado", ERR

nmero, IOSTAT

Unidad: es el nmero asignado en la apertura del documento, tiene que ser un


entero.
Status: Evala el estado del archivo al ser cerrado y toma los siguientes valores:
a. Keep o Save: guarda el archivo despus de cerrarlo.
b. Delete: borra el archivo despus de cerrarlo
c. Submit: separa un proceso para ejecutar el archivo.
d. Submit/delete: separa un proceso para ejecutar el archivo, entonces
borra el archivo una vez concluda la ejecucin.
Err: cuando se produce un error en la ejecucin del comando, el programa pasa
a la lnea que se especifica, si se omite err, la ejecucin del programa se
detiene.
Iostat: es una variable entera, que toma el valor de 1 se existe error, y 0 si no lo
hay.

- 10 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

1.3.3 READ - WRITE

Descripcin
Sirve para leer/escribir desde/en un archivo o una variable valores numricos o
alfanumricos.

Sintaxis
READ unidad , format var
WRITE unidad , format var

1.
2.

3.

Unidad: es el nmero asignado en la apertura del documento, tiene que ser un


entero.
Format: formato de lectura, este formato se asigna a la variable que va a ser
asignada para los datos ledos. Si no existe un formato especificado se coloca
*, para escribir en pantalla la unidad es *.
var: nombre de la variable donde se ejecuta la accin.

1.3.4 IF

Descripcin
Existen de tres tipos:
1. El IF aritmtico: este comando ejecuta tres acciones definidas por la lnea que se
designe de acuerdo al valor que toma la variable: negativa, cero o positiva.
2. El IF lgico: este comando ejecuta una declaracin si el valor de la variable es
verdadero, caso contrario la ignora
3. El IF condicional: esta declaracin condiciona la ejecucin de un conjunto de
acciones a una pregunta lgica: si la respuesta es verdadera entonces ejecuta la
accin despus del comando THEN, caso contrario ejecuta la accin colocada
despus del comando ELSE. Siempre se cierra con la declaracin ENDIF.
Puede obviarse la declaracin ELSE, pero no el ENDIF.

Sintaxis
IF (aritmtico)
IF(expr)label1,label2,label3
1. expr: es una expresin numrica del tipo entero o real, encerrado en parntesis.
2. Label1: es una lnea del programa, la ejecucin pasa a esta lnea si la expresin
es menor que cero.
3. Label2: es una lnea del programa, la ejecucin pasa a esta lnea si la expresin
es igual a cero.
4. Label3: es una lnea de programa, la ejecucin pasa a esta lnea si la expresin
es mayor que cero.
IF (lgico)
IF (expr)stmt
1. Expr: es una expresin lgica, entre parntesis.

- 11 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

2. Stmt: es una declaracin ejecutable, cuando IF es ejecutado, la expresin lgica


es evaluada primero, si su resultado es verdadero, se ejecuta, caso contrario no.
IF (condicional)
IF (expr) THEN
Bloque de ejecucin
ELSE
Bloque de ejecucin
ENDIF

1.3.5 DO

Descripcin
Ejecuta una accin definida controlando el nmero de veces que se ejecuta un bloque.

Sintaxis
DO [Variable = (valor entero)]
Bloque de ejecucin
ENDDO

1.3.6 DO WHILE

Descripcin
Ejecuta una accin definida si la declaracin entre el parntesis es verdadera, caso
contrario la ignora

Sintaxis
DO [WHILE] (expr)
Bloque de ejecucin
ENDDO

1.3.7 SELECT CASE

Descripcin
Selecciona dentro de varias opciones las acciones a seguir de acuerdo al valor que toma
una variable entera, lgica o alfanumrica. Esta declaracin reemplaza al GOTO de
Fortran 77.

Sintxis
[nombre] SELECT CASE (variable)
CASE (valor)
Bloque de ejecucin
CASE (valor)
Bloque de ejecucin..
CASE DEFAULT
Bloque de ejecucin
END SELECT [nombre]

- 12 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

1.3.8 WHERE

Descripcin
Realiza una prueba lgica a los elementos de un arreglo o matriz, o a una matriz
completa, ocasionalmente se le asigna un nombre, que debe ser conservado. Lo que se
encuentra entre los signos de agrupacin [] es opcional en la construccin del bloque.

Sintaxis
[nombre] WHERE (expr 1)
Bloque de ejecucin
[ELSEWHERE (expr2) [nombre]
[Bloque de ejecucin] ...]
[ELSEWHERE [nombre]
[Bloque de ejecucin] ...]
END WHERE [nombre]

1.4 Funciones implcitas


Fortran tiene incluidas funciones matemticas que pueden ser usadas en cualquier lugar
del bloque de ejecucin, siempre tienen la siguiente sintaxis general.
Var = FUNCION(argumento)
En la tabla No. 7 se citan algunas funciones ntese el tipo de argumento que tiene cada
funcin y el tipo de variable que resulta de su ejecucin.
Nombre
ABS
ACOS
LOG
LOG10
CHAR
CMPLX
EXP
FLOAT
LEN
SQRT

Definicin
Tipo de Argumento
Tipo de Funcin
Valor absoluto
Entero, real, complejo Entero, real, complejo
Arco Coseno
Real
Real
Logaritmo natural
Real
Real
Logaritmo base 10
Real
Real
Convierte a caracter
Entero
Alfanumrico
Convierte a complejo Entero, real, complejo Complejo
Exponencial
Real
Real
Convierte en real
Entero
Real
Longitud de cadenas
Alfanumrico
Entero
Raz cuadrada
Real o complejo
Real o complejo
Tabla No. 7.- Ejemplo de funciones matemticas

2.0 Vectores y Matrices


En FORTRAN existen dos tipos de datos no escalares conocidos como arreglos
(ARRAYS), de los cuales existen dos tipos los vectores y las matrices, siendo el vector
una matriz de dimensin uno. En general los arreglos estn formados por conjuntos de
valores que son los elementos del conjunto, por ejemplo cuando nos referimos al
elemento A5, nos referimos al quinto elemento contenido en el vector A, de igual
manera cuando operamos matrices el elemento A2,5, se refiere al elemento de la fila 2,

- 13 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

columna 5 de la matriz A. En FORTRAN la nomenclatura es A(5) y A(2,5)


respectivamente.
Todo elemento de un arreglo, es decir, una variable con sus subndices en FORTRAN
recibe el nombre de variable subindicada.
La estructura de un arreglo en FORTRAN, queda definida con los siguientes
parmetros:
1. Rango: total de dimensiones del arreglo, el mximo 7.
2. Extensin: Componentes que posee un arreglo en cada una de sus dimensiones,
mximo 9*1018.
3. Tamao: total de elementos de un arreglo
4. Perfil: vector cuyos elementos son las respectivas extensiones de cada
dimensin.
5. Conformidad: igualdad de perfil, entre dos o ms arreglos.
6. SubArreglo: arreglo formado por slo algunos elementos de un arreglo dado.

2.1 Declaracin y disposiciones de memoria


2.1.1 Vectores
Son arreglos de una sola dimensin, que permiten almacenar informacin del tipo real,
entera, compleja y alfanumrica.

Forma de declarar vectores


Se los puede definir de las siguientes maneras:
Tipo, DIMENSION (n) :: lista de vectores

Donde tipo puede ser REAL, INTEGER, COMPLEX, CHARACTER, n


corresponde al nmero de elementos que contiene el arreglo, y la lista de vectores son
las variables que se han asignado a cada vector.
Tipo :: variable(i:s), variable2(i:s),
Tipo :: variable(i:s:p), variable2(i:s:p)

Donde el tipo es el mismo del anterior esquema y la lista de arreglos se la hace


determinando su tamao entre parntesis. El primer nmero entero i indica la posicin
menor del arreglo y s la posicin mayor del arreglo. Si la posicin menor es 1, se la
puede omitir.
Cuando se hacen declaraciones con triple especificacin, el ltimo elemento indica las
posiciones: inferior, inferior + paso, inferior + 2*paso, etc. Sin sobrepasar el lmite
superior si el paso es mayor que cero y si el paso es menor que cero sin llegar a valores
bajo el lmite superior. Si i es omitido se toma el valor de 1, s no puede ser omitido
y si el paso es omitido se asume el valor de 1.
Tipo, DIMENSION (:), ALLOCATABLE :: lista de arreglos

- 14 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

En esta forma se ha usado la declaracin ALLOCATABLE, que nos permite


determinar el tamao del arreglo durante la ejecucin, una forma alterna de este mtodo
es el siguiente:
Tipo, DIMENSION (:) :: lista de arreglos
ALLOCATABLE :: lista de arreglos

Luego cuando se conoce el tamao del arreglo se hace la siguiente declaracin:


ALLOCATE(lista de arreglos, STAT = variable entera)
ALLOCATE(lista de arreglos)

Donde la lista de arreglos se definen como VAR(N) y la funcin STAT indica si la


asignacin ha sido realizada con xito. Por lo que se debe colocar a continuacin, un IF
para verificar el paso y evitar errores de ejecucin.
IF (Variable entera /= 0) STOP No hay memoria suficiente

Para liberar la memoria se usa la sentencia DEALLOCATE ( lista).


Otra forma de asignar valores al vector de manera constante y desde el programa fuente
es escribiendo los valores directamente en el vector previamente definido y declarado
como tal.
A = (/valor 1, valor 2, valor 3, .. , valor n/)
A = (/(declaracin, i=1,n)/)
A = (/valor 1, valor 2, (i, i=3,n,m), valor n+1/)

Usando la funcin WHERE tambin se puede asignar valores a los vectores, conocido
los elementos de otro.

Ejemplos
Declaraciones de vectores
COMPLEX, DIMENSION (10) :: A,B,C
COMPLEX :: A(10), B(10), C(10)
COMPLEX, DIMENSION (0:9) :: A,B,C
COMPLEX, DIMENSION (0:18:2) :: A,B,C
COMPLEX A(0:9), B(2:18:2), C(::), D(:20:)

Declaraciones de vectores con tamao desconocido


REAL, DIMENSION (:), ALLOCATABLE :: A,B,C

Otra forma:
REAL, DIMENSION (:) :: A,B,C
ALLOCATABLE :: A,B,C
Luego de un bloque de ejecucin se obtiene n
ALLOCATE(A(n),B(n),C(n), STAT = StatusValor)
IF (statusValor /= 0) STOP No hay memoria suficiente

Asignacin de valores a un vector mediante elementos conocidos.


A = (/-2.2, 5.14, 4.0, 2.58/)
A = (/(1.25*I,i=1,10)/)
A = (/7, 1, (i, i=3,18,3), 4/)

- 15 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

Funciones para operar vectores


ALLOCATED (A)
DOT_PRODUCT (A,B)
MAXVAL(A)
MAXLOC(A)
MINVAL(A)
MINLOC(A)
PRODUCT(A)
SIZE(A)
SUM(A)

Devuelve verdadero si se ha dimensionado el vector


Producto punto entre A y B
Mximo valor en el arreglo
Posicin del primer mximo valor
Mnimo valor del arreglo
Posicin del primer mnimo valor
Producto de los elementos del arreglo
Nmero de elementos del arreglo
Suma de los elementos del arreglo

Ejercicios de aplicacin
1. Declarar un vector de cantidades enteras con las siguientes caractersticas:
a. La sucesin de ndices comienza en el -1 y finaliza en el 9, con un
escaln, entre subndices de 2 unidades
2. Se desea asignar al vector Z de nmeros enteros los valores pares comprendidos
entre 2 y 12. Usando una funcin para definir los elementos.
3. Haciendo uso de un lazo DO implcito asignar al vector compuesto por 100
nmeros enteros, los siguientes valores: -4 y 8 para el primero y el ltimo
elemento y 0 para los 98 restantes.
4. Escribir un programa que tome una lista de nmeros y los ordene. El usuario
deber introducir primero cuantos nmeros quiere ordenar y a continuacin la
lista de nmeros. El programa devolver por pantalla la lista ordenada.
5. Realizar un programa usando FORALL, que convierta todos los caracteres de
una frase introducida por teclado en maysculas.

2.1.2 Matrices
Son arreglos de datos con ms de una dimensin, Fortran soporta hasta 7 dimensiones.
Igual que los vectores son del tipo ENTERO, REAL, COMPLEJO o
ALFANUMERICO.

Forma de declarar matrices


Se los puede definir de las siguientes maneras:
Tipo, DIMENSION (n,n2,n3, ., nn) :: lista de matrices

Donde tipo puede ser REAL, INTEGER, COMPLEX, CHARACTER, n


corresponde al nmero de elementos que contiene el arreglo, y la lista de matrices son
las variables que se han asignado a cada una.
Tipo :: var1(i:s,i:s,i:s,), var2(i:s,i:s,i:s,),
Tipo :: var1(i:s:p,i:s:p,), var2(i:s:p,i:s:p,)

Donde el tipo es el mismo del anterior esquema y la lista de arreglos se la hace


determinando su tamao entre parntesis. El primer nmero entero i indica la posicin
menor del arreglo y s la posicin mayor del arreglo. Si la posicin menor es 1, se la
puede omitir.

- 16 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

Cuando se hacen declaraciones con triple especificacin, el ltimo elemento indica las
posiciones: inferior, inferior + paso, inferior + 2*paso, etc. Sin sobrepasar el lmite
superior si el paso es mayor que cero, si el paso es menor que cero sin llegar a valores
bajo el lmite superior. Si i es omitido se toma el lmite inferior del arreglo, si s es
omitido se toma el lmite superior del arreglo, y, si el paso es omitido se asume el valor
de 1.
Tipo, DIMENSION (:,:,:,), ALLOCATABLE :: lista de arreglos

La declaracin ALLOCATABLE, nos permite determinar el tamao del arreglo


durante la ejecucin, una forma alterna de este mtodo es el siguiente:
Tipo, DIMENSION (:,:,:,) :: lista de arreglos
ALLOCATABLE :: lista de arreglos

Luego cuando se conoce el tamao del arreglo se hace la siguiente declaracin:


ALLOCATE(lista de arreglos, STAT = variable entera)
ALLOCATE(lista de arreglos)

Donde la lista de arreglos se definen como VAR(n1,n2,) y la funcin STAT indica si


la asignacin ha sido realizada con xito, por lo que se debe colocar a continuacin, un
IF para verificar el paso y evitar errores de ejecucin.
IF (Variable entera /= 0) STOP No hay memoria suficiente

Para liberar la memoria se usa la sentencia DEALLOCATE ( lista).

Asignacin de valores
1. Lectura usando DO implcito:
READ *,((TABLA(FILA,COL), COL = a,b), FILA = c,d)
READ *,(TABLA(I,J,K), I = a,b), J = c,d), K = e,f)

2. Sub arreglos de una matriz.


Sea una matriz A declarada como:
INTEGER, DIMENSION (2,3) :: A

Con valores:
11 22 33
A
44 55 66
El subarreglo definido por: A(1:2:1, 2:3:1) o simplemente A(:, 2:3) es una
matriz de 2x2 que contiene las dos ltimas columnas de la matriz A.

22 33
55 66

El valor del subarreglo definido como A(2, 1:3:1) o simplemente A(2,:) es


un vector que contiene la ltima fila de la matriz

44 55 66

- 17 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

El valor del subarreglo definido por. A((/2,1/), 2:3), en el cual el primer


trmino est definido por el vector (/2,1/), el que indica que la segunda fila se
considerar primero y luego la primera, es decir indica el orden de asignacin de
las filas, y el segundo trmino est definido por la declaracin (2:3), con paso
de 1, el resultado es un arreglo 2x2

55 66
22 33
3. Asignacin de un arreglo a otro.
Sean dos matrices declaradas como:
A

INTEGER, DIMENSION (2,3) :: A


INTEGER, DIMENSION (3,2) :: B

Se asigna a la matriz A el valor de 0, el resultado es una matriz 2x3 conteniendo


como elementos ceros.
A = 0

0 0 0
0 0 0
La declaracin: B = RESHAPE (A, (/3,2/)), asigna a la matriz B el contenido
de A
0 0
B 0 0
0 0
Tambin se pueden asignar valores a manera de subarreglos dentro de una
matriz, por ejemplo en la matriz original A con elementos igual a cero, la
declaracin:
A

A(:, 2:3) = RESHAPE((/I**2, I = 1,4)/), (/2,3/))

Cambia los valores de A:

0 1 9
0 4 16
4. Asignacin mediante la sentencia WHERE
Sean dos matrices A y B declaradas como:
REAL, DIMENSION (2,3) :: A, B
Donde la matriz A tiene los valores:
A

1.0 2.0 0.0


0.0 10.0 5.0
La sentencia WHERE usada como:

WHERE ( A /= 0.)
B = 1.0/REAL(A)
ELSEWHERE
B = 0.0
END WHERE

Los valores asignados a B son:

- 18 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

1.0 0.5 0.0


0.0 0.1 0.2

Ejemplos
Declaraciones de matrices
COMPLEX, DIMENSION (10,20,10) :: A,B,C
COMPLEX :: A(10,10), B(10,5), C(10,30)
COMPLEX, DIMENSION (0:9,1:4) :: A,B,C
COMPLEX, DIMENSION (0:18:2,1:12:4,0:9:1) :: A,B,C
COMPLEX A(0:9,:13:,1:6), B(2:18:2,12)

Declaraciones de matrices con tamao desconocido


REAL, DIMENSION (:,:,:), ALLOCATABLE :: A,B,C

Otra forma:
REAL, DIMENSION (:,:,:) :: A,B,C
ALLOCATABLE :: A,B,C
Luego de un bloque de ejecucin se obtiene n y m
ALLOCATE(A(n,m),B(n,m),C(n,m), STAT = StatusValor)
IF (statusValor /= 0) STOP No hay memoria suficiente

Funciones para operar matrices


MATMUL(A,B)
MAXVAL(A,D)
MAXLOC(A)
MINVAL(A,D)
MINLOC(A,D)
PRODUCT(A,D)
RESHAPE(A,S,P,Q)

SHAPE(A)
SUM(A,D)
SPREAD(A,D,N)
TRANSPOSE(A)

Producto de matriz A por B


Arreglo con los mximos valores de A en la dimensin D, si se
omite D un valor mximo de todo el arreglo
Vector con la posicin del primer mximo valor
Arreglo con el mnimo valor de A en la dimensin D, si D se
omite, un mnimo valor de todo el arreglo
Vector con la posicin del primer mnimo valor
Arreglo de una dimensin menor que contiene el producto de A
con los elementos de la dimensin D
Arreglo que contiene los valores de A con la forma S, seguidos
por elementos del arreglo P y un vector Q especificando el orden
en que los subscriptores se varan cuando se llena la matriz. P y
Q son opcionales.
Vector con las extensiones del arreglo A
Arreglo con la suma de los elementos de A en la dimensin D, si
D se omite suma los elementos de toda la matriz
Arreglo de dimensin mayor que A obtenida por proyectar A, n
veces a lo largo de la dimensin D
Transpuesta de A

Ejercicios de aplicacin
1. Declarar una matriz de nmeros enteros, de dos filas y tres columnas. Rellenarla
en sus primeros elementos con los valores 11, 12, 13, 14 y los dos restantes con
0, rellenarlas por filas e indicar la matriz obtenida.
2. En un programa se declara una matriz mediante la sentencia:
REAL, DIMENSION (-4:0:1,1:7:1):: A

- 19 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

En el mismo programa se escriben las asignaciones vector conteniendo los


subndices que se indican:
u = (/-4,-2,-3/) y v = (/2,1,1,3/)
Contestar las siguientes preguntas:
a. Total de filas y columnas que posee la matriz declarada
b. Subarreglos obtenidos, respectivamente, con el uso de las variables
A = (-2,v), A(u,2) y A(u,v)
c. Subarreglo obtenido con: A(0,(/1,3,5/)).
3. Escribir un programa que use una matriz de rango 2, donde las extensiones de
cada dimensin son variables. El programa leer las extensiones por teclado,
dimensionar la matriz en memoria en funcin de los valores ledos y por ltimo
llenar de valores e imprimir su contenido.
4. Escribir un programa que lea por teclado el listado de notas de hasta 100
alumnos, para cinco ejercicios. Se debern introducir todas las notas para el
primer ejercicio, a continuacin las del segundo, y as sucesivamente hasta
completar los cinco ejercicios. Si la nota introducida es 999, el programa
considerar que ya no hay ms alumnos en dicho ejercicio y pasar al siguiente
ejercicio. El programa deber resolver el nmero de alumnos presentados a cada
ejercicio, la nota media para dicho ejercicio y el listado de notas con la
desviacin con respecto a la media.
5. Escribir un programa que transponga la matriz de dimensin 3x3 de valores
reales de doble densidad, leda por teclado. Se emplear la construccin
FORALL sin hacer uso de matrices auxiliares.

2.2 Dimensionamiento dinmico


Los datos pueden ser estticos o dinmicos, en el caso de datos estticos el valor de
memoria asignada a la variable se mantiene constante durante toda la ejecucin del
programa y nicamente se libera cuando termina la ejecucin. En este tipo de datos es
previamente definido el tamao de memoria que se reserva. Cuando un dato es
dinmico la cantidad de memoria puede ser creada, alterada o liberada conforme avanza
la ejecucin del programa y de acuerdo a las necesidades del usuario. En FORTRAN
90/95 existen 3 tipos de dimensionamiento dinmico: punteros (POINTERS), arreglos
alojados (ALLOCATE) y arreglos automticos.

2.2.1 Punteros
El objetivo de su uso es el de almacenar los arreglos consecutivamente dejando
posiciones de memoria sin uso al final del espacio reservado. Considrese la siguiente
declaracin de matrices y vectores:
PARAMETER (NA_MAX = 100)
REAL(KIND = 8), DIMENSION (NA_MAX, NA_MAX) :: A
REAL(KIND = 8), DIMENSION (NA_MAX) :: V, W

Se observa claramente que para no tener que compilar y enlazar el programa cada vez
que se desea trabajar con matrices de tamaos de distintos tamaos se ha definido un
parmetro, este parmetro indica el mximo tamao admisible sin necesidad de
modificar el programa. En este caso se suponen que no existirn matrices de orden
mayor a 100, por lo que se reserva espacio suficiente para matrices 100x100
coeficientes reales de doble densidad, luego un vector de 100 espacios y luego otro
vector de 100 posiciones. Una vez asignado el espacio el programa mediante una

- 20 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

sentencia de lectura o escritura obtiene el orden real de la matriz con la que se va a


trabajar. Por ejemplo:
WRITE (*,*) INGRESE EL ORDEN DE LA MATRIZ
READ(*,*)NDIM

Si por ejemplo se ingresa para NDIM el valor de 4, el programa solo usa las primeras 16
posiciones de memoria para la matriz A, el vector V de 4 elementos se encuentra
almacenado detrs de la matriz A, es decir, hay 100 2-16 nmeros reales de doble
densidad que no van a ser usados.

Figura No.- 1 Dimensionamiento no consecutivo


Para el mismo ejemplo se reservarn espacios consecutivos de memoria, pero en un
nico vector denominado DD, que debe contener la matriz A y los vectores V y W, la
matriz A ocupar las primeras NDIMxNDIM posiciones del vector DD, el vector V las
siguientes NDIM posiciones y el vector W las siguientes NDIM, quedan libres por
tanto, las ltimas NA_MAX NDIM2- NDIM NDIM posiciones del vector DD, si
NDIM es 4 quedan libres 10177 posiciones consecutivas al final del vector DD, con
esto se ha conseguido que toda la informacin se encuentre prxima independiente de la
dimensin de las matrices.
Queda por lo tanto nicamente indicar al programa donde inicia y donde termina la
matriz y los vectores en el vector DD, a esta instruccin se denomina definicin de
punteros, para lo cual se definen las siguientes instrucciones:
NA
NV
NW
NEND

=
=
=
=

1
NA + NDIM*NDIM
NV + NDIM
NW + NDIM

Matriz A
Vector V despus de A
Vector W despus de V
Fin del espacio ocupado

Seguidamente se verifica si el espacio reservado es suficiente


IF (NEND > NA_MAX) THEN
WRITE(*,*) ERROR, Dimensionamiento insuficiente
WRITE(*,*) SE REQUIEREN, NEND, POSICIONES
STOP
ENDIF

- 21 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

Cuando se hace la asignacin en una subrutina simplemente en reemplazo del nombre


del vector o matriz se pasa la posicin del puntero, en el mismo orden.

Figura No.- 2 Reserva consecutiva de memoria


Por ejemplo para el caso visto anteriormente, supongamos que debemos enviar la
informacin de la matriz A y los vectores V y W en una subrutina1, la secuencia
convencional sera:
CALL SUBRUTINA1(NDIM, A, V, W)

Usando los punteros definidos, la asignacin sera:


CALL SUBRUTINA1(NDIM, DD(NA), DD(NV), DD(NW))

En la subrutina se mantiene la sintaxis convencional.

2.2.2 Alojamiento de memoria


Los lmites y la forma de un arreglo no son conocidos sino hasta que se ha ejecutado el
programa, mediante el ingreso o determinacin de la dimensin. Estos arreglos se los
declara como sigue:
Tipo, DIMENSION (:,:,:,), ALLOCATABLE :: lista de arreglos

O su equivalente
Tipo, DIMENSION (:,:,:,) :: lista de arreglos
ALLOCATABLE :: lista de arreglos

Una vez conocido el valor de la dimensin que se define se asigna la dimensin usando
la sentencia:
ALLOCATE(lista de arreglos, STAT = variable entera)
ALLOCATE(lista de arreglos)

Donde la lista de arreglos se definen como VAR(n1,n2,) y la funcin STAT indica si


la asignacin a sido realizada con xito. Por lo que se debe colocar a continuacin, un IF
para verificar el paso y evitar errores de ejecucin, este paso es opcional, pero cuando se

- 22 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

encuentra ejecutando varios programas a la vez en el computador, se debe considerar la


verificacin de memoria virtual, evidentemente esto no es necesario si estamos seguros
de trabajar con matrices relativamente pequeas y memoria RAM relativamente alta.
IF (Variable entera /= 0) STOP No hay memoria suficiente

Para liberar la memoria se usa la sentencia.


DEALLOCATE (lista de arreglos)

Siempre que sea necesario reasignar valores al arreglo es necesario liberar la memoria,
de igual forma antes de finalizar la ejecucin se recomienda liberar la memoria.

2.2.3 Arreglos Automticos


Este tipo de dimensionamiento se encuentra aplicado nicamente a los subprogramas,
ya que en ellos se define un parmetro de dimensin N y la asignacin se la hace
conocido este parmetro. Por ejemplo considrese el siguiente cdigo fuente:
FUNCTION SUMA(A, M, N)
REAL, DIMENSION (M,N) :: A
SUMX = 0.0
DO J = 1, N
DO I = 1, M
SUMX = SUMX + A(I, J)
END DO
END DO
SUMA = SUMX
END FUNCTION

En el ejemplo propuesto la matriz A tiene dimensin MxN que no se conoce y sin


embargo son argumentos de la funcin, una vez conocidos se puede conocer la
dimensin de la matriz.

2.2.4 Ejercicios de aplicacin


1. Escribir un programa que cree un vector dinmico y lo vaya rellenando con los
valores enteros proporcionados por el usuario, el vector comenzar
dimensionado a uno y duplicar su capacidad cada vez que se llene
completamente. El proceso se detiene cuando el usuario ingresa el nmero -987.
2. Escribir un programa que lea dos valores N y M y ubique dinmicamente en
memoria una matriz A(n,m) y dos vectores B(m) y C(n) y a continuacin lea por
teclado los valores de cada elemento de la matriz A y el vector B, obtenga el
producto matriz por vector usando la funcin MATMUL. Mostrar la matriz y los
vectores en pantalla.
3. Escribir un programa que genere una matriz de Vandermonde, la definicin de
los trminos de la matriz Vandermonde es:

ai , j

xi

j 1

i, j 1,...n

Donde xi,,xn son nmeros reales distintos entre s, en particular considere:


a. Tomar xi = 10-i+1, con i = 1,,n y presentar los resultados para n = 4
b. Tomar xi = i, con i = 1,,n y presentar los resultados para n = 4

- 23 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

Generar un vector que se define como la suma de las columnas y realice el


producto matriz vector, calcule el mdulo del vector y presente en pantalla la
matriz de entrada, el vector de entrada, el vector producto y el mdulo del vector
producto.

2.3 Almacenamiento por defecto en FORTRAN


En FORTRAN las variables con 2 subndices se almacenan por columnas, por ejemplo,
considere la matriz:

a11 a12 a13


a21 a22 a23
a31 a32 a33

Se almacenan los coeficientes siguiendo el orden que imponen las columnas, es decir:

a11 a21 a31 a12

a22

a32

a13

a23

a33

En caso de que la variable tenga ms subndices la filosofa se mantiene.


La importancia de conocer la forma de almacenamiento radica en la eficiencia de los
algoritmos, para ilustrar esto vamos a analizar un ejemplo clsico de resolucin de
sistemas lineales con matrices triangulares.

l11 0 0 0
l21 l22 0 0
L
l31 l32 l33 0
l41 l42 l43 l44
Por consiguiente para esta matriz el computador la almacena como:
l11 l21 l31 l41 0 l22 l32 l42

0 0 l33 l43 0 0 0 l44

Para este ejemplo se ha seleccionado una matriz triangular inferior de dimensin N = 4,


se declaran previamente la matriz A donde se almacenan los coeficientes de la variable,
y el vector B que contiene los trminos independientes, el vector X contiene la solucin
del sistema.
El siguiente cdigo muestra el acceso a los elementos de la matriz de manera natural,
filas y luego columnas.
X(1) = B(1)/A(1,1)
DO I = 1, N
X(I) = B(I)
DO J = 1, I-1
X(I) = X(I) A(I,J)*X(J)
END DO
X(I) = X(I)/A(I,I)
END DO

- 24 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

En este algoritmo la secuencia de acceso a los datos es la siguiente:


1 2
4 7
3 5
8
l11 l21 l31 l41 0 l22 l32 l42

0 0 l33 l43

10
0 0 0 l44

Evidentemente el acceso es en desorden y no se accede de forma secuencial, este efecto


de saltar entre posiciones lejanas de memoria se va acentuando a medida que el orden
de la matriz crece.
El cdigo que sigue muestra el acceso a los elementos de la matriz primero por
columnas y luego por filas.
DO I = 1,N
X(I) = B(I)
END DO
DO J = 1, N-1
X(J) = X(J)/A(J,J)
DO I = J+1, N
X(I) = X(I) A(I,J)*X(J)
END DO
END DO
X(N) = X(N)/A(N,N)

En este algoritmo la secuencia de acceso a los elementos de la matriz es la siguiente:


1 2
3 4
5 6
7
l11 l21 l31 l41 0 l22 l32 l42

0 0 l33 l43

10
0 0 0 l44

Evidentemente la segunda forma es la ms eficiente para acceder a la informacin. A


pesar que el almacenamiento de ceros sigue siendo un despilfarro de memoria.

3.0 Tipos derivados de datos


3.1 Generalidades
Se puede declarar con una serie de sentencias agrupadas en una declaracin TYPE,
tienen la sintaxis siguiente:
TYPE nombre_tipo
Declaracin
Declaracin
END TYPE nombre_tipo

En esta definicin pueden incluirse tantas sentencias como se quiera, el identificador


nombre_tipo es un nombre vlido y ser la denominacin adjudicada al tipo derivado.
Luego stas se las usa en un programa principal usando la siguientes sintaxis
TYPE (nombre_tipo)

:: estructura1, estructura2, .

Tambin es posible declarar un arreglo usando la siguiente sintaxis


TYPE (nombre_tipo), DIMENSION (A,B,) :: estructura1, estructura2, .

- 25 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

Cuando se adjudica valores se escribe una serie de constantes, valores lista


componentes del mismo tipo y en el mismo orden que las componentes del tipo
derivado de datos, en forma general se escribe:
nombre_tipo (valores de lista componentes)

Esta forma de definir un valor constante para un tipo derivado de datos, se conoce con
el nombre de constructor de estructura, adems es posible referirse directamente a una
determinada componente de una estructura escribiendo el nombre de esa estructura
seguido del smbolo % y del nombre de la componente:
Nombre_estructura%nombre_componente

Con los tipos derivados de datos as como con sus componentes pueden hacerse ciertas
operaciones.
1. Encapsular un tipo dentro de otro tipo: en la definicin de tipo derivado se puede usar a
su vez otro.
2. Asignar valores a las variables de un tipo derivado: dado que cada componente de una
estructura posee cierto tipo declarado, tal componente se puede utilizar de la misma
forma que se hace con cualquier otro dato del mismo tipo.
3. Entrada y salida de componentes de un tipo derivado.
READ *, elemento%nombre
PRINT *, elemento%nombre

En cuanto a la entrada o salida de una estructura, sta debe hacerse leyendo o


visualizando elemento a elemento, es decir el valor de cada una de las componentes de
forma individual.

3.2 Ejemplos
1. Escribir un programa que lee las coordenadas de dos puntos en el plano, p1(x1,y1),
p2(x2,y2) y calcule los tres coeficientes a,b,c de la recta que los une, sabiendo que esa
ecuacin tiene la forma: ax + by +c = 0, los tres coeficientes de la recta, en funcin de
las coordenadas de los dos puntos son: a = y2 y1, b = x1 x2, c = y1.x2 y2.x1
2. La distancia entre dos puntos de coordenadas (x1,y1) y (x2,y2) est dada por

La pendiente de la ecuacin de la recta m se define como:


Donde b es la interseccin de la recta en el eje y, usando la pendiente b
puede calcularse como
Si x1 = x2 entonces no existe interseccin de la recta con el eje y y la pendiente
no est definida y la recta que pasa por estos dos puntos es una vertical de
ecuacin
Escriba un programa que calcule la distancia entre dos puntos dados y determine
la ecuacin de la recta que pasa por ellos.

- 26 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

3.

Leer de un archivo de datos la informacin de los usuarios de una red siguiendo el


formato que sigue: apellido, nombre, Nmero id, contrasea, total de recursos asignados
y total de recursos empleados, la primera cantidad est en dlares tres cifras enteras y
dos decimales, sin embargo debe ser procesado como nmero real. Organizando esta
informacin en estructura de tipos derivados de datos. Se ingresa el identificador y el
programa busca de la lista y se detiene, extrae toda la informacin pertinente y la
imprime en pantalla, de ser necesario el programa debe poder ingresar informacin
adicional en el archivo de datos.
Un ejemplo de ingreso de informacin es el que sigue:
ESCOBAR
MEZA
YUNGAN

PAUL
10101ADA
PABLO
10102APLIC
GEOVANNY 10103CALC

- 27 -

75038081
65059884
25019374

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

4.0 El ambiente de trabajo Developer Studio


La ruta de acceso al ambiente es: Inicio/Programas/Visual Fortran 6.0/Developer
Studio. Esta ruta ejecuta el escritorio de trabajo de Visual, ste a su vez muestra una
pantalla dividida en cuatro partes, la superior es la seccin de comandos y mens, que
pueden ser personalizadas desde la opcin CUSTOMIZE, del men TOOLS; a la
izquierda aparece la seccin del espacio de trabajo, la mayor parte de la pantalla la
ocupa el escritorio, editor de texto; en la parte inferior se encuentra la pantalla de salida,
donde se indican las observaciones durante la ejecucin o compilacin del programa.
Vase la figura No. 2

Explorador
del espacio
de trabajo

Escritorio de trabajo

Resultado de los procesos

Figura No. 2.- Pantalla inicial

En este ambiente, los programas se organizan de la siguiente forma:


1. Cada archivo que contiene un cdigo fuente debe corresponder a un proyecto de
trabajo; varios archivos con cdigo fuente pueden ser parte de un proyecto de
trabajo, pero solo uno puede tener el ttulo de PROGRAM.
2. Los proyectos se almacenan en espacios de trabajo, luego varios proyectos
pueden estar contenidos en un espacio de trabajo.
3. Cada Espacio de trabajo se guarda en una carpeta independiente del mismo
nombre del espacio de trabajo. El archivo que resulta de la compilacin del
programa lleva el nombre del Proyecto de trabajo.

- 28 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

4. Dentro de la carpeta que contiene el espacio de trabajo se crea una carpeta de


nombre DEBUG, que puede ser personalizada y cambiada de nombre desde la
opcin SETTINGS del men PROJECT. En dicha carpeta se almacenan los
archivos intermedios y el ejecutable producto de la compilacin.

4.1 Iniciando un proyecto


El procedimiento para iniciar un proyecto se lo hace siguiendo la ruta: FILE/NEW; se
abre un cuadro de dilogo con varias pestaas, pero por haber optado la opcin de
nuevo, aparece la pestaa de PROJECT, por defecto. Visual Fortran reconoce cinco
tipos de proyectos y dos tipos de herramientas de construccin. Los proyectos van
relacionados con la aplicacin final de la compilacin y enlace. Las herramientas con
accesorios extras para facilitar la construccin de programas. Vase la figura No. 3.

Figura No.3.- Tipos de proyectos

Los cinco tipos de proyectos que soporta Visual Fortran son:


1. Fortran Console Aplication: Genera un programa con extensin *.EXE, este tipo
de proyecto no requiere pantalla grfica para mostrar sus datos de salida; luce
parecida a un programa corriendo bajo UNIX o a una Terminal conectada a un
servidor. Opera con una sola ventana y la interaccin se resume a leer y escribir,
es mejor usarla cuando el problema requiere salidas numricas y no grficas, es
el proyecto ms fcil de hacer correr en otras plataformas.
2. Fortran Standard Graphics o QuickWin Aplication: Genera un programa con
extensin *.EXE. Existen dos tipos de este proyecto: el que contiene una sola
ventana y el que contiene mltiples ventanas, el primero luce igual que una
aplicacin basada en DOS, en ambas es posible usar opciones grficas o

- 29 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

representar grficos como salida de la informacin. El tamao de la ventana


virtual puede ser seleccionada. En este tipo de proyecto se pueden usar rutinas
QUICKWIN, con varias opciones para hacer de las aplicaciones ms amigables,
el mdulo DFLIB trabaja con este tipo de proyectos.
3. Fortran Windows Aplication: Genera un programa con extensin *.EXE, son
proyectos que pueden usar todas las opciones API, dando a la aplicacin mucha
ms interactividad con el usuario. Tambin se pueden llamar a funciones de
otras aplicaciones como las de C++. El mdulo DFWIN contiene todas estas
opciones.
4. Fortran Dynamic Link Libraries: Genera un archivo con extensin *.DLL, es un
conjunto de cdigo fuente compilada, que contiene solo subprogramas con
funciones o utilidades que son usadas desde el programa principal, se caracteriza
por ser independientes de ste, pero deben encontrarse en el mismo directorio de
la aplicacin principal para que pueda ser usada.
5. Fortran Static Library: Genera un archivo con extensin *.LIB, es un conjunto
de cdigo fuente compilado, que contiene subprogramas que sern usados por la
aplicacin principal y necesariamente son vinculados o enlazados en el
programa principal para que puedan ser usados.
Una vez seleccionado y definido el tipo de proyecto que se quiere realizar, se crean los
archivos de cdigo fuente, usando la misma ruta de comandos FILE/NEW, pero esta
vez como ya est definido el proyecto se abre la pestaa de FILE. Vase la figura No. 4.

Figura No. 4.- Tipos de archivos


Note que para ahorrarnos un paso posterior debemos verificar que la casilla ADD TO
PROJECT est marcada, de esta forma el archivo que se crea queda almacenado como
parte del proyecto. Como inicialmente se va a comenzar con un archivo de cdigo

- 30 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

fuente, se selecciona entre el tipo de archivo FORTRAN FIXED FORMAT o el


FORTRAN FREE FORMAT, de acuerdo a nuestras exigencias. Los nombres que se
den a los archivos deben ser solo letras y nmeros, sin espacios ni caracteres especiales,
salvo la barra baja ( _ ).
Creado el archivo, ste se guarda en la carpeta denominada SOURCE, del proyecto
activo. Cuando un proyecto es definido se crean por defecto 3 carpetas:
1.
2.
3.

Source Files: donde se almacenan los programas fuente, con extensin *.FOR
o *.F90.
Header Files: donde se almacenan los archivos de interface con extensin
*.FD o *.FI, entre el programa fuente y los recursos de visual.
Resource Files: donde se almacenan los recursos de visual (cuadros de
dilogo, conos, men, etc.), archivos con extensin *.RC.

Figura No. 5.- Carpetas del proyecto

4.2 Ejemplos
1. Escriba un programa que permita realizar operaciones con nmeros complejos,
es necesario ingresar la informacin desde pantalla y el resultado debe mostrarse
en la pantalla.
Solucin
De acuerdo al esquema mostrado en la figura No. 1, la codificacin de este
programa en formato libre es la siguiente:
! Iniciamos con el titulo del programa
program complejos
! Se evita que el programa adopte la variables por defecto
implicit none
! Definicin de variables
complex a,b,c
integer n
! Bloque de ejecucin
! Ingresa el primer nmero complejo
write(*,*)'Ingrese un nmero complejo, como par ordenado'
read(*,*)a

- 31 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1
! Ingresa y se lee desde pantalla el segundo nmero complejo
write(*,*)'Ingrese un nmero complejo, como par ordenado'
read(*,*)b
! Pregunta que tipo de operacin desea
! note que se usa formato de escritura
write(*,10)
read(*,*)n
! Ejecucin de las operaciones
select case(n)
case(1)
c=a+b
case(2)
c=a-b
case(3)
c=a*b
case(4)
c=a/b
case(5)
c=a**b
end select
! Presentacin de resultados en pantalla
write(*,20)c
! Presenta las opciones para operar con complejos
10 format(/' Seleccione la operacin que desea realizar',/,&
&' 1 Suma',/,' 2 Resta',/,' 3 Producto',/,' 4 Cociente',/,' 5 Potencia')
20 format(' El resultado de la operacin es: ','('f10.4,',',f10.4,')')
End

Figura No. 6.- Ejecucin del programa


2. Escriba un programa que permita guardar la informacin del ejemplo anterior en
un archivo con nombre proporcionado por el usuario.
Solucin
Al cdigo fuente anterior, antes de la declaracin end podemos adicionar las
siguientes lneas:

- 32 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1
! Impresin en un archivo de toda esta informacin
write(*,*)'Ingrese el nombre del archivo'
read(*,*)archivo
! Abrimos el archivo y le asignamos un nmero y un status
! Note la condicin 'err=100' para evitar que el programa
! termine de manera inesperada, en caso de que el archivo
! no sea nuevo, la ejecucin del programa pasa a la lnea 100
open(1,file=archivo,status='new',err=100)
! Se escribe la informacin en el archivo, usando formatos
write(1,30)
write(1,40)a,b
write(1,50)texto,c
! Cerramos el archivo
close (1,status='keep')
write(*,*)' Se ha generado un archivo de resultados'
! Definimos los formatos de escritura
30 format(/,' ARCHIVO DE RESULTADOS',/,' Calculadora de complejos')
40 format(' Los nmeros imaginarios ingresados son: ',/,'(',f6.3,',',f6.3,')',/,&
&' (',f6.3,',',f6.3,')')
50 format(' El resultado de la operacin ',a8,' es:', '(',f6.3,',',f6.3,')')
100 end

Previamente deben haberse definido dos variables del tipo alfanumricas,


archivo, para almacenar el nombre del archivo de resultados y texto, para
nombrar el tipo de operacin que se realiz con los nmeros. El archivo de
resultados se mostrara como se indica en la figura No. 7.

Figura No. 7.- Archivo de resultados.

- 33 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

5.0 Subprogramas, creacin y usos


Son codificaciones que definen acciones y no tienen las caractersticas de un programa
principal; de acuerdo a su uso pueden ser:
1. Subrutinas
2. Mdulos
3. Funciones
4. Interfaces
5. Bloques de datos

5.1 Subrutinas
5.1.1 Definicin
Son subprogramas con igual estructura que un programa, salvo por su ttulo, inicia con
la lnea especificando la expresin SUBROUTINE y depende del tipo de subrutina los
argumentos necesarios. Una subrutina se invoca con la declaracin CALL desde el
programa principal y retorna un valor o varios de la ejecucin de la misma.
Existen 3 tipos de subrutinas:
1. Recursiva: permite incidencia de lo ocurrido sobre s misma
2. Pura: los procedimientos que se ejecuten no pueden incidir sobre s misma
3. Elemental: los procedimientos estn restringidos al hecho de que no se pueden
usar los arreglos de manera simultnea.
La sintaxis de la lnea inicial es la siguiente
[prefijo] SUBROUTINE nombre (lista de argumentos)
El prefijo es opcional y tiene que ver con el tipo de subrutina descrito en el prrafo
anterior: RECURSIVE, PURE, ELEMENTAL, por omisin es pura (PURE). El nombre
de la subrutina sigue las mismas reglas que el de un programa principal, es decir, es una
cadena alfanumrica que inicia con una letra y no puede contener caracteres especiales,
salvo barra baja. La lista de argumentos es opcional, si es que los tiene van separados
por comas.
Las reglas de su uso:
1. Los argumentos de llamada, si los hay, deben ser del mismo tipo que los usados
en la ejecucin de la subrutina.
2. La ejecucin de la subrutina empieza con la primera lnea despus del ttulo
SUBROUTINE, y retorna el control al programa principal cuando se ha
invocado la declaracin END o RETURN.
3. Una subrutina no puede contener declaraciones de otros subprogramas.

5.1.2 Ejemplo
El siguiente cdigo muestra el llamado a una subrutina PURE, con y sin argumentos
para ilustrar su uso. El resultado de la ejecucin se muestra en la figura No. 8.
program ejemplo
implicit none
! Definicin de variables
real x,y,z

- 34 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1
! Bloque de ejecucin
! Llamado a subrutina
call caratula
call calculos(x,y,z)
call impresion(x)
! fin de llamado a subrutinas
end
! Subrutina Cartula, para la pantalla
! inicial de presentacin
subroutine caratula
implicit none
write(*,10)
10 format(/,' PROGRAMA QUE SUMA DOS NUMEROS REALES',/,&
&' Dados Y y Z, obtiene la operacin X = Y+Z',/)
end subroutine
! Subrutina calculos, solicita la informacion por
! pantalla y calcula el valor
subroutine calculos (x,y,z)
implicit none
real x,y,z
write(*,*)' Ingrese el valor de Y'
read(*,*)y
write(*,*)' Ingrese el valor de Z'
read(*,*)z
! realiza el clculo
x=y+z
end subroutine
! Subrutina impresion
subroutine impresion(x)
implicit none
real x
write(*,10)x
10 format(/,' El resultado es: ',e10.4)
End subroutine

Figura No. 8.- Resultado de la ejecucin

5.2 Mdulos
5.2.1 Definicin
Es un subprograma que contiene especificaciones y definiciones que pueden ser usadas
por otros subprogramas o por un programa principal. El nombre del mdulo es

- 35 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

considerado global y nico, no puede repetirse en ningn subprograma, funcin o


procedimiento del programa al que pertenece.
El mdulo no puede hacer referencia a s mismo y sus subprogramas son
independientes entre s, toda accin ejecutable debe especificarse en stos.
La sintaxis usada para definir un mdulo es la siguiente:
MODULE nombre
[especificaciones]
[CONTAINS
subprograma
[subprograma] ...]
END [MODULE [nombre]]
El nombre del mdulo debe cumplir las mismas reglas de asignacin de nombres que se
usan para subrutinas, en la seccin de especificaciones se pueden definir variables o
definir tipos de informacin que va a contener, si se usa esta parte de especificaciones es
mandatario colocar al final la declaracin CONTAINS y luego describir todos los
subprogramas que contiene el mdulo, sean stos: subrutinas, funciones, bloques de
datos, etc. El mdulo finaliza con la declaracin END.
Para usar un mdulo en el programa principal, la declaracin USE despus del ttulo del
programa es colocada y a continuacin el nombre del mdulo, el mdulo debe
compilarse previamente al archivo que contiene el programa principal. El producto de
la compilacin de un mdulo es un archivo con extensin *.MOD que se aloja en la
carpeta DEBUG (por defecto) es decir, en el mismo lugar donde se crear el ejecutable.
Si no queremos compilar en futuras ocasiones el mdulo y lo necesitamos en otro
programa, basta con llevar este archivo *.mod, copiado a la carpeta DEBUG del nuevo
proyecto.

5.2.2 Ejemplo
El ejemplo muestra el uso de mdulos para definir variables que sern usadas en el
programa principal y las subrutinas que son llamadas desde ste, aunque el programa es
sencillo y realiza operacin entre complejos, la aplicacin en problemas ms elaborados
es similar.
El cdigo del programa principal es el siguiente:
program usomodulo
! Declaracin para usar el mdulo
use ejemplo
use variables
! Bloque de ejecucin
write(*,10)
! Llamada a subrutinas del mdulo
call primera(a,b)
call segunda(a,b,c)
call tercera(c)
! Definicin de formatos
10 format(/,'PROGRAMA USANDO MODULOS',/)
! Fin del programa principal
end

- 36 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

El cdigo del mdulo Variables, que hace la declaracin de variables usadas en el


programa principal, es:
module variables
real a
complex b,c
end module variables

El cdigo fuente para el mdulo de ejecucin de las subrutinas, llamado ejemplo en el


programa principal es el siguiente:
module ejemplo
implicit none
contains
subroutine primera(x,y)
real x
complex y
write(*,*)'Ingrese un real'
read(*,*)x
write(*,*)'Ingrese un complejo como par ordenado'
read(*,*)y
end subroutine
subroutine segunda(x,y,z)
real x
complex y,z
z=y*x
end subroutine
subroutine tercera(z)
complex z
write(*,*)' La respuesta es'
write(*,*)z
end subroutine
end module ejemplo

El resultado de la ejecucin se muestra en la figura No. 9.

Figura No. 9.- Resultado de la ejecucin

- 37 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

5.3 Funciones
5.3.1 Definicin
Es un subprograma que evala una expresin y retorna un valor, que se almacena en la
variable que se usa. Dentro de su bloque de ejecucin no puede tener ningn otro tipo
de subprograma o hacer referencia a ellos.
La sintaxis que usa una funcin es la siguiente:
[prefijo] FUNCTION nombre ([lista de argumentos]) [RESULT (variable)]
Bloque que ejecucin
END FUNCTION [nombre]
El prefijo es el mismo que se usa para las subrutinas o define el tipo de funcin que es:
entera, real, alfanumrica o compleja; el nombre cumple con las mismas reglas para
nombrar subprogramas, la lista de argumentos son las variables de entrada y si es el
caso se especifica la variable de salida que resultar de la ejecucin de la funcin.
Cuando la funcin es invocada desde el programa principal simplemente se lo hace con
el nombre de la funcin y el listado de argumentos, de la misma manera que se llama
una funcin implcita del lenguaje.

5.3.2 Ejemplo
El siguiente ejemplo ilustra el uso de funciones en un programa principal, la funcin es
del tipo real y obtiene la semisuma de dos nmeros complejos, al final el resultado es
mostrado por pantalla.
El cdigo fuente del programa principal es el que sigue:
program usofuncion
implicit none
! Definicin de variables
complex x,y,z,semisuma
! bloque de ejecucin
! Ingreso de la informacin
write(*,*)'Ingrese un complejo como par ordenado'
read(*,*)x
write(*,*)'Ingrese un complejo como par ordenado'
read(*,*)y
! Clculo de la funcin
z=semisuma(x,y)
! Escritura de resultados
write(*,*)'el resultado es: '
write(*,*)z
! fin del bloque de ejecucin
end

La funcin SEMISUMA, se define de la siguiente manera


complex function semisuma(x,y)
complex x,y
semisuma=(x+y)/2.0
end function semisuma

El resultado de la ejecucin del programa se muestra en la figura No. 10.

- 38 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

Figura No. 10.- Ejecucin del programa

5.4 Interfaces
5.4.1 Definicin
Es un subprograma que define interfaces explcitas para subprogramas externos o
procedimientos. Tambin pueden ser usados para definir un nombre genrico para
procedimientos, un nuevo operador para funciones o una nueva asignacin para
subrutinas. Puede contener subrutinas o funciones.
Una interface va ubicada en el cuerpo del programa y no puede contener la declaracin
FORMAT, pero si puede hacer referencia a mdulos usando la declaracin USE.
La sintaxis de las interfaces es la siguiente:
INTERFACE [ nombre o especificacin ]
[declaraciones] ...
[ MODULE PROCEDURE nombres o lista de nombres ] ...
END INTERFACE [ nombre o especificacin ]

- 39 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

6.0 Libreras, creacin y usos


6.1 Libreras Estticas (Static Libraries)
6.1.1 Definiciones
Son bloques de codificacin compilados que se mantienen separados del programa
principal, y corresponden a uno de los tipos de proyecto del Estudio de desarrollo
(Developer Studio).
Las libreras estticas ofrecen ventajas de organizacin de programas grandes y para
compartir rutinas entre varios programas; estas libreras contienen solo subprogramas y
el resultado de su compilacin es un archivo con extensin *.LIB. Cuando asociamos
estas libreras al programa, solamente las rutinas necesarias son enlazadas para la
obtencin del programa ejecutable, optimizando de esta manera el tamao de la
aplicacin. Normalmente estos archivos *.LIB se mantienen en sus propios directorios.

6.1.2 Forma de usar


Para crear una Librera Esttica, se elije como tipo de proyecto el denominado:
FORTRAN STATIC LIBRARY, del cuadro de dilogo, posteriormente se codifica
cualquier tipo de subprograma, se compila y obtenemos el archivo .LIB. Cuando
queramos usarlo en otro programa o hacer referencia a los subprogramas que contiene,
desde otro proyecto, simplemente lo adicionamos al proyecto desde el men
PROJECT/ADD TO PROJECT/FILES, se busca la localizacin del archivo y se adjunta
el archivo. Una vez adicionada en el panel de vistas, localizado a la izquierda del editor
debe aparecer a continuacin de las carpetas creadas por defecto, con el nombre y la
extensin, como muestra la figura No. 11.

Figura No. 11.- Librera adicionada al proyecto


Luego se modifica la configuracin de enlace usando el cuadro de dilogo
SETTINGS/LINK, del men PROJECT. En este cuadro de dilogo, en el casillero
final PROJECT OPTIONS, se escribe la siguiente lnea: /nodefaultlib: libc.lib para
evitar conflictos con las libreras que se asociaron a nuestro archivo LIB, durante su
compilacin, como se muestra en la figura No. 12.
Una vez realizados estos pasos, se compila y construye el ejecutable del proyecto que
estamos realizando.

- 40 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

Figura No. 12.- Configuracin para adicionar archivos LIB

6.2 Libreras dinmicas (Dynamic Link Libraries)


6.2.1 Definiciones
Son bloques de codificacin compilados que se mantienen separados del programa
principal, enlazados independientemente de la aplicacin que las usa, y corresponde a
uno de los tipos de proyecto del Estudio de desarrollo (Developer Studio). No puede
contener un programa principal, solo subprogramas.
Una DLL ofrece ventajas de organizacin de proyectos superiores a las de una librera
esttica, generando un ejecutable de menor tamao, la codificacin no est incluida en
el programa pero est asociada a l mientras se ejecuta, otra ventaja es que varios
programas pueden usar la misma DLL sin que se hayan compilado con ella.
En Visual Fortran se pueden generar DLL de dos formas:
1. Eligiendo como tipo de proyecto un DLL, con rutinas propias e independientes.
2. Construir aplicaciones con la opcin RUN-TIME LIBRARY almacenada en un
lugar dentro del proyecto del programa principal, siguiendo estos pasos:
a. En el men PROJECT seleccionar SETTINGS.
b. En la pestaa FORTRAN seleccionar la categora LIBRARY.
c. En el cuadro USE FORTRAN RUN-TIME LIBRARIES, seleccionar
DLL.

6.2.2 Forma de usar


1. Codificacin de un archivo DLL: se requiere incluir en las directivas de
compilacin: cDEC$ ATTRIBUTES DLLIMPORT o DLLEXPORT, las
variables deben ser declaradas en el programa principal y en la DLL.

- 41 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

2. Si en un programa o subprograma se usa la declaracin DLLEXPORT, declara


que el subprograma proviene de una DLL, que ser usado por otra programa o
subprograma exterior a la DLL. Si se usa la declaracin DLLIMPORT, declara
que el subprograma necesario para alguna ejecucin proviene de una DLL.
3. Para construir una DLL se siguen los siguientes pasos:
a. Seleccionar el tipo de proyecto como DLL
b. Codificar el subprograma con las opciones de directivas de compilacin
y crear el archivo DLL.
c. Importar al proyecto principal que usar la DLL, con la opcin Add to
Project el archivo LIB que se genera en la creacin de la DLL.
d. Compilar el Proyecto principal, copiar el archivo DLL al directorio que
contiene el ejecutable del proyecto principal.
4. Las DLL solo pueden usarse en proyectos del tipo Standard Console, para leer y
escribir, y en cualquier tipo de proyecto solo para realizar clculos, no ingreso
de datos ni lectura desde pantalla o archivos, no pueden usarse en Quick Win
Application, con el mdulo DFLIB.

6.2.3 Ejemplo
Se va a realizar la codificacin del proyecto DLL y luego la del programa principal,
para ilustrar el uso de las libreras DLL.
Se crearn 4 subrutinas divididas en 2 archivos DLL, uno para realizar sumas y restas y
otro para divisin y multiplicacin. Las variantes que se hacen es que en el de sumas y
restas se generan un archivo para cada subrutina, contenidos en el mismo proyecto. Y
para el caso de producto en el mismo archivo se generan las dos subrutinas.
El cdigo del programa principal es el siguiente:
program main
!DEC$ ATTRIBUTES
!DEC$ ATTRIBUTES
!DEC$ ATTRIBUTES
!DEC$ ATTRIBUTES
implicit none
real :: x,y,z

DLLIMPORT::LIBRERIAS
DLLEXPORT::PRODUCTOS
DLLEXPORT::CASOS
DLLEXPORT::COCIENTES

write(*,*)'Ingrese x'
read(*,*)x
write(*,*)'Ingrese Y'
read(*,*)y
call librerias(x,y,z)
write(*,*)'la suma es: ',z
call casos(x,y,z)
write(*,*)'La resta es: ',z
call productos(x,y,z)
write(*,*)'El producto es: ',z
call cocientes(x,y,z)
write(*,*)'El cociente es: ',z
end

- 42 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

En este cdigo podemos observar que la declaracin de atributos se hace para cada
subrutina, no para cada archivo, las cuatro lneas se pueden simplificar usando comas
para separar el nombre de las subrutinas.
Las subrutinas del para sumar y restar son las siguientes, una en cada archivo.
! LIBRERIAS.f90
! FUNCTIONS/SUBROUTINES exportadas desde LIBRERIAS.dll:
!
LIBRERIAS
- subroutine
!
subroutine LIBRERIAS(X,Y,Z)
!DEC$ ATTRIBUTES DLLEXPORT::LIBRERIAS
implicit none
real :: x,y,z
z = x+y
end subroutine LIBRERIAS
! Fin del archivo
! LIBRERIAS.f90
! FUNCTIONS/SUBROUTINES exportadas desde LIBRERIAS.dll:
!
LIBRERIAS
- subroutine
!
subroutine CASOS(X,Y,Z)
!DEC$ ATTRIBUTES DLLEXPORT::CASOS
implicit none
real :: x,y,z
z = x-y
end subroutine CASOS
! Fin del archivo

La codificacin de las subrutinas para productos en el mismo archivo es la siguiente:


! PRODUCTOS.f90
! FUNCTIONS/SUBROUTINES exported from PRODUCTOS.dll:
!
PRODUCTOS
- subroutine
!
subroutine PRODUCTOS(x,y,z)
!DEC$ ATTRIBUTES DLLEXPORT::PRODUCTOS
implicit none
real :: x,y,z
z = x*y
end subroutine PRODUCTOS
!---------------------------------------------------! PRODUCTOS.f90
! FUNCTIONS/SUBROUTINES exported from PRODUCTOS.dll:
!
PRODUCTOS
- subroutine
!
subroutine cocientes(x,y,z)
!DEC$ ATTRIBUTES DLLEXPORT::COCIENTES
implicit none
real :: x,y,z
z = x/y
end subroutine cocientes
! Fin del archivo

- 43 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

7.0 Personalizacin de programas


7.1 Generalidades
Para acceder a las libreras de QUICK WIN GRAPHICS, se debe usar la declaracin
USE DFLIB, ubicada despus del nombre del programa. Si se va a usar otras opciones
de Visual es necesario adicionar sentencias adicionales. Estas libreras son de interfase,
almacenadas en el mdulo DFLIB.MOD

7.2 Propiedades de la ventana


Las funciones que controlan el tamao de la ventana virtual y la ventana visible y
tamaos de letra y resolucin son SETWINDOWCONFIG y GETWINDOWCONFIG,
para la ventana virtual y SETWSIZEQQ para la ventana visible, normalmente ms
pequea que la virtual.
Las configuraciones posibles son:
TYPE windowconfig
INTEGER(2) numxpixels
INTEGER(2) numypixels
INTEGER(2) numtextcols
INTEGER(2) numtextrows
INTEGER(2) numcolors
INTEGER(4) fontsize
CHARACTER(80) title
INTEGER(2) bitsperpixel

!
!
!
!
!
!
!
!
!
!
!

Nmero de pixels eje X


Nmero de pixels eje Y
Nmero de columnas para texto
Number de filas de texto
Indice del color
Tamao de la fuente.
Ttulo de la ventana (caracteres)
Nmeros de bits por pixel.
Este valor
es calculado por el sistema y es
parmetro de salida.

END TYPE windowconfig

Ejemplo de codificacin para personalizar las propiedades de la ventana:


USE DFLIB
TYPE (windowconfig) wc
LOGICAL status
! Configura x & y pixels a 800X600 y el tamao de la fuente en 8x12.
wc.numxpixels = 800
wc.numypixels = -1
wc.numtextcols = -1
wc.numtextrows = 302
wc.numcolors
= -1
wc.title
= " "C
wc.fontsize
= #0008000C
status
= SETWINDOWCONFIG(wc)

7.3 Creacin de mltiples ventanas


Para crear varias ventanas se debe usar la opcin FILE=USER de la sentencia OPEN.
Por defecto la ventana hija tiene un tamao de 30 filas y 80 columnas y se puede abrir
hasta 40 ventanas.
OPEN(UNIT=10, FILE=USER,TITLE=Ventana adicional)

- 44 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

Para que esta ventana sea activa debe recibir salidas de texto o grficos pero no por eso
al estar abierta con otras ventanas sta es la superior o la primera que se presenta, para
que esto ocurra se debe usar la sentencia IOFOCUS, en las opciones de la sentencia
OPEN o como una funcin INQFOCUSQQ del tipo entero.
OPEN(UNIT=10,FILE=USER,TITLE=Ventana Adicional, IOFOCUS=.TRUE.)
USE DFLIB
INTEGER(4) status, focusunit
OPEN(UNIT = 10, FILE = 'USER', TITLE = 'Child Window 1')
OPEN(UNIT = 11, FILE = 'USER', TITLE = 'Child Window 2')
! Convierte en ventana active a la ventana 2
WRITE (11, *) 'Giving focus to Child 2.'
! Convierte en ventana activa a la 1 con la funcin FOCUSQQ
status = FOCUSQQ(10)
...
! Determina que ventana est activa y la almacena en la variable
status = INQFOCUSQQ(focusunit)

El tamao y ubicacin de la ventana secundaria se la controla con la funcin


SETWSIZEQQ como se indica en el ejemplo
USE DFLIB
INTEGER(4) status
TYPE (QWINFO) winfo
OPEN (4, FILE='USER')
winfo.H
= 30
winfo.W
= 80
winfo.TYPE = QWIN$SET
status
= SETWSIZEQQ(4, winfo)

o si se quiere simplemente maximizar la ventana se adiciona en el programa la siguiente


lnea:
status = GETWSIZEQQ(QWIN$FRAMEWINDOW, QWIN$SIZEMAX, winfo)

El control de colores del fondo de las ventanas va de acuerdo al monitor que se


disponga, para los VGA usa 256 colores. Lla variable que controla el color del fondo
es del tipo entera, la sintaxis es la siguiente: la funcin SETBKCOLOR usa 16 colores
I = SETBKCOLOR (14)
call clearscreen($gclearscreen)

Si se usa la funcin SETBKCOLORRGB, el nmero debe ser escrito en hexadecimal, la


opcin es de usar 256 colores.

7.4 Graficacin y escritura en la pantalla


Fortran considera la pantalla en pixeles, donde el origen se encuentra en la esquina
superior izquierda, siendo X positivo hacia la derecha y Y positivo hacia abajo. Sin
embargo el origen puede reubicarse usando la subrutina SETVIEWORG, la sintaxis
empleada es la siguiente:
TYPE (xycoord) origen
CALL SETVIEWORG(INT2(x), INT2(y), origen)

- 45 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

Y a partir de esta llamada la convencin se signos se mantiene.


Para colocarnos en cualquier lugar de la pantalla se usa la subrutina MOVETO, con la
siguiente sintaxis:
TYPE (xycoord)xy
CALL MOVETO(INT2(x), INT2(y), XY)

Finalmente podemos definir la ventana de trabajo con la subrutina SETVIEWPORT, e


ingresando las coordenadas que definen el rectngulo de la ventana, el origen de esta
ventana se encuentra en la parte superior izquierda.
CALL SETVIEWPORT (x1, y1, x2, y2)

Para escribir texto en pantalla se debe definir primero el color del texto y luego otras
configuraciones usando la subrutina OUTGTEXT y el texto que debe mostrarse, las
lneas de cdigo para hacerlo son:
TYPE (xycoord) xys
! Inicio de la configuracin del texto a escribirse
I = INITIALIZEFONTS()
! Caractersticas de la fuente: tipo, tamao, etc
I = SETFONT('t''Arial''h18w10pvib')
! Color de la fuente un nmero del 1 al 16
I = SETCOLOR(INT2(5))
! Ubicacin del texto en pixels dentro de la ventana active, ntese
! que se necesita definer un tipo de objeto coordenadas
CALL MOVETO(INT2(0),INT2(30),xys)
! Texto que se escribir
CALL OUTGTEXT('he escrito este texto')

Para dibujar figuras, la secuencia es la misma solo que en lugar de llamar a la subrutina
OUTGTEXT, se usa la funcin de la figura que se desea dibujar. Esta funcin es del
tipo entera, las funciones que soporta FORTRAN son lneas, rectngulos, elipses y
polgonos. Adems de relleno de estas figuras y opciones de estilo de lnea, siempre
usando como coordenadas los pxeles.
! Dibuja un rectngulo/elipse, el parmetro control puede tener dos
valores: ! $GFILLINTERIOR que indica que el rectngulo ser coloreado
totalmente y no se podr definir la lnea de contorno, y $GBORDER
dibuja el contorno del rectngulo/elipse y el interior transparente.
x1,y1,x2,y2 son las coordenadas en pixeles de la esquina superior
izquierda y la esquina inferior derecha.
i = RECTANGLE (control, x1, y1, x2, y2)
i = ELLIPSE(control, x1,y1,x2,y2)
! Dibuja una lnea desde la posicin actual hasta las coordenadas en
! pixels x,y.
i = LINETO(x,y)
!
!

Dibuja un polgono de n lados, el parmetro control puede tener dos


valores: $GFILLINTERIOR que indica que el rectngulo ser coloreado
totalmente y no se podr definir la lnea de contorno, y $GBORDER
dibuja el contorno del polgono y el interior transparente.
ppoints es un arreglo que contiene las coordenadas de los vrtices
del polgono, en pixeles. Cpoints es el nmero de vrtices.
= POLYGON (control, ppoints, cpoints)

- 46 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

7.5 Insertando imgenes


Para insertar imgenes en la pantalla se usa la funcin entera LOADIMAGE, que tiene
3 argumentos: el nombre del archivo, formato *.BMP y las coordenadas en pixeles
observando las normas descritas.
i = LOADIMAGE ('name.bmp', ixcoord, iycoord)

Es importante tomar en cuenta que el formato de mapa de bits no comprime las


imgenes por lo que los archivos suelen ser demasiado grandes. Si el archivo que se
intenta insertar en pantalla es ms grande en pixeles que el tamao de la ventana virtual,
FORTRAN ignora la imagen. Si se inserta alguna imagen comprimida la ignora, ya sea
de formato *.JPG, *.GIF, *.PNG

7.6 Mensajes de aviso


La funcin que controla los cuadros de mensajes es MESSAGEBOXQQ, del tipo entera
y usa los siguientes argumentos: mensaje, ttulo y objetos (botones y/o conos)
I4 = messageboxqq(mensajeC,tituloC,objeto.or.objeto.or.objeto)

1. MB$ABORTRETRYIGNORE: Botn de aborta, reintentar o ignorar.


2. MB$DEFBUTTON1: Primer botn activado por defecto.
3. MB$DEFBUTTON2: Segundo botn activado por defecto.
4. MB$DEFBUTTON3: Tercer botn activado por defecto.
5. MB$ICONASTERISK: Icono de globo con letra I en azul.
6. MB$ICONEXCLAMATION: Tringulo amarillo con el smbolo admiracin.
7. MB$ICONHAND: Crculo rojo con X blanca.
8. MB$ICONINFORMATION: Icono de globo con letra I en azul.
9. MB$ICONQUESTION: Icono de globo con en azul.
10. MB$ICONSTOP: Icono de error.
11. MB$OK: OK.
12. MB$OKCANCEL: OK y Cancelar.
13. MB$RETRYCANCEL: Reintentar y cancelar.
14. MB$SYSTEMMODAL: El cuadro es del tipo modal, toda ejecucin se
suspende hasta que el usuario ejecute el cuadro.
15. MB$YESNO: Si y NO.
16. MB$YESNOCANCEL: Si, No y Cancelar

Figura No. 13.- Ejemplo de Mensaje de aviso


El resultado de esta funcin es un entero del tipo que se presenta cuando el botn
respectivo ha sido presionado:
1. MB$IDABORT.

- 47 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

2.
3.
4.
5.
6.
7.

MB$IDCANCEL.
MB$IDIGNORE
MB$IDNO.
MB$IDOK.
MB$IDRETRY
MB$IDYES

Para evaluar las opciones se puede usar SELECT CASE y especificar las acciones para
cada botn que se presione.
El cuadro de dilogo ABOUT (Acerca de), de los mens de Ayuda de la barra de
mens de los programas tpicos pueden personalizarse, por defectos se muestran como
se grafica en la figura No. 14.

Figura No. 14.- Cuadro ABOT

La funcin entera: i = ABOUTBOXQQ (Ejemplo de personalizacin\rVersin


1.0\r(c) 2006C), personaliza este cuadro .

Figura No. 15.- Personalizacin del cuadro ABOUT

7.7 Personalizar el men de opciones


La funcin que controla el men es una del tipo lgica que no es necesario llamarla
desde el programa principal, basta con incluirla en alguna parte del cdigo fuente y se
actualizar el men. Cuando se omite esta funcin el men que aparece es el de
defecto.
LOGICAL(4) FUNCTION INITIALSETTINGS( )
USE DFLIB
EXTERNAL Subrutina1, subrutina2
LOGICAL(4) result
! Crea el primer menu llamado GAMES.
result = APPENDMENUQQ(1, $MENUENABLED, '&Games'C, NUL )
! Adiciona un item al men llamado TicTacToe.

- 48 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

result = APPENDMENUQQ(1, $MENUENABLED, '&TicTacToe'C, WINPRINT)


! Dibuja una lnea de separacin.
result = APPENDMENUQQ(1, $MENUSEPARATOR, ''C, NUL )
! Adiciona un item llamado Salir.
result = APPENDMENUQQ(1, $MENUENABLED, 'S&alir'C, WINEXIT )
! Crea un Segundo menu llamado Ayuda.
result = APPENDMENUQQ(2, $MENUENABLED, '&Ayuda'C, NUL )
result = APPENDMENUQQ(2, $MENUENABLED, '&QuickWin Help'C, WININDEX)
INITIALSETTINGS= .true.
END FUNCTION INITIALSETTINGS

Del cdigo anterior se observa que la funcin que controla las variaciones del men es
la funcin lgica APPENDMENUQQ que tiene 4 argumentos: el nmero de secuencia
en la que se crear el men, el primer men y sus submens tienen el nmero 1, el
segundo 2 y as en adelante, FLAGS corresponde a las opciones que se listan a
continuacin; TEXT el texto que aparecer en el men o submen: ROUTINE, es la
rutina que se ejecuta cuando se selecciona este men, puede ser una rutina por defecto
del sistema o rutinas creadas por el usuario.
log = APPENDMENUQQ (menuID, flags, text, routine)

La opciones del parmetro de estado FLAGS de men son:


1.
2.
3.
4.
5.
6.

$MENUGRAYED - Disables and grays out the menu item.


$MENUDISABLED - Disables but does not gray out the menu item.
$MENUENABLED - Enables the menu item.
$MENUSEPARATOR - Draws a separator bar.
$MENUCHECKED - Puts a check by the menu item.
$MENUUNCHECKED - Removes the check by the menu item.

Si queremos activar una tecla de acceso rpido para usar un men o submen con
ALT+LETRA, se coloca un & delante de la letra del nombre que aparecer como men
o submen que queremos activar y sta aparecer en la ventana de ejecucin del
programa subrayada. El parmetro ROUTINE corresponde al paso del comando a una
subrutina, propia de FORTRAN o una creada por el usuario, en caso de que el usuario
las haya creado se usa la sentencia EXTERNAL luego de USE DFLIB, para declarar
estas subrutinas. Las rutinas de FORTRAN son:
1.
2.
3.
4.
5.
6.
7.

WINPRINT - Prints the program.


WINSAVE - Saves the program.
WINEXIT - Terminates the program.
WINSELTEXT - Selects text from the current window.
WINSELGRAPH - Selects graphics from the current window.
WINSELALL - Selects the entire contents of the current window.
WINCOPY - Copies the selected text and/or graphics from the current window
to the Clipboard.
8. WINPASTE - Allows the user to paste Clipboard contents (text only) to the
current text window of the active window during a READ.
9. WINCLEARPASTE - Clears the paste buffer.
10. WINSIZETOFIT - Sizes output to fit window.
11. WINFULLSCREEN - Displays output in full screen.
12. WINSTATE - Toggles between pause and resume states of text output.

- 49 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

13. WINCASCADE - Cascades active windows.


14. WINTILE - Tiles active windows.
15. WINARRANGE - Arranges icons.
16. WINSTATUS - Enables a status bar.
17. WININDEX - Displays the index for QuickWin help.
18. WINUSING - Displays information on how to use Help.
19. WINABOUT - Displays information about the current QuickWin application.
20. NUL - No callback routine.
Cuando se desea simular
selecciones de men se usa la funcin entera
CLICKMENUQQ, con una de estas opciones:
1.
2.
3.
4.

QWIN$STATUS: Status command


QWIN$TILE: Tile command
QWIN$CASCADE: Cascade command
QWIN$ARRANGE: Arrange Icons command

i = CLICKMENUQQ (item)

7.8 Iconos de programas


La generacin de conos personalizados que aparecen cuando se minimiza la ventana
principal y como conos de las aplicaciones finales, se lo hace mediante los siguientes
pasos:
1. Seleccione desde el men INSERT, de la barra principal la opcin
RESOURCE; de la lista que aparece, seleccione ICON. La ventana de
herramientas de dibujo aparece.
2. Dibuje el cono.
3. Ponga nombre al cono, en la ventana principal debe llamarse frameicon y si
se quiere colocar en la ventana hija, se crea uno con el nombre de childicon,
para abrir el cuadro de propiedades de objeto presione ALT+ENTER, y en el
campo destinado para el ID (identificador del recurso) coloque el nombre. Ver
figura No. 16
4. Guarde el cono, seleccionando del men FILE la opcin SAVE AS, en un
archivo del tipo *.rc, por defecto el programa le asigna el nombre script.rc.
5. Adicione este archivo al proyecto, siguiendo la siguiente lnea de comandos:
Project/add to project/files.
6. Al compilar, el programa, el o los conos se ubicarn en los sitios designados.

Figura No. 16.- Designacin de cono de programa

- 50 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

7.9 Eventos del ratn


En la ventana de trabajo de Fortran, el programa puede detectar y responder a los
eventos que se ejecutan con el ratn. Dentro de Visual Fortran se provee dos tipos de
funciones para este control: las funciones basadas en eventos y las funciones de bloqueo
de ejecucin.

7.9.1 Funciones basadas en eventos


Existen dos funciones enteras basadas en eventos: REGISTERMOUSEEVENT y
UNREGISTERMOUSEEVENT, normalmente el evento es el movimiento o click con
alguno de los botones, el primero ejecuta una accin al dar click o mover el ratn, el
segundo libera la memoria del programa de esta accin. La sintaxis que usa la funcin
es la siguiente:
I = REGISTERMOUSEEVENT (UNIT,EVENTO,RUTINA)
I = UNREGISTERMOUSEEVENT (UNIT,EVENTO)

UNIT corresponde a la unidad asignada a la ventana de trabajo. En caso de ser la


ventana abierta por defecto la unidad es 0; EVENTO corresponde a uno de los eventos
del ratn detallados en la tabla No. 10 y RUTINA corresponde a una subrutina
declarada como EXTERNAL que es la que ejecuta una accin cuando ocurre el evento.
EVENTO DEL RATON
DESCRIPCION
MOUSE$LBUTTONDOWN
Click con el botn izquierdo
MOUSE$LBUTTONUP
Soltar el botn izquierdo
MOUSE$LBUTTONDBLCLK Doble click con el botn izquierdo
MOUSE$RBUTTONDOWN
Click con el botn derecho
MOUSE$RBUTTONUP
Soltar el botn derecho
MOUSE$RBUTTONDBLCLK Doble click con el botn derecho
MOUSE$MOVE
Movimiento del ratn
Tabla No. 10.- Eventos del Ratn
Estas subrutinas cuando se las codifica deben constar en su lnea inicial con los
siguientes argumentos enteros:
SUBROUTINE RUTINA(UNIT,EVENTO,ESTADO,X,Y)

Donde UNIT es la unidad asignada a la ventana de trabajo, EVENTO es cualquiera de


los eventos descritos en la tabla No. 10, ESTADO es la consecuencia de ejecutar un
evento, stos se encuentran detallados en la tabla No. 11, X y Y es la posicin en pixeles
de la ventana de trabajo donde ocurre el evento.
ESTADO
DESCRIPCION
MOUSE$KS_LBUTTON Click en el botn izquierdo durante el evento
MOUSE$KS_RBUTTON Click en el botn derecho durante el evento
MOUSE$KS_SHIFT
La tecla SHIFT aplastada durante el evento
MOUSE$KS_CONTROL La tecla CONTROL aplastada durante el evento
Tabla No. 11.- Estado de los eventos del ratn

- 51 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

7.9.2 Ejemplo
El siguiente cdigo ejemplariza el uso de las funciones basadas en eventos; las acciones
de escribir en pantalla algo especfico pueden ser reemplazados por cualquier accin. En
este caso se ha escrito la accin realizada y la posicin en pixeles dentro de la pantalla
adems dibuja una lnea gris con el botn izquierdo y coloca un punto amarillo con el
derecho, en la posicin X,Y.
program principal
use dflib
external rutina, rutina2
integer :: i
open(1,file='user', title='Ventana 1')
write(1,*)'Eventos del Ratn'
i = registermouseevent(1,mouse$lbuttondown,rutina)
i = registermouseevent(1,mouse$rbuttondown,rutina2)
do while(.true.)
enddo
end
subroutine rutina(unidad,evento,estado,x,y)
use dflib
integer :: i,evento,estado,x,y,unidad
write(unidad,*)'click izquierdo'
write(unidad,*)x,y
i = setcolor(8)
i = lineto(x,y)
end
subroutine rutina2(unidad,evento,estado,x,y)
use dflib
integer :: i,evento,estado,x,y,unidad
write(unidad,*)'click derecho'
write(unidad,*)x,y
i = setcolor(14)
i = RECTANGLE($GBORDER, x, y, x+2, y+2 )
end

El resultado de la ejecucin de la subrutina se presenta en la figura No. 17

Figura No. 17.- Ejecucin del programa

- 52 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

7.9.3 Funciones de bloqueo de ejecucin


La funcin entera WAITONMOUSEEVENT es una funcin que detiene la ejecucin
del programa hasta que se ejecute alguna accin con el ratn. La sintaxis y argumento
de esta funcin son los siguientes:
I = WAITONMOUSEEVENT (EVENTO,ESTADO,X,Y)

Donde EVENTO son los mismos descritos en la tabla No. 10, ESTADO son los
enunciados en la tabla No. 11, y, X y Y es la posicin en pixeles de la ventana donde
ocurre el evento.
Como la funcin bloquea la ejecucin del programa, debe primero definirse un evento
para esperar su ejecucin. El esquema general de codificacin de esta funcin se ilustra
en el siguiente ejemplo:
event=mouse$lbuttondown
event=ior(event,mouse$move)
i=registermouseevent(unit,event,rutina)
do while (.true.)
i=waitonmouseevent(mouse$move,estado,x,y)
enddo

7.9.4 Ejemplo
El siguiente ejemplo ilustra como se codifica una aplicacin para dibujar a mano alzada,
con el botn derecho con lneas color verde y con el botn izquierdo con rectngulos
blancos de aspecto slido.
program subrutina
use dflib
external boceto
integer i,event,unit,estado,x,y
unit=0
event=mouse$lbuttondown
event=ior(event,mouse$move)
i=registermouseevent(unit,event,boceto)
do while (.true.)
i=waitonmouseevent(mouse$move,estado,x,y)
enddo
end
subroutine boceto(unit,event,estado,x,y)
use dflib
integer i,x,y,event,estado,unit
type(xycoord)xys
selectcase(estado)
case(mouse$ks_lbutton)
i = SETCOLOR(15)
I = rectangle($gfillinterior,x-2,y-2,x+2,y+2)
case(mouse$ks_rbutton)
I = SETCOLOR(10)
i = lineto(x,y)
case default
I = SETCOLOR(0)
i = lineto(x,y)

- 53 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

endselect
end subroutine

El resultado de la ejecucin de esta aplicacin se ilustra en la figura No. 18

Figura No. 18.- Resultado de la ejecucin de la aplicacin

7.10 Cuadros de dilogo personalizados


La creacin de cuadros de dilogos sigue esta lnea de comandos:
Insert/Resource/dialog, aparece el ambiente y las herramientas para crear los cuadros.
Presionando ALT+ENTER, o haciendo doble click sobre el cuadro se abren las
opciones y propiedades del recurso; es importante tener en cuenta el identificador, por
defecto el identificador el IDD_DIALOG1, pero el nombre puede cambiarse,
manteniendo el prefijo IDD_*, de igual forma se hace con todos los recursos que se
utilicen, cuadros de texto fijo, texto variable, mens desplegables, etc.

Figura No. 19.- Cuadro de propiedades del cuadro de dilogo

- 54 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

Para que el programa principal muestre el cuadro de dilogo, se procede de la siguiente


forma:
1. Se declara el mdulo DFLOGM.
2. Si existen rutinas externas se las declara con la sentencia EXTERNAL.
3. En la definicin de variables se considera una variable entera y dos variables
lgicas. Adems se define un objeto tipo: TYPE(Dialog)dlg. (dlg corresponde al
nombre de una variable asignada)
4. Al final de la declaracin de variables se incluye la sentencia: INCLUDE
RESOURCE.FD . Esta sentencia es una adaptacin de Fortran para permitir
usar elementos de Visual C++.
5. Un cuadro de dilogo, una vez creado como objeto, se lo inicializa con la
funcin lgica: log = DLGINIT(IDD_DIALOG,dlg)
6. Para asignar tareas al botn Aceptar o cualquier botn se usa la funcin lgica:
log = DLGSETSUB(dlg,ID*,<nombre de la subrutina>), donde el ID
corresponde al identificador del botn colocado cuando se crea; el nombre de la
subrutina corresponde a la declarada con la sentencia EXTERNAL.
7. Finalmente para presentar el cuadro en la ventana se usa la funcin entera
i = DLGMODAL (dlg), esto indica que la ejecucin del programa se detiene
hasta que se ejecute una accin en el cuadro de dilogo. El tipo de proyectos
QUICK WIN solo soporta este tipo de cuadros.
8. La subrutina a la cual se le pasa el comando a travs del botn OK o de
cualquier botn debe tener en su encabezado el siguiente formato:
subroutine adquirir(dlg,IDOK,dlg_clicked)
program introduccion
! Definicin de mdulos
use dflib
use dflogm
use dfnls
! Definicin de subrutinas que ejecutarn la accin
external adquirir
! Definicin de de variables
logical l4,l,
integer i
type(dialog)dlg
include 'resource.fd'
! Inicializacin del cuadro de dilogos
l = dlginit(idd_dialog1,dlg)
l4 = dlgsetsub(dlg,idok, adquirir)
i = dlgmodal(dlg)
end

7.10.1 Agregar controles al cuadro de dilogo:

Edit box y Static Text


Los editores de texto y membretes de Visual, no leen ni escriben valores numricos,
sino solamente lo hacen del tipo alfanumrico, por lo que es necesario realizar una
transformacin del texto en valores numricos. La sintaxis, que se sigue, se muestra en
el ejemplo a continuacin.

- 55 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

La variable que define la funcin dlgget (adquirir) es del tipo lgica; dlg, es la
definicin del tipo de cuadro, IDC_INT es el identificador del cuadro de texto en el
cuadro de dilogo, texto es una variable del tipo alfanumrica, xint es una variable
del tipo real o la que se haya definido.
log = dlgget(dlg,IDC_INT,texto)
read(texto,*)xint

Si se desea que lea con algn formato la sintaxis es la siguiente:


log = dlgget(dlg,IDC_INT,texto)
read(texto,(f6.8))xint

El caso inverso, es decir, cuando se quiere escribir en un editor de texto el resultado de


una operacin, hay que hacer la transformacin de la cifra numrica en caracteres de
texto, siguiendo la sintaxis que se presenta a continuacin:
Write(texto,*)xint
Log = dlgset(dlg,IDC_RES,texto).

Radio Buttons y Check Box


Estos controles operan con una variable lgica, y la funcin que almacena la
informacin del control es:
log = dlgget(dlg,id_control,Variable_logica)

La funcin para asignar el valor lgico a la variable de cada control es DLGSET con
iguales argumentos que el caso anterior.

List Boxes y Combo Boxes


Usados cuando el usuario necesita seleccionar un valor desde una lista de varias
opciones desplegables; inclusive el nmero de entradas de las listas puede ser alterado
durante la ejecucin del programa. La diferencia entre los dos radica en que un LIST
BOX es una simple lista de tems, mientras que el COMBO BOX es una combinacin
de un LIST BOX y EDIT BOX, es decir mientras en la primera solo puede elegirse una
de las opciones escritas, en la segunda se puede editar la entrada. Para ambos casos el
ndice de control es: DLG_NUMITEMS que determina cuntos tems se colocarn en
la lista. Una vez asignado este valor, se colocan los tems que sern listados en el
control, la secuencia comienza en 1 y termina en el nmero que ha sido asignado con el
control: DLG_NUMITEMS. La funcin que controla estas caractersticas es del tipo
lgica y es DLGSET. Ejemplo:
log
log
log
log

=
=
=
=

DlgSet
DlgSet
DlgSet
DlgSet

(
(
(
(

dlg,
dlg,
dlg,
dlg,

IDC_LISTBOX1,
IDC_LISTBOX1,
IDC_LISTBOX1,
IDC_LISTBOX1,

3, DLG_NUMITEMS )
"Proa",1 )
"Popa", 2 )
"Seccin Media", 3 )

Se puede cambiar en cualquier momento la lista o los valores de la lista, el nuevo tem,
simplemente se define en una lnea de cdigo como sigue:
log = DLGSET ( dlg, IDC_LISTBOX1, 4)
log = DLGSET ( dlg, IDC_LISTBOX1, "Cubierta", 4)

- 56 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

Para leer desde un LIST BOX, se usa la funcin lgica DLGGET. Hay que aclarar que
solamente se leen caracteres, por lo que si existe un valor numrico en la lista, es
necesario hacer una reasignacin de variables, como se detall en la seccin de los
EDIT BOX. La sintaxis empleada es la siguiente:
log = DLGGET (dlg, id_control, Variable_texto)

Progress Bar, Scroll Bar y Slider


En el cdigo fuente se coloca el rango mnimo y mximo del progreso de la barra
usando las funciones lgicas DLG_RANGEMIN y DLG_RANGEMAX, y la posicin
actual usando la funcin DLG_POSITION. Para ambos casos el valor debe ser entero y
est considerado entre 0 y 65535. Los valores que se asumen por defecto son 1 y 100.
Con la siguiente funcin se coloca el rango mximo, en lugar de la declaracin
DLG_RANGEMAX, se coloca cualquiera de las anteriores funciones, y tendramos una
actualizacin de la barra de progreso, scroll o slider.
log = DLGSET (dlg, id_control, valor_entero,DLG_RANGEMAX)

Otros controles pueden encontrarse en la ayuda de DVF

Ejemplo
El siguiente cdigo adiciona elementos a un cuadro de dilogo, el resultado de la
ejecucin se presenta en la figura No. 20.
! TAMBIEN SE PUEDE CODIFICAR EN FORMATO FIJO
! El programa muestra un cuadro de dilogo de donde se lee texto
! y opciones lgicas, luego escribe en pantalla y en el mismo cuadro
! de dilogo, con lo que se completan las funciones bsicas de operacin
! de un cuadro en Fortran. Antes de escribir una secuencia o lnea de
! comando se explica brevemente el porqu.
!
! El proceso de creacin de un cuadro de dilogos es el siguiente
! del men INSERT - RESOURCE - DIALOG - NEW. Con esta secuencia se abre el
! editor de cuadro de dilogos.
!
! Desde la barra de controles se insertan los objetos, en este ejemplo se han
! insertado 2 EditBox, 1 StaticText, 2 RadioButton, 1 CheckBox y se
conservaron los
! botones OK,Cancel. Con doble click en cada objeto se abre el cuadro de
! propiedades donde se pueden cambiar algunas opciones. En el identificador
! se puede cambiar a partir del _ para personalizar los nombres.
! una vez terminado el diseo en el cuadro de dilogos se graba, por defecto
! se abre la ltima ventana de grabacin, as que es prudente colocar este
! nuevo archivo en el mismo directorio del Espacio de Trabajo y del Proyecto
! por defecto el nombre es 'Script1.RC', si se desea se puede cambiar caso
! contrario da igual, el siguiente paso es adicionar al proyecto este archivo
! siguiendo la secuencia: PROJECT - ADD TO PROJECT - FILES - Seleccionar el
! archivo *.rc
!
! Finalmente compilar, concatenar y ejecutar
!
! El archivo 'resource.fd' es producto de la compilacin del archivo
! 'Script1.rc', as que no es creado, el nico que debe ser codificado
! es este archivo
!
! Demasiado fcil como para no hacerlo.
program dialogos

- 57 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

use dflogm ! mdulo necesario para usar cuadros de dilogos


use dflib
integer(4) i4
logical result
type (qwinfo) winfo
winfo%TYPE = QWIN$MAX
! Maximiza la ventana principal
result = SETWSIZEQQ(QWIN$FRAMEWINDOW, winfo)
! Maximiza la ventana hija
result = SETWSIZEQQ(0, winfo)
! Color del fondo de la ventana gris
i4 = setbkcolorrgb(#C0C0C0)
call clearscreen($gclearscreen)
write(*,*)' '
do while (.true.)
enddo
end
! Funcin que controla la barra de mens
LOGICAL(4) FUNCTION INITIALSETTINGS( )
USE DFLIB
! Subrutinas a las que se pasa el mando cuando se selecciona un men
external acerca,nuevo
LOGICAL(4) result
result = APPENDMENUQQ(1, $MENUENABLED, '&Archivo'C, NUL )
result = APPENDMENUQQ(1, $MENUENABLED, '&Nuevo'C,nuevo)
result = APPENDMENUQQ(1, $MENUENABLED, '&Guardar'C, WINSAVE)
result = APPENDMENUQQ(1, $MENUSEPARATOR, ''C, NUL )
result = APPENDMENUQQ(1, $MENUENABLED, '&Salir'C, WINEXIT )
result = APPENDMENUQQ(2, $MENUENABLED, '&Ayuda'C, NUL )
result = APPENDMENUQQ(2, $MENUENABLED, '&A&cerca'C, acerca)
INITIALSETTINGS= .true.
END FUNCTION INITIALSETTINGS
! Subrutinas que ejecutan los mens seleccionados como nuevo o acerca
subroutine nuevo
! Librera necesaria para trabajar con cuadros de dilogos, viene
! instalada con el compilador DVF, pero es necesario expresarla
use dflogm
! Nombre de la subrutina que es llamada cuando se ejecuta una accin
! en el cuadro, para este caso click en OK
external subrutina
logical log
integer i4
! Declaracin del tipo de objeto a usarse. 'dlg' es una variable
! puede tener cualquier nombre
type(dialog)dlg
! Producto de la compilacin del cuadro de dilogos, no puede cambiarse
! el nombre.
include 'resource.fd'
!
!
!
!

Funcin lgica que inicializa el cuadro de dilogo, la funcin tiene


dos argumentos:
1. Identificador del cuadro IDD_NOMBRE (NOMBRE puede ser personalizado)
2. La variable definida en TYPE

- 58 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

log = DlgInit(IDD_DIALOG1,dlg)
! Accin que se ejecuta al hacer click en el botn OK
! Funcin lgica que pasa la ejecucin del programa a la subrutina
! Tiene tres argumentos
! 1. La variable que define al cuadro (TYPE)
! 2. El identificador del botn que se ejecuta para pasar el mando
! 3. Nombre de la subrutina que continua con la ejecucin del programa
log = DlgSetSub (dlg,IDOK,Subrutina)
! Funcin entera que muestra al cuadro de dilogo en pantalla
! requiere un argumento, la variable que define al cuadro (TYPE)
i4 = DlgModal(dlg)
!
!
!
!
!

Para cerrar el cuadro de dilogos se llama a la subrutina DLGEXIT


debe hacerse el llamado desps de ejecutar la subrutina llamada
con el botn OK, Sintxis
call DlgExit (dlg)

end subroutine
! Subrutina que es llamada cuando se da click en el botn aceptar OK
! Requiere tres argumentos:
! 1. Variable que define al cuadro (TYPE)
! 2. Identificador del botn que pasa el comando
! 3. Accin que se ejecuta sobre el botn
subroutine subrutina(dlg,IDOK,dlg_clicked)
! Librera necesaria para trabajar con cuadros de dilogos, viene
! instalada con el compilador DVF, pero es necesario expresarla
use dflogm
logical log,retlog1,retlog2
integer i4
real x,y
character*25 texto,numero,texty
! Declaracin del tipo de objeto a usarse. 'dlg' es una variable
! puede tener cualquier nombre
type(dialog)dlg
! Producto de la compilacin del cuadro de dilogos, no puede cambiarse
! el nombre.
include 'resource.fd'
! Funcin lgica que lee la informacin de un cuadro de edicin
! y asigna el valor de lo que lee a la variable alfanumrica 'texto'
! **Desde un cuadro solo se lee y escribe caracteres, NO VALORES**
! La funcin requiere tres argumentos
! 1. Variable que define al cuadro (TYPE)
! 2. Identificador del cuadro de texto
! 3. Variable alfanumrica a la que se le asigna la informacin leda
log = DlgGet(dlg,IDC_EDIT1,texto)
! Condicin que evita error cuando se ha dejado en blanco esta casilla
if (texto.eq.' ') then
texto='nada'
endif
! Cuando se necesitan ingresar valores numricos, stos inicialmente se
! les asigna una variable alfanumrica y luego se hace la transformacin
! como sigue.
log = DlgGet(dlg,IDC_EDIT2,numero)
! Condicin que evita que error cuando no se llena esta casilla
if (numero.eq.' ') then

- 59 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

numero='0.0'
endif
read(numero,*)x
! Asigna lo ledo en 'numero' a la variable real 'X' con
cualquier formato
! Funcin lgica que lee la informacin lgica de los botones de
! seleccin RADIO BUTTONS, su resultado se almacena en la variable
! lgica 'retlog'
log = DlgGet(dlg,IDC_RADIO1,retlog1)
! Funcin lgica que lee la informacin lgica del cuadro de verificacin
! CHECK, su resultado se almacena en la variable 'retlog2'
log = DlgGet(dlg,IDC_CHECK1,retlog2)
! Acciones que se ejecutan cuando las variables 'texto','retlog1' y
! 'retlog2' tienen un valor ya definido, este prrafo ya se lo hace
! de acuerdo a las exigencias que desee cada uno.
! Ejecucin para la variable 'retlog1' del botn de seleccin
select case (retlog1)
! Cuando se selecciona toma el valor de verdadero y se ejecuta
! lo que sigue
case (.true.)
! Funcin lgica que escribe en la etiqueta lo que se ley en el
! cuadro de edicin de texto. La funcin requiere los mismos argumentos
! que la funcin DLGGET.
log = DlgSet(dlg,IDC_STATIC,texto)
write(*,*)'Se ha seleccionado la opcin 1'
! Cuando no ha sido seleccionado toma el valor de falso
case (.false.)
texto = '<static>'
! Funcin lgica que escribe en la etiqueta el contenido de la variable
texto
log = DlgSet(dlg,IDC_STATIC,texto)
write(*,*)'Se ha seleccionado la opcin 2'
end select
! Ejecucin para la variable 'retlog2' de la casilla de verificacin
!
!
!
y

Acciones de ejemplo para generar un valor 'Y' y escribirlo en una variable


de texto que pueda ser colocada en el cuadro de dilogo o en pantalla pero
como caracteres.
= 10.*x

write(texty,'(f10.4)')y !Asigna el valor de 'Y' (real) a la variable de texto


'texty'
! con el formato f6.3
Select case (retlog2)
! Cuando se ha chequeado la casilla toma el valor de verdadero
case (.true.)
write(*,*)'Casilla de verificacin chequeada'
write(*,*)texty
! Cuando no se la chequea, toma el valor de falso
case (.false.)
write(*,*)'Casilla de verificacin ignorada'
write(*,'(e10.4)')x
end select
end subroutine
! subrutina que abre el cuadro de dilogo acerca de y lo cierra al dar click
en aceptar
subroutine acerca

- 60 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

use dflogm
logical l4,retlog
integer i4
type(dialog)dlg
include 'resource.fd'
l = dlginit(IDD_ACERCA,dlg)
i4 = dlgmodal(dlg)
call dlgexit(dlg)
end subroutine

Figura No. 20.- Cuadro ejecutando el cdigo

- 61 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

8.0 Grficos en Visual Fortran


Existen en el mercado algunas aplicaciones tiles para graficar o plotear pares
ordenados en Fortran, entre los ms usados por nuestra facultad se encuentra el
desarrollado por Microsoft denominado Array Visualizar, que se provee como adicional
al compilador de Fortran, el desarrollado por PlotWorks, denominado Plot88; el
desarrollado por el autor de estos apuntes denominado CVFGraf y el desarrollado por el
profesor Santos de la Universidad de Algarbe (Portugal) denominado DXFortran. En
este captulo se revisarn algunas de las potencialidades de cada una de las rutinas de
graficacin disponibles.

8.1 Array Visualizer


8.1.1 Generalidades
Digital Visual Fortran adiciona una rutina para la visualizacin o anlisis grfico de los
resultados, usando subrutinas que realizan una interface con el programa Array
Visualizer. El uso de esta herramienta es permitido por cualquier tipo de proyecto.
Las subrutinas de trabajo son las denominadas rutinas FAGLXXX, y mediante stas se
pueden crear interfaces para incorporar esta herramienta en aplicaciones personalizadas.
Existen otras rutinas como las denominadas FAVXXX, que controlan la configuracin
del programa, pero en la versin 1.0, que se dispone, no se tiene estas subrutinas.
El mdulo que contiene estas subrutinas es AVDEF, por lo que es importante hacer la
declaracin con la sentencia USE AVDEF, antes de usarlas.

8.1.2 Descripcin
El mdulo contiene 10 subrutinas.
1. FAGLCLOSE
2. FAGLENDWATCH
3. FAGLGETSHARENAME
4. FAGLHIDE
5. FAGLLBOUND
6. FAGLNAME
7. FAGLSAVEASFILE
8. FAGLSHOW
9. FAGLSTARTWATCH
10. FAGLUPDATE
Estas rutinas son llamadas en la siguiente secuencia
La primera rutina que debe llamarse es faglStartWatch con el arreglo como
argumento.
Si se desea presentar un arreglo en diferentes escalas, se llama a faglLBound
con el arreglo como argumento y el otro arreglo donde se encuentran los lmites
inferiores.
Para colocar un ttulo en la barra de la ventana se llama a faglName con el
arreglo a presentar y el ttulo personal.

- 62 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

Para iniciar la presentacin se usa faglShow con el arreglo como argumento y


permanece abierto hasta que el usuario lo cierre con los controles de la ventana
o llame a faglClose
Si la informacin que se est presentando ha variado mientras se presenta un
grfico, se llama a faglUpdate con el arreglo como argumento, y la informacin
presentada se actualiza.
Para guardar el arreglo como archivo Array Graphing Language (.AGL), para
poder ser presentado independiente y directamente de Array Visualizer, se llama
a faglSaveAsFile con el arreglo como argumento; no se necesita tener abierta la
ventana para guardar un archivo.
Cuando se ha finalizado se llama a faglEndWatch con el arreglo como
argumento.
Una presentacin puede esconderse momentneamente antes de cerrarla, usando
la rutina faglHide.

8.1.3 Sintaxis
A continuacin se describen las principales rutinas del programa Array Visualizer,
describiendo sus argumentos y sintaxis.
CALL FAGLSTARTWATCH (array,status)
Array
nombre del arreglo que contiene la informacin a ser presentada es del
tipo real, dimension NxMxP
Status
Variable entera de uso interno del programa, toma el valor de 0 cuando se
ha ejecutado correctamente la rutina y el valor de 1 cuando no lo ha
hecho.
CALL FAGLLBOUND (array,lbnd,status)
Array
nombre del arreglo que contiene la informacin a ser presentada es del
tipo real, dimension NxMxP
Lbnd
Un arreglo del tipo entero que tiene la misma dimension de Array, con la
informacin en escala 1.
Status
Variable entera de uso interno del programa, toma el valor de 0 cuando se
ha ejecutado correctamente la rutina y el valor de 1 cuando no lo ha
hecho.
CALL FAGLNAME (array,Title,status)
Array
nombre del arreglo que contiene la informacin a ser presentada es del
tipo real, dimension NxMxP
Title
Una variable de carcter que contiene el ttulo del grfico.
Status
Variable entera de uso interno del programa, toma el valor de 0 cuando se
ha ejecutado correctamente la rutina y el valor de 1 cuando no lo ha
hecho.
CALL FAGLSHOW (array,,status)
Array
nombre del arreglo que contiene la informacin a ser presentada es del
tipo real, dimension NxMxP
Status
Variable entera de uso interno del programa, toma el valor de 0 cuando se
ha ejecutado correctamente la rutina y el valor de 1 cuando no lo ha
hecho.
CALL FAGLCLOSE (array,,status)
Array
nombre del arreglo que contiene la informacin a ser presentada es del
tipo real, dimension NxMxP

- 63 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

Status

Variable entera de uso interno del programa, toma el valor de 0 cuando se


ha ejecutado correctamente la rutina y el valor de 1 cuando no lo ha
hecho.
CALL FAGLUPDATE (array,,status)
Array
nombre del arreglo que contiene la informacin a ser presentada es del
tipo real, dimension NxMxP
Status
Variable entera de uso interno del programa, toma el valor de 0 cuando se
ha ejecutado correctamente la rutina y el valor de 1 cuando no lo ha
hecho.
CALL FAGLSAVEASFILE (array,filename,status)
Array
nombre del arreglo que contiene la informacin a ser presentada es del
tipo real, dimension NxMxP
Filename
Variable alfanumrica con el nombre del archivo incluyendo la extensin
*.AGL.
Status
Variable entera de uso interno del programa, toma el valor de 0 cuando se
ha ejecutado correctamente la rutina, y, el valor de 1 cuando no lo ha
hecho.
CALL FAGLENDWATCH (array,,status)
Array
nombre del arreglo que ha sido usado en la rutina FaglStartWatch
Status
Variable entera de uso interno del programa, toma el valor de 0 cuando se
ha ejecutado correctamente la rutina, y, el valor de 1 cuando no lo ha
hecho.
CALL FAGLHIDE (array,,status)
Array
nombre del arreglo que ha sido usado en la rutina FaglStartWatch
Status
Variable entera de uso interno del programa, toma el valor de 0 cuando se
ha ejecutado correctamente la rutina y el valor de 1 cuando no lo ha
hecho.

8.1.4 Ejemplo
La siguiente codificacin produce la curva de la funcin coseno. El resultado de la
ejecucin del programa se observa en la figura No. 21.
program array
use avdef
real, dimension(0:360) :: x,y
real :: angulo,pi
integer :: i,status
character(len=25) :: titulo
titulo='Funciones Seno y Coseno'
pi=3.14159
do i=0,360
angulo = float(i)*pi/180.
x(i) = cos(angulo)
write(*,*)angulo,x(i),y(i)
enddo
CALL FAGLSTARTWATCH (x,status)
CALL FAGLNAME (x,titulo,status)
CALL FAGLSHOW (x,status)
pause
CALL FAGLENDWATCH (x,status)

- 64 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

end

Figura No. 21.- Resultado de una graficacin usando Array Visualizer

8.2 Librera Plot88


8.2.1 Generalidades
La librera de graficacin Plot88, es un conjunto de libreras de graficacin desarrollado
por PlotWorks, y contiene 61 subrutinas para configurar la presentacin y el ploteo de
grficos en 2D y 3D, sin rotacin libre, y no viene includo en el paquete de instalacin
de DVF 6.0; as que debe ser instalada por separado y los dos archivos que contienen
las subrutinas de graficacin son Plot88.lib y Drive88.lib, deben ser copiados en la
carpeta: Microsoft Visual Estudio/DF98/LIB, donde se encuentran las libreras
disponibles del compilador. Para poder usar esta librera en el cuadro de configuracin
del proyecto deben ser incluidas las sentencias: PLOT88.LIB, DRIVE88.LIB,
WINSPOOL.LIB, para que en el momento de enlazar con las libreras stas sean
encontradas. Ver figura No. 22.
Para la graficacin en dos dimensiones, Plot88 usa el plano cartesiano de 8 pulgadas de
largo por 6 pulgadas de alto. Esta librera incluye subrutinas para generar el eje, para
personalizar la presentacin de los ejes y para graficar personalizando las lneas, etc.

- 65 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

8.2.2 Etapas del proceso de graficacin


La secuencia normal para graficar en esta subrutina, se describe brevemente en la tabla
No. 11, y puede cambiar salvo los tems con negrita que deben necesariamente
declararse para poder ejecutar la graficacin.

Figura No. 22.- Configuracin del proyecto

ETAPA

SUBRUTINA
SINTAXIS
PLOTS
(idef,ioport,model)
Inicio
FACTOR
(fact)
PLOT
(x,y,ipen)
Origen
SCALE
(array,axlen,npts,inc)
Escala y valores
STAXIS
(annhgt,tihgt,xphgt,ticlug,ndeca)
Ejes coordenados
AXIS
(x,y,ctext,nchar,axlen,angle,first,delta)
Graficacin de datos
LINE
(xarray,yarray,npts,inc,lintyp,inteq)
CURVE
(xarray,yarray,npts,seglen)
Caracteres del grfico SYMBOL
(x,y,height,ctext,angle,nc)
NUMBER
(x,y,height,fpn,angle,ndec)
(x,y,ipen)
Ejecucin del grfico PLOT
Tabla No. 11.- Secuencia de una graficacin con Plot 88

8.2.3 Sintaxis de cada subrutina


1. Subrutina PLOTS.- inicializa el programa de graficacin, debe ser llamada antes
que cualquier otra subrutina de graficacin, requiere el ingreso de tres valores:
a. Idef: es un entero y puede ser 0, dibuja el grfico; si toma el valor de 1
dibuja y graba, si el valor es 2 graba y no dibuja, 3 muestra directamente
en pantalla.
b. Ioport: es un entero, que indica el tipo de interface; para mostrar
directamente en pantalla 90, 91, 92. Para generar archivo *.DXF para
editarlo en AutoCad se asigna el valor de 11.

- 66 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

2.
3.

4.

5.

6.

c. Model: es un entero que indica el modelo de la interface; para pantalla


90, 91 92. Para generar un archivo *.DXF editable en AutoCad se
asigna el valor de 120.
Subrutina FACTOR.- aumenta o disminuye el tamao del dibujo completo.
Requiere de un valor real positivo diferente de cero, que es el factor escala.
Subrutina PLOT.- mueve la punta del lpiz de graficacin de la posicin actual
hacia la nueva, con la opcin de mover el puntero levantado o dibujando.
Requiere del ingreso de tres parmetros:
a. (x,y).- nueva posicin a la que el puntero ser llevado. Son dos reales,
coordenadas.
b. Ipen.- es del tipo entero: 2 dibuja, 3 mueve el origen sin dibujar, 999
pone fin al uso del graficador.
Subrutina SCALE.- esta subrutina busca en un arreglo de valores, el mnimo o
mximo valor y lo almacena en la variable FIRST, luego escala el rango de
valores del arreglo en el eje y este factor de escala lo almacena en la variable
DELTA, estas dos variables sern usadas por la subrutina AXIS. Requiere el
ingreso de 4 valores:
a. Array.- el nombre de un arreglo, debe dimensionarse con n+2 elementos
de longitud.
b. Axlen.- es un valor real positivo, longitud del eje en pulgadas.
c. Npts.- entero positivo, nmero de datos del arreglo.
d. Inc.- es un entero que determina cuantos datos se toman como
incremento para la graficacin.
Subrutina STAXIS.- usada para configurar las caractersticas de los ejes de
coordenadas. Requiere el ingreso de cinco parmetros:
a. Annght.- es un real y denota el alto en pulgadas de las etiquetas de cada
marca de anotacin. Si se ingresa 0, no se escriben los valores.
b. Tihgt.- es un real positivo y denota el alto en pulgadas de la etiqueta de
los ejes.
c. Exphgt.- es un real positivo y denota el alto en pulgadas del exponente de
base 10, cuando se requiera.
d. Ticlng.- es un real positivo y denota el longitud en pulgadas de las
marcas, cualquier otro valor indica que no se dibujen las marcas.
e. Ndeca.- es un entero e indica el nmero de cifras decimales que se
desean incluir en los valores del eje.
Subrutina AXIS.- dibuja un eje en dos dimensiones completo, con valores y
etiquetas, la distancia entre marcas siempre es de 1.0 pulgadas, pero puede ser
cambiada con el factor de escala FACTOR, requiere el ingreso de 8 parmetros:
a. X,y.- son reales e indican el origen del eje en pulgadas, respecto del
extremo de la pantalla.
b. Ctext.- Texto de ttulo del eje.
c. Nchar.- es un entero e indica el nmero de caracteres en el ttulo del eje,
igual a 0, no dibuja caracteres, menor que 0 dibuja los caracteres bajo el
eje, y si es mayor que 0, los dibuja sobre el eje.
d. Axlen.- es un real y denota la longitud del eje en pulgadas.
e. Angle.- ngulo de rotacin del eje, el eje x se dibuja con 0 y el eje Y
con 90.
f. First.- es un real, valor obtenido en la subrutina SCALE e indica el valor
de la primera marca del eje.

- 67 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

7.

8.

9.

10.

g. Delta.- es un real, nmero de datos por pulgada de ejes, obtenido en la


subrutina SCALE.
Subrutina LINE: dibuja una lnea basndose en los puntos x,y que se ingresen
en el arreglo, requiere de 6 parmetros.
a. Xarray.- arreglo que contiene los valores que sern graficados en el eje
X.
b. Yarray.- arreglo que contiene los valores que sern graficados en el eje
Y.
c. Npts.- es un entero que indica el nmero de puntos del arreglo.
d. Inc.- entero, incremento de lectura de datos del arreglo.
e. Lintyp.- entero, describe el tipo de lnea que ser dibujada.
f. Inteq.- entero de 0 a 15, es el tipo de smbolo que ser dibujado para
plotear cada nmero.
Subrutina CURVE: une los puntos del arreglo por medio de una curva
suavizada y requiere de 4 parmetros de entrada:
a. Xarray.- arreglo que contiene los valores que sern graficados en el eje
X.
b. Yarray.- arreglo que contiene los valores que sern graficados en el eje
Y.
c. Npts.- es un entero que indica el nmero de puntos del arreglo.
d. Seglen.- es un real, magnitud del segmento de recta que conforma la
forma suavizada, en pulgadas.
Subrutina SYMBOL: Dibuja caracteres y smbolos especiales, y requiere de 6
parmetros de entrada.
a. (x,y).- son reales, posicin en la que ser dibujado el carcter.
b. Height.- real, alto de cada carcter en pulgadas
c. Ctext.- carcter alfanumrico a dibujarse
d. Angle.- real, ngulo en grados de orientacin del texto.
e. Nc.- entero, nmero de caracteres de CTEXT.
Subrutina NUMBER: convierte un nmero en carcter alfanumrico, para poder
dibujarlo en la pantalla. Requiere de 6 parmetros de entrada.
a. (x,y).- son reales, posicin en la que ser dibujado el carcter.
b. Height.- real, alto de cada carcter en pulgadas
c. fpn.- nmero a ser dibujado
d. Angle.- real, ngulo en grados de orientacin del nmero dibujado.
e. Ndec.- entero, nmero de decimales que se dibujarn en el nmero.

8.2.4 Ejemplo
La siguiente codificacin produce el ejemplo clsico de Plot88, la curva Gaussiana.
Correspondiente al ejemplo EXA 42; ntese el orden en el que se hacen las llamadas a
subrutinas.
PROGRAM EXA42
CHARACTER*1 TITC(20),NAM1(20),NAM2(20)
CHARACTER*20 TITLE,NAME1,NAME2
CHARACTER*27 FILENAME
REAL XDATA(202),YDATA(202)
INTEGER*2 IC
CHARACTER*1 ANS
EQUIVALENCE (TITC(1),TITLE),(NAM1(1),NAME1),(NAM2(1),NAME2)
DATA IC/0/
open(4,file="exa42.inp")

- 68 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

WRITE(*,*) 'Enter IOPORT, MODEL and FACT > '


ioport = 91
model = 91
fact = 1
WRITE(*,*) 'Enter text file name> '
filename = 'exa42.dat'
WRITE(*,*) 'Enter the PLOT title [20 chars. max]> '
title = 'BELL'
DO 806 KK=1,20
KI=21-KK
IF(NAM2(KI).NE.' ') GO TO 706
806 CONTINUE
706 NT=KI
WRITE(*,*) 'Enter the X-AXIS title [20 chars. max]> '
name2 = 'X'
DO 805 KK=1,20
KI=21-KK
IF(NAM2(KI).NE.' ') GO TO 705
805 CONTINUE
705 N2=KI
WRITE(*,*) 'Enter the Y-AXIS title [20 chars. max]> '
name1 = 'F(X)'
C
READ(4,61) NAME1
DO 804 KK=1,20
KI=21-KK
IF(NAM1(KI).NE.' ') GO TO 704
804 CONTINUE
704 N1=KI
LT = 0
WRITE(*,*) 'Do you wish to plot a centered symbol [Y/(N)]?'
ans = 'y'
807 FORMAT(A)
IF(ANS.EQ.'Y' .OR. ANS.EQ.'y') LT = 1
OPEN(9,FILE=FILENAME,STATUS='OLD')
DO 3 LENG = 1,201
READ(9,*,ERR=31) XDATA(LENG),YDATA(LENG)
3 CONTINUE
31 CONTINUE
CLOSE(9,STATUS='KEEP')
IF(LENG.GT.200) WRITE(0,*)
1
' WARNING - ONLY 200 DATA POINTS WILL BE PLOTTED'
LENG = LENG - 1
if( ioport.ge.90.and.ioport.le.99) then
CALL PLOTS(3,IOPORT,MODEL)
else
CALL PLOTS(0,IOPORT,MODEL)
endif
if( ioport.eq.11) open(90,file='disk.dat')
call jobtitle88("EXA42 Bell Curve")
if( ioport.ge.90.and.ioport.le.99) then
call color(15,IERR)
endif
CALL FACTOR( FACT )
IF(N2.EQ.0) THEN
N2=+1
NAME2= ' '
ENDIF
X = 4.5 -.12*(NT)
CALL SYMBOL(X,4.75,.38,TITLE,0.,NT)

- 69 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

CALL PLOT(1.00,1.00,-3)
CALL SCALE(XDATA,6.00,LENG,1)
CALL SCALE(YDATA,3.00,LENG,1)
CALL STAXIS(.25,.25,.111,.112,1)
CALL AXIS(0.,0.,NAME2,-N2,6.00,00.,XDATA(LENG+1),XDATA(LENG+2))
CALL AXIS(0.,0.,NAME1, N1,3.00,90.,YDATA(LENG+1),YDATA(LENG+2))
WRITE(0,*) 'Begin drawing output.'
CALL PLOT(0.0,0.0,999)
60 FORMAT(A27)
61 FORMAT(A20)
1000 FORMAT(A)
END

Figura No. 23.- Grafico ejecutando Plot88

8.3 CVFGraf
8.3.1 Generalidades
Esta rutina de graficacin fue creada entre abril de 2002 y Junio de 2004, cuando se
hizo la ltima correccin a la presente versin, no por esto quiere decir que no habr
versiones posteriores mejoradas que con la ayuda de retroalimentacin que
proporcionarn ustedes los usuarios de esta rutina. La rutina est escrita en Fortran 90,
formato libre y para ser usada en un proyecto del tipo FORTRAN STANDARD
GRAPHICS. No tiene la estructura de mdulo as que bastar con adicionar al proyecto
el archivo que la contiene y llamar a sus subrutinas desde el programa principal. No
soporta graficacin en tres dimensiones, ni funciones cuyo resultado sean valores

- 70 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

infinitos, los arreglos no tienen lmites, estn declarados con 500 valores pero el usuario
puede cambiarlos a voluntad.

8.3.2 Codificacin y subrutinas


Se ha usado la graficacin en Fortran 90, basado en una pantalla de 640x480 pixeles, las
subrutinas leen los valores a graficarse y obtienen el mximo y mnimo valor para saber
si existen valores negativos en los pares ordenados y de esta forma ubicar el origen de
coordenadas nuevo en un lugar de la pantalla de tal forma que el grfico pueda ser visto
completamente en la pantalla.
Est compuesta de dos subrutinas una grafica los ejes y otra plotea los puntos en un
plano cartesiano. Si se desea graficar ms de un grupo de pares ordenados en el plano se
llama a la subrutina de PLOTEO tantas veces como se requiera, sin embargo para
definir los ejes es necesario escoger el grupo de pares que puedan contener a los dems
para que se puedan apreciar todos los puntos en el grfico resultante

1. CVFaxis ( )
1.1 Descripcin: Esta subrutina define los ejes de coordenadas del grfico,
requiere de los siguientes parmetros
1.2 Sintaxis
CVFAXIS(x,y,n,titulo,titx,tity,escalas,grilla,fondo,scalx,scaly)
1.3 Argumentos:
1.3.1 X: es el arreglo que desea graficarse en el eje de las abcisas; debe
declararse como un vector de nmeros reales
1.3.2 Y: es el arreglo que desea graficarse en el eje de las ordenadas; debe
declararse como un vector de nmeros reales
1.3.3 N: es el nmero de puntos que van a graficarse, definido por un entero
1.3.4 Titulo: es el ttulo del grfico, que se colocar como ttulo de la
ventana que contiene el grfico. Se la define como carcter, si no ingresa
como variable a la rutina debe colocarse apstrofes con el nombre.
1.3.5 Titx: es el ttulo del eje X, que se colocar a la derecha del eje de
abcisas
1.3.6 Tity: es el ttulo del eje Y, que se colocar sobre el eje de las ordenadas
1.3.7 Escalas: es un nmero entero que puede tomar dos valores CERO (0)
para que cada eje tenga escalas independientes, y, UNO (1) para que los
ejes tengan la misma escala, cualquier otro valor resulta en error.
1.3.8 Grilla: es un nmero entero que puede tomar dos valores CERO(0)
para no graficar una grilla en el plano cartesiano, y, UNO (1) para
graficar una grilla en el plano, cualquier otro valor resulta en error.
1.3.9 Fondo: es un nmero entero que puede tomar tres valores CERO (0)
coloca el fondo negro ejes y textos en blanco, UNO (1) fondo gris, ejes y
textos en negro, DOS (2) fondo blanco, ejes y textos en negro, y, TRES
(3) no grafica ejes pero el fondo siempre ser negro. Las curvas
ploteadas no se ven afectadas en el color.
1.3.10 ScalX: es el valor de la escala para graficar el eje X, resultado que se
obtiene de la subrutina, sirve para ingresar a la subrutina
CVFGRAFICA.
1.3.11 ScalY: es el valor de la escala para graficar el eje Y, resultado que se
obtiene de la subrutina, sirve para ingresar a la subrutina
CVFGRAFICA.

- 71 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

2. CVFGrafica ()
2.1 Descripcin: Esta subrutina plotea los puntos en el plano previa graficacin de
los ejes, si no se ha llamado previamente a la subrutina CVFAXIS no es posible
graficar los puntos.
2.2 Sintxis: CALL CVFGRAFICA(x,y,n,marca,color,scalx,scaly)
2.3 Argumentos: Requiere de los siguientes argumentos de entrada:
2..3.1 X: es el arreglo que desea graficarse en el eje de las abcisas debe
declararse como un vector de nmeros reales
2.3.2 Y: es el arreglo que desea graficarse en el eje de las ordenadas, debe declararse
como un vector de nmeros reales
2.3.3 N: es el nmero de puntos que van a graficarse, definido por un entero.
2.3.4 Marca: es un nmero entero, dibuja una marca para indicar la posicin del par
graficado y toma los siguientes valores:
0 Dibuja una lnea sin marcas
1 Dibuja una lnea con marcas cuadradas
2 Dibuja marcas redondas sin lnea
3 Dibuja marcas cuadradas sin lnea
4 Dibuja una lnea con marcas redondas
5 Dibuja sercha cbica sin marcas
6 Dibuja sercha cbica con marca cuadrada
7 Dibuja sercha cbica con marca redonda
Cualquier otro valor el resultado es error
2.3.5 Color: es un nmero entero que define el color de la curva, y toma los
siguientes valores:
1 rojo
2 blanco
3 verde
4 amarillo
5 azul
6 magneta
7 turquesa
8 gris
2.3.6 ScalX y ScalY: son el resultado de la subrutina anterior.

8.3.3 Ejemplo
La codificacin siguiente genera la curva de las funciones Seno y Coseno.
program principal
real, dimension(500) :: x,y,z
integer i,n,color,marca,escalas,grilla
character(25) titulo,titx,tity
titulo='Funciones Seno y Coseno'
titx='Grados'
tity='Seno/Coseno'
pi=3.14159
do i=0,360
angulo=float(i)*pi/180
y(i)=cos(angulo) x(i)=float(i)
z(i)=sin(angulo)
write(*,*)angulo,y(i),x(i)
enddo
escalas=0 ! usar escalas independientes

- 72 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

grilla=1 ! graficar grilla


fondo = 0 ! fondo negro, ejes y textos blanco
n=360
call cvfaxis(x,y,n,titulo,titx,tity,escalas,grilla,fondo,scalx,scaly)
! grafica el eje basado en la funcin seno
color=4 ! amarillo
marca=0 ! no graficar marcas
call cvfgrafica(x,y,n,marca,color,scalx,scaly)
color=5 ! azul
call cvfgrafica(x,z,n,marca,color,scalx,scaly)
do while (.true.)
enddo
end

Figura No. 24.- Grafica obtenida con CVFGraf

8.4 DXFortran
8.4.1 Generalidades
El proyecto DXFortran, fue desarrollado por los profesores Carlos Otero y Davide
Santos de la Universidad de Algarve de Lisboa, Portugal, y tiene por objeto el
desarrollo de una Librera Vectorial de Graficacin en formato DXF (Drawing
Interchange Format) para Fortran 90. El autor de estas notas, adapt esta librera para
ser usada como herramienta de ploteo de coordenadas en un plano y el espacio, de tal
forma que este nuevo arreglo sea usado directamente sin necesidad de conocer a fondo
las rutinas principales del proyecto. Las subrutinas adapatadas fueron adicionadas al
mdulo del proyecto, para evitar errores y est constituido por dos secciones:

- 73 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

1. Un grupo de subrutinas de graficacin en 2D y 3D que permiten realizar ploteos de


arreglos de datos y de funciones matemticas directamente en formato DXF y en las
cuales los parmetros de ingreso son los arreglos y ttulos de los ejes.
2. Un grupo de subrutinas que permite personalizar de mejor forma el ploteo en 2D y
3D de funciones y arreglos de datos.

8.4.2 Forma de uso


El uso de la librera est definido de DOS maneras:
1. El ploteo rpido de puntos en 2D y 3D
Esta opcin nos permite realizar un ploteo en 2D o 3D sin tener que configurar
el archivo ni ejecutar ningn comando de AutoCAD. Las subrutinas definen los
parmetros iniciales y ejecutan los comandos necesarios para realizar el ploteo
de los puntos. La secuencia que se requiere es llamarlas directamente
CALL dfGraph2D (..), si se quiere plotear en 2 dimensiones
CALL dfGraph3D (..) si se quiere plotear en 3 dimensiones
2. Ploteo en 2D y 3D, configurando opciones
Esta opcin nos permite plotear varias veces sobre el mismo eje de coordenadas,
la limitacin que existe es que la definicin de ejes la hace con los arreglos que
se ingresen en el llamado a la subrutina dfAxis. La secuencia que debe usarse
para realizar la graficacin es la siguiente:
CALL dfStart ()
CALL dfAxis (..)
CALL dfGraph (.) las veces que se requieran
CALL dfEnded ()

8.4.3 Descripcin de subrutinas


La primera seccin es de ploteo rpido de funciones en 2D y 3D y para la graficacin
solo es necesario invocar cualquiera de estas dos subrutinas con los argumentos
adecuados y el grfico se realiza sin necesidad de llamar otra subrutina. La limitacin
que existe al usar estas dos subrutinas es que si necesitamos plotear dos curvas en el
mismo eje coordenado no sera posible ya que cada subrutina da inicio y finaliza el
dibujo independientemente.
1. dfGraph2D ( )
1.1 Descripcin: realiza el ploteo de una funcin matemtica o de un arreglo de
pares ordenados en dos dimensiones, define 3 capas denominadas Ejes
(rojo), Textos (azul) y Grafico (blanco), y todas con el tipo de lnea continua.
El ploteo lo realiza uniendo los pares de coordenadas con un segmento recto.
La longitud de los ejes se define en la subrutina buscando el mximo valor
del arreglo en cada eje y el tamao de los textos son definidos en base a una
fraccin del mnimo de los mximos valores de los arreglos para de esta
forma guardar proporcionalidad entre los textos y el grfico.
1.2 Sintxis: CALL dfGraph2D (Archdxf,Texto,TextX,TextY,x,y,n,L)
1.3 Argumentos:
1.3.1 Archdxf: nombre del archivo con extensin DXF, argumento
alfanumrico
1.3.2 Texto: ttulo del grfico, argumento alfanumrico
1.3.3 TextX: ttulo del eje X, argumento alfanumrico
1.3.4 TextY: Ttulo del eje Y, argumento alfanumrco
1.3.5 x: arreglo que contiene los datos de las abcisas, argumento real

- 74 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

1.3.6 y: arreglo que contiene los datos de las ordenadas, argumento real
1.3.7 n: nmero de puntos en los arreglos, la subrutina soporta hasta 999
puntos, argumento Entero
1.3.8 L: Parmetro Entero que indica si se desea graficar una marca que
indique la posicin de los pares ordenados, los valores que puede
tomar son:
0 Dibuja lneas y no las marcas
1 Dibuja lneas y marcas
2 Dibuja marcas y no lneas
2. dfGraph3D ( )
2.1 Descripcin: realiza el ploteo de una funcin matemtica o de un arreglo de
pares ordenados en tres dimensiones, define 3 capas denominadas Ejes
(rojo), Textos (azul) y Grfico (blanco), y todas con el tipo de lnea continua.
El ploteo lo realiza uniendo los pares de coordenadas con una lnea recta. La
longitud de los ejes se define en la subrutina buscando el mximo valor del
arreglo en cada eje y el tamao de los textos son definidos en base a una
fraccin del mnimo de los mximos valores de los arreglos para de esta
forma guardar proporcionalidad entre los textos y el grfico.
2.2 Sintaxis: CALL dfGraph3D (Archdxf,Texto,TextX,TextY,x,y,z,n,L)
2.3 Argumentos:
2.3.1 Archdxf: nombre del archivo con extensin DXF, argumento
alfanumrico
2.3.2 Texto: ttulo del grfico, argumento alfanumrico.
2.3.3 TextX: ttulo del eje X, argumento alfanumrico.
2.3.4 TextY: Ttulo del eje Y, argumento alfanumrico.
2.3.5 x: arreglo que contiene los datos de las abcisas, argumento real.
2.3.6 y: arreglo que contiene los datos de las ordenadas, argumento real.
2.3.7 z: arreglo que contiene los datos de los valores de Z, argumento real.
2.3.8 n: nmero de puntos en los arreglos, la subrutina soporta hasta 999
puntos. Argumento Entero.
2.3.9 L: Parmetro Entero que indica si se desea graficar una marca que
indique la posicin de los pares ordenados, los valores que puede tomar
son:
0 Dibuja lneas y no las marcas
1 Dibuja lneas y marcas
2 Dibuja marcas y no lneas
La segunda seccin nos permite realizar varios ploteos en el mismo dibujo, para lo cual
es necesario seguir la siguiente secuencia: todo dibujo se inicia con el llamado a dfStart
y los argumentos respectivos, luego si se desea graficar ejes se invoca a la subrutina
dfAxis, la parte del ploteo la realiza la subrutina dfGraph, que puede ser invocada las
veces que sean necesarias para realizar todas los ploteos que se deseen, finalmente debe
terminarse el ploteo con dfEnded (de la primera seccin).
3.

dfStart ()
3.1 Descripcin: Inicia el dibujo para ploteo y define 3 capas denominadas
Ejes (rojo), Textos (azul) y Grafico (blanco), y todas con el tipo de lnea
continua.
3.2 Sintaxis: CALL dfStart (archdxf,FileNum)
3.3 Argumentos:

- 75 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

3.3.1 Achdxf: nombre del archivo con extensin DXF, argumento


alfanumrico
3.3.2 FileNum: resultado de la aplicacin de la subrutina, por defecto (1), a
menos que se inicie una graficacin independiente, este valor es el que
sirve para posteriormente cerrar la graficacin con dfEnd. Argumento
Entero. En el modo Ploteo configurando opciones.
4. dfAxis ()
4.1 Descripcin: dibuja los ejes, coloca divisiones y rotula en el archivo
DXF definido en dfStart, en la capa Ejes y con el color Rojo, los
valores referenciales para definir la longitud de los ejes lo toma de los
arreglos, usando el mismo criterio al empleado en dfGraph.
4.2 Sintxis: CALL dfAxis (texto,textX,textY,x,y,z,n)
4.3 Argumentos:
4.3.1 Texto: ttulo del grfico, argumento alfanumrico
4.3.2 TextX: ttulo del eje X, argumento alfanumrico
4.3.3 TextY: ttulo del eje Y, argumento alfanumrico
4.3.4 ex,ey,ez: arreglos que contienen los datos a plotearse, argumento real
4.3.5 n: nmero de puntos a plotearse, argumento Entero
5. dfGraph ()
5.1 Descripcin: plotea los datos contenidos en los arreglos x,y,z sobre los
ejes definidos en dfAxis.
5.2 Sintaxis: CALL dfGraph (ex,ey,ez,n,L)
5.3 Argumentos:
5.3.1 x,y,z: arreglos que contienen los datos a plotearse, argumento Real
5.3.2 n: nmero de puntos a plotearse, argumento Entero
5.3.3 L: Parmetro Entero que indica si se desea graficar una marca que
indique la posicin de los pares ordenados, los valores que puede tomar
son:
0 Dibuja lneas y no las marcas
1 Dibuja lneas y marcas
2 Dibuja marcas y no lneas
6. dfEnded()
6.1 Descripcin: Finaliza la graficacin en el archivo DXF
6.2 Sintaxis: CALL dfEnded(FileNum)
6.3 Argumentos:
6.3.1 FileNum: es un nmero entero que indica el nmero asignado al
archivo, que por defecto es 1, y debe ingresarse como una variable
entera.

8.4.4 Ejemplo
El siguiente cdigo grafica las curvas de las funciones Seno y Coseno en un archivo
DXF.
program grafico
use dflib
integer i4,j4
character(25) archdata, texto,ARCHDXF
real, dimension (500)::x,y,z,w
pi=3.14159
do i=0,360,1
x(i+1)=pi*float(i)/180.
y(i+1)=sin(pi*float(i)/180.)

- 76 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

z(i+1)=cos(pi*float(i)/180.)
w(i+1)=0.0
enddo
archdxf='grafico.dxf'
CALL dfStart (archdxf,i4)
CALL dfAxis ('SENO Y COSENO','ANGULO','F(X)',x,y,W,360)
CALL dfGraph (x,y,W,360,0)
CALL dfGraph (x,Z,W,360,0)
CALL dfEnded (i4)
end

El resultado de la ejecucin del programa se muestra en la figura No. 25. Un ploteo en


3D es el que se presenta en la figura No. 26, que representa el casco de una lancha de
semiplaneo.

Figura No. 25.- Resultado de la ejecucin de programa.

Figura No. 26.- Casco de una lancha graficado con DXFortran

- 77 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

9.0 Libreras IMSL en Fortran


9.1 Generalidades
La versin de Visual Fortran disponible incluye en su paquete de instalacin, las
libreras IMSL (Integrate Mathematical and Statical Libraries) , una coleccin de cerca
de 1000 funciones matemticas y estadsticas de fcil acceso y uso desde el Estudio de
Desarrollo est divididas en 4 captulos que son:
1. IMSL Subrutinas Matemticas
2. IMSL Funciones especiales matemticas
3. IMSL Subrutinas Estadstica Vol 1 y 2.
4. IMSL Fortran 90 Subrutinas
Cada subrutina o funcin tiene un esquema de explicacin de fcil comprensin e
incluye:
1. Una breve descripcin de la subrutina.
2. Muestra la sintaxis de llamada desde el cdigo fuente.
3. Declara todas las variables usadas como argumento en la subrutina, da una
descripcin de lo que hacen y de qu tipo son.
4. Comentarios y aclaraciones del uso de la subrutina o de las variables que deben
usarse en la misma.
5. Define y explica el algoritmo usado para la solucin.
6. Propone un ejemplo de aplicacin para la subrutina o funcin.

9.2 Uso de la Librera desde Visual Fortran


Para usar las IMSL se necesita:
1. Que est instalada la librera, por defecto en la instalacin de Digital Visual
Fortran, ocurre esto, sin embargo si se realiz una instalacin personalizada se
puede verificar si ha sido instalada, en el Visual Studio, seleccin del men
TOOLS (Herramientas), OPTIONS (Opciones), luego la pestaa DIRECTORY
(Directorios), en el cuadro desplegable de DIRECTORIES, seleccionar
LIBRARIES y se verifica que la ruta para las IMSL se encuentre all. Si no es
as se la puede incluir con el botn Nueva Ruta.
2. Cuando se usa una rutina o funcin de la librera se debe declarar el mdulo:
numerical_libraries, usando la declaracin USE, sin embargo existen funciones
o rutinas que se usan como argumentos dentro de otras y que el manual
explcitamente lo menciona que deben declararse como EXTERNAL.

9.3 Ejemplo
Se us la rutina BCONG, que minimiza una funcin de N variables, sujeta a lmites de
las variables, usando el mtodo de Newton y una gradiente proporcionada por el
usuario.
program LibreriasIMSL
use numerical_libraries
INTEGER N
PARAMETER (N=2)
INTEGER IPARAM(7), ITP, L, NOUT
REAL F, FSCALE, RPARAM(7), X(N), XGUESS(N),XLB(N), XSCALE(N), XUB(N)

- 78 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

EXTERNAL ROSBRK
DATA XGUESS/-1.2E0, 1.0E0/, XSCALE/2*1.0E0/, FSCALE/1.0E0/
DATA XLB/-2.0E0, -1.0E0/, XUB/0.5E0, 2.0E0/
! All the bounds are provided
ITP = 0
! Default parameters are used
IPARAM(1) = 0
! Minimize Rosenbrock function using
! initial guesses of -1.2 and 1.0
CALL BCONF ( rosbrk,N, XGUESS, ITP, XLB, XUB, XSCALE, FSCALE,IPARAM,
RPARAM, X, F)
! Print results
CALL UMACH (2, NOUT)
WRITE (NOUT,10) X, F, (IPARAM(L),L=3,5)
!
10 FORMAT (' The solution is ', 6X, 2F8.3, //, ' The function ',&
&'value is ', F8.3, //, ' The number of iterations is ',&
& 10X, I3, /, ' The number of function evaluations is ',&
& I3, /, ' The number of gradient evaluations is ', I3)
!
END
!
SUBROUTINE ROSBRK (N, X, F)
INTEGER N
REAL X(N), F
!
F = 1.0E2*(X(2)-X(1)*X(1))**2 + (1.0E0-X(1))**2
!
RETURN
END

El resultado de ejecutar este cdigo se muestra en la figura No. 27.

Figura No. 27.- Ejecucin del programa

- 79 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

10.0 Aplicaciones Utiles


Con el propsito de hacer ms amigables las interfaces y los programas resultantes, a
continuacin detallamos algunas aplicaciones del cdigo que pueden ser tiles.

10.1 Creacin de archivos de ayuda


1. Para crear mens de ayuda, debemos primero crear el archivo, de preferencia
una pgina web con vnculos de tal forma que podamos llamarla desde el
programa para ejecucin.
2. Para llamarlo debemos usar el mdulo DFWIN, que controla las opciones para
abrir programas desde la ejecucin del programa. La funcin WINEXEC, es del
tipo entera y se usa de la siguiente manera:
i = winexec(Explorer.exe ayuda.htmC,sw_maximize)
i = winexec(winhlp32.exe ayuda.htmC,sw_maximize)
i = winexec(winhelp.exe ayuda.htmC,sw_maximize)

3. Otra forma de crear archivos de ayuda se la hace usando la aplicacin


HELPWORKSHOP, que se provee con el compilador de Visual Fortran.
4. Para compilar un proyecto se escribe un archivo en formato *.RTF, se lo
adiciona al proyecto y se compila.
5. En la actualidad existe en la pgina de MICROSOFT la aplicacin
HTMLHELP, que compila archivos de ayuda mucho ms vistosos, como el
mostrado en la figura No. 28.

Figura No. 28.- Archivo de ayuda realizado usando HTMLHELP

- 80 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

10.2 Abrir y guardar un archivo desde el men


Para realizar esta operacin hay que definir un objeto del tipo T_OPENFILENAME, y
luego configurar las opciones para que se presente el cuadro por defecto del sistema
operativo instalado en la mquina. Este comando es una implementacin del tipo de
proyecto Win32, por lo que es necesario definir el modulo DFWIN, la estructura del
cdigo fuente se detalla al final, para el caso de guardar todas las definiciones son las
mismas a excepcin de la funcin que verifica que el cuadro de dilogo se abre o cierra.
Para abrir un archivo la funcin es entera con la siguiente sintaxis:
I = getopenfilename(ofn)

Donde la variable ofn ha sido definida en la declaracin TYPE.


En el caso de guardar un archivo la funcin y su sintaxis es la siguiente:
I = GetSaveFileName(ofn)

Manteniendo las mismas observaciones.


Las especificaciones que deben definirse obligatoriamente para el objeto TYPE son las
siguientes:
1. Presenta el cuadro de dilogo cuando se lo llama: ofn%lStructSize =
SIZEOF(ofn)
2. Define las extenciones que debe presentar: ofn%lpstrFilter = loc(filter_spec)
3. Define el tamao, el nombre y la ubicacin del archivo que se escoge:
ofn%lpstrFile = loc(file_spec)
ofn%nMaxFile = sizeof(file_spec)
ofn%nMaxFileTitle = 0
4. Coloca el ttulo en el cuadro de dilogos: ofn%lpstrTitle = loc("Archivo de
datos"C)
5. Verifica la existencia de la ruta: ofn%Flags = OFN_PATHMUSTEXIST
6. Coloca la extensin por defecto que debe presentarse: ofn%lpstrDefExt =
loc("txt"C)
Ejemplo: Se supone que en el men de ventana se ha hecho un llamado a la subrutina
ABRIRARCHIVO, que es la que se describe a continuacin. El resultado se muestra en
la figura No. 29.
subroutine ABRIRARCHIVO
use dfwin
use dflib
implicit none
! Usa la declaracin del mdulo DFWIN
!
type(T_OPENFILENAME) ofn
! Se declara la especificacin del filtro, que tipo de archivo quiere abrirse.
! Esta es la concatenacin y siempre termina con una doble comilla vaca
! El primer caracter es el tipo de archivo, el segundo es una lista separada
! por punto y coma, del tipo de extensiones de los archivos, la lista termina ! con
espacio en blanco.
!
character*(*),parameter :: filter_spec = &
"Archivos de texto"C//"*.txt"C// &
"Cdigos fuente"C//"*.f90;*.f"C//""C

- 81 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1
! Declaracin de la variable para el archivo que se selecciona
! El esquema es rgido
character*512 :: file_spec = ""C
! Declaracin de otras variables
integer status,ilen,i,n,i4
character(512):: archdat
! Especificaciones del cuadro de dilogo de abrir, basado en Windows
! en la carpeta en la que se est trabajando.
ofn%lStructSize = SIZEOF(ofn)
ofn%hwndOwner = NULL
ofn%hInstance = NULL
ofn%lpstrFilter = loc(filter_spec)
ofn%lpstrCustomFilter = NULL
ofn%nMaxCustFilter = 0
ofn%nFilterIndex = 1
ofn%lpstrFile = loc(file_spec)
ofn%nMaxFile = sizeof(file_spec)
ofn%nMaxFileTitle = 0
ofn%lpstrInitialDir = NULL
ofn%lpstrTitle = loc(""C)
ofn%Flags = OFN_PATHMUSTEXIST
ofn%lpstrDefExt = loc("txt"C)
ofn%lpfnHook = NULL
ofn%lpTemplateName = NULL
! Se verifica si la funcin encontr el archivo
status = GetOpenFileName(ofn)
select case(status)
case(0)
i4 = messageboxqq('El archivo no ha sido encontradoC,AbrirC,mb$ok)
return
case(1)
ilen = INDEX(file_spec,CHAR(0))
! Reasigna la variable vector a una de caracter simple, el archivo se almacena
con toda la ruta
ARCHDAT=FILE_SPEC(1:ILEN-1)
end select
! la subrutina accion ejecutara algo cuando se abra el archivo
call accion(archdat)
end subroutine

Figura No. 29.- Ejecucin de la subrutina anterior

- 82 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

10.3 Presentacin de una tabla


La subrutina TABLA fue desarrollada con el propsito de hacer ms amigable la
presentacin de la informacin por pantalla cuando se trabaja con proyectos del tipo
FORTRAN STANDARD GRAPHICS or QUICKWIN APPLICATION. No hace nada
ms que dibujar la tabla, de tal forma que se vea como si estuviese una tabla de MS
Excel. Si se desea exportar la tabla a MS Excel, la rutina escribe un archivo de
intercambio de datos *.DIF, con extensin XLS, para que pueda ser abierto
directamente con la aplicacin MS Excel.
La subrutina tiene una sola llamada con la siguiente sintaxis:
CALL TABLA(array,titulo,ncols,nfilas,fmt,excel)
Array:

Es una variable real del tipo arreglo de NCOLSxNFILAS, no como


normalmente se hace de filas por columnas.

Titulo:

Es un vector del tipo alfanumrico con dimension NCOLS, que contiene


los ttulos de cada columna, si no se va a incluir ttulos, se declara el
vector y no se le asigna valores.
Nmero entero, indica el nmero de columnas del arreglo.
Nmero entero, indica el nmero de filas del arreglo.
Variable alfanumrica, que indica el Formato con el que desea escribir en
las celdas, se ingresa entre parntesis, el mximo nmero de espacios
posibles es 7.
Es una variable entera que indica si se desea exportar la tabla a MS Excel
o no, se ingresa el valor de 1 si desea exportar la tabla o 0 si no desea
exportarla.

Ncols:
Nfilas:
fmt

Excel

El cdigo abajo expuesto dar como resultado una tabla como la presentada en la figura
30.
program main
use dflib
real, dimension(1000,1000)::array
CHARACTER(6) TITULO(1000)
character(25)fmt
NROWS=10
NCOLS=2
do i=1,nrows
array(1,i)=0.2*i
enddo
do i=1,nrows
array(2,i)=30.*9.*array(1,i)*0.65/1.025
enddo
titulo(1)='H'
titulo(2)='DESP'
! Uno para generar el archivo, Cero para no generarlo
i4=1
fmt='(f7.1)'
CALL TABLA(array,titulo,ncols,nrows,fmt,i4)
end

- 83 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

Figura 30.- Resultado de la rutina


El cdigo de la rutina tabla se detalla a continuacin.
! Subrutina que escribe la tabla con el arreglo ARRAY(COLUMNAXFILA)
! y lo presenta en pantalla, en una ventana secundaria.
subroutine tabla(array,titulo,NCOLS,NROWS,FMT,EXCEL)
USE DFLIB
REAL,DIMENSION(1000,1000)::array
CHARACTER(6) TITULO(1000)
TYPE (windowconfig) wc
TYPE (xycoord)xy
TYPE (qwinfo)winfo
LOGICAL status
CHARACTER(25) Texto,fmt
INTEGER(2) dummy, x1, y1, x2, y2,result,style
INTEGER(2) fx(1000),fy(1000),tx(1000),ty(1000)
INTEGER(4) i4,EXCEL
IXPIXEL=50*(NCOLS+1)
IYPIXEL=20*(NROWS+1)+20
open(25,file='user')
! Muestra la ventana en la posicion que yo quiero de la ventana
!
wc%numxpixels = IXPIXEL
! pixels en X ancho de la ventana
wc%numypixels = IYPIXEL
! pixels en Y alto de la ventana
wc%numtextcols = -1
! -1 valores de defecto del sistema
wc%numtextrows = -1
wc%numcolors
= -1
wc%title
= "PARAMETROS CALCULADOS"C
wc%fontsize
= #0008000C
! Rquerido 8x12 pixeles de la fuente
status
= SETWINDOWCONFIG(wc)
i4 = SETBKCOLOR(8)
CALL CLEARSCREEN($GCLEARSCREEN)
i4 = clickmenuqq(qwin$tile)

- 84 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1
! Dibujo del fondo blanco de la tabla
i4 = setcolor(15)
dummy = rectangle( $GFILLINTERIOR, 25,20,NCOLS*50+25,NROWS*20+20)
i4 = setcolorRGB(#C0C0C0)
x1 = 0; y1 = 0
x2 = IXPIXEL-25; y2 = 20
dummy = rectangle( $GFILLINTERIOR, x1, y1, x2, y2 )
dummy = rectangle( $GFILLINTERIOR, x1, y1, 25,IYPIXEL-20)
i4 = setcolor(0)
! Dibujo de filas y columnas de ttulos
! Cuadrados para fila del ttulo
dummy = rectangle( $GBORDER, x1, y1, 25, y2 )
! Generacin de cuadros para fila de ttulos N cuadros
do i=1,NCOLS
dummy = rectangle( $GBORDER, x1+50*i-25, y1, 50*i+25, y2 )
enddo
! Cuadrados para columna de ttulos
dummy = rectangle( $GBORDER,x1,y1,25,20)
! Generacin de cuadros de columna para ttulos N cuadros
do i=1,NROWS
dummy = rectangle( $GBORDER, x1, (1+i)*20, 25, y1+i*20 )
enddo
! Fila de ttulos
result = INITIALIZEFONTS()
result = SETFONT('t''Arial''h15w6')
do i=1,NCOLS
call moveto(25+(i-1)*50+7,2,xy)
texto=titulo(i)
call outgtext(texto)
enddo
! Columna de ttulos
do i = 1,NROWS
call moveto(5,20*i+2,xy)
itexto = i
write(texto,'(i3)')itexto
call outgtext(texto)
enddo
! Clculo de celdas verticales
fx(1) = 75
fy(1) = 20
tx(1) = 75
ty(1) = NROWS*20+20
do i = 2,NCOLS
!desde aqu
fx(i) =50*i-25
fy(i) =20
!hasta aqu
tx(i) =50*i-25
ty(i) =NROWS*20+20
enddo
! Dibuja todas las lneas a la vez
! lneas grises verticales
i4 = setcolor(8)
style = #AAAA
CALL SETLINESTYLE(style)
result = LINETOAR(loc(fx),loc(fy),loc(tx),loc(ty), ncols)
! Dibujo de celdas horizontales
fx(1) = 25
fy(1) = 40
tx(1) = NCOLS*50+25
ty(1) = 40
do i = 2,NROWS-1
! desde aqu
fx(i) = 25
fy(i) = 20*(i+1)
! hasta aqu
tx(i) = NCOLS*50+25
ty(i) = 20*(i+1)
enddo

- 85 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1
! Dibuja todas las lneas a la vez
! lneas grises horizonales
i4 = setcolor(8)
style = #AAAA
CALL SETLINESTYLE(style)
result = LINETOAR(loc(fx),loc(fy),loc(tx),loc(ty), NROWS-1)
! Dibuja rectangulo exterior negro
i4 = setcolor(0)
style = #FFFF
CALL SETLINESTYLE(style)
dummy = rectangle( $GBORDER, 0,0,NCOLS*50+25,NROWS*20+20)
! Llenado de la tabla con el arreglo array(j,i) (COLUMNASXFILAS)
! Y siempre es 20*i+2, X siempre es 25+50*i+5 el formato es ingresado como parmetro
result = INITIALIZEFONTS()
result = SETFONT('t''Arial''h14w5')
! Se escriben los vectores por columnas
do j=1,NCOLS
do i=1,NROWS
call moveto(25+50*(j-1)+5,20*i+2,xy)
! Colocar el formato adecuado
write(texto,fmt)array(j,i)
call outgtext(texto)
enddo
enddo
select case(excel)
case(1)
TEXTO=TITULO(1)
call CVFxlsEsc(TEXTO,NCOLS,NROWS,ARRAY)
case(0)
excel=0
end select
END

10.3 Rutina de intercambio CVFDif


Esta rutina est creada para poder leer y escribir desde y hacia un archivo con formato
de intercambio de datos (DIF), desde un programa escrito en Fortran y capaz de ser
ledo como hoja electrnica por MS Excel.
Para que la subrutina pueda leer el archivo con formato DIF, debe crearse en MS Excel
una hoja electrnica y guardarse como archivo DIF, sin colocar ttulos en las columnas
y empezando en la casilla A1, la escritura se har manteniendo el mismo esquema, esto
es sin ttulos y empezando en la casilla A1.
La rutina est escrita en Fortran 90, formato libre, para ser usado en un proyecto del tipo
FORTRAN STANDARD GRAPHICS. No tiene la estructura de mdulo as que
bastar con adicionar al proyecto el archivo que la contiene y llamar a sus subrutinas
desde el programa principal.
Esta rutina es de distribucin GRATUITA y no puede ser comercializada total o
parcialmente. Est compuesta de dos subrutinas una para la lectura desde el archivo con
formato DIF y almacenada en un arreglo de dimensin FILAxCOLUMNA, de hasta
99999x99999, aunque esta propiedad es flexible, bastar con cambiar el tamao del
arreglo en la declaracin de la variable que almacenar la informacin en la subrutina
que se est usando. La segunda subrutina escribe un archivo con formato DIF de los
datos guardados en un arreglo de dimensin FILAxCOLUMNA, de hasta 99999x99999,

- 86 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

aunque al igual que la subrutina anterior esta dimensin puede variar de acuerdo a las
necesidades del usuario.
1. CVFxlsEsc ()
1.1 Descripcin: Esta subrutina escribe un archivo de datos en formato DIF, capaz
de ser ledo por MS Excel, con la informacin almacenada en un arreglo
x(fila,columna)
1.2 Sintaxis: CALL CVFxlsEsc (archdata,col,n,x)
1.3 Argumentos:
1.3.1 Archdata: es una variable alfanumrica que contiene el nombre del
archivo en el que se escribir la informacin, el programa coloca la
extensin DIF, si el nombre no la tiene y cambia cualquier extensin que
se ingrese a la de DIF.
1.3.2 Col: es el nmero de columnas del arreglo
1.3.3 N: es el nmero de filas del arreglo
1.3.4 X: es el arreglo donde se almacena la informacin que desea escribirse
en el archivo, tiene dimensin (n,col)
2. CVFxlsLee()
2.1 Descripcin: Esta subrutina lee desde un archivo de datos en formato DIF,
informacin numrica y la almacenada en un arreglo x(fila,columna).
2.2 Sintxis: CALL CVFxlsLee (archdata,col,n,x)
2.3 Argumentos: Requiere de los siguientes argumentos de entrada:
2.3.1 Archdata: es una variable alfanumrica que contiene el nombre del
archivo en el que se escribir la informacin, el programa coloca la
extensin DIF, si el nombre no la tiene y cambia cualquier extensin que
se ingrese a la de DIF.
2.3.1 Col: es el nmero de columnas del arreglo, esta variable es el resultado
de llamar a la subrutina.
2.3.1 N: es el nmero de filas del arreglo, variable resultante de llamar a la
subrutina.
2.3.1 X: es el arreglo donde se almacena la informacin que se lee desde el l
archivo, tiene dimensin (n,col).
El cdigo fuente que ejecuta esta subrutina se detalla a continuacin:
! INICIO DE RUTINA DE ESCRITURA EN EXCEL
! Esta subrutina escribe en un archivo de intercambio de datos, para
! abrirlo en Excel, por defecto se crea una sola hoja electnica.
subroutine CVFxlsEsc(archdat,col,n,x)
! Nota: la declaracin del arreglo x(n,col) debe ser la misma que en
! el arreglo del archivo principal
! la variable con la que se llama a la subrutina debe tener la
! misma dimensin para que sea compatible.
!
! Argumentos
!
! archdat
Nombre del archivo de datos, el programa cambia la
!
extensin a DIF
! col
Nmero de columnas del arreglo de datos, entero
! n
Nmero de filas del arreglo de datos, entero
! x
Arreglo que contiene la informacin que desea guardarse d
!
aunque es mandatorio que debe tener la misma dimensin de
!
la variable que llama a la subrutina.

- 87 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

use dflib
use dfwin
integer i,n,col
real, dimension(10,10):: x
character*25 archdat,archdif,arch
character*1 resul(29)
equivalence (resul(1),archdif)
! Cambio o coloca la extensin al nombre del archivo de datos
archdif=archdat
do i=1,25
k=26-i
if((resul(k).ne.' ')) goto 7
end do
7 nt=k
if (nt.ge.5) then
if (resul(nt-3).eq.'.') then
resul(nt-2)='d'
resul(nt-1)='i'
resul(nt) ='f'
endif
else
resul(nt+1)='.'
resul(nt+2)='d'
resul(nt+3)='i'
resul(nt+4)='f'
endif
! Fin del cambio de extensin
! Abrir el archivo DIF
open(2,file=archdif,status='new',err=1969)
! Escribe el encabezado
write(2,10)n,col
! Fin del encabezado
! Escritura de resultados
do i=1,n
write(2,13)
do j=1,col
write(2,14)x(i,j)
end do
end do
! Fin de escritura de informacin
! Cerrar el archivo de resultados
write(2,15)
close(2,status='keep')
i4=messageboxqq('El programa ha terminado, se ha generado un &
& archivo, \rescrito en formato de intercambio de &
& datos'c,'Fin de la aplicacin'c,&
& mb$iconexclamation.or.mb$ok)
!
! para poder ver el archivo de resultados debe cambiarse el nombre del
! archivo LEE.DIF por el nombre que se uso en el programa
!

- 88 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

!if (i4.eq.mb$idyes) then


!
i4=winexec('explorer.exe lee.dif 'c,sw_maximize)
!end if
! Fin del cierre del archivo de resultados
return
1969 i4=messageboxqq('El archivo ya existe, desea reemplazarlo?'c,&
& 'Error'c,mb$iconstop.or.mb$yesno)
if (i4.eq.mb$idyes) then
! Escribe el encabezado
write(2,10)n,col
! Fin del encabezado
! Escritura de resultados
do i=1,n
write(2,13)
do j=1,col
write(2,14)x(i,j)
end do
end do
! Fin de escritura de informacin
! Cerrar el archivo de resultados
write(2,15)
close(2,status='keep')
i4=messageboxqq('El programa ha terminado, se ha generado un archivo\r
& escrito en formato de intercambio de datos'c, 'Fin de&
& la aplicacin'c, mb$iconexclamation.or.mb$ok)
!i4=messageboxqq('El programa ha terminado, desea ver el\rarchivo&
!
& escrito en formato dif?'c, 'Fin de la aplicacin'c,&
!
& mb$iconquestion.or.mb$yesno)
!
!if (i4.eq.mb$idyes) then
!
i4=winexec('explorer.exe lee.dif'c,sw_maximize)
!end if
! Fin del cierre del archivo de resultados
return
endif
! Listado de formatos para escribir en el archivo DIF
10 format('TABLE',/,'0,1',/,'"EXCEL"',/,'VECTORS',/,'0,',I5,/'""',/&
&,'TUPLES',/,'0,',I5,/,'""',/,'DATA',/'0,0',/,'""')
13 format('-1,0',/,'BOT')
14 format('0,',e12.6,/,'v')
15 format('-1,0',/,'EOF')
end subroutine
!
!
!
!
!
!

INICIO DE RUTINA DE LECTURA DESDE EXCEL


Esta subrutina lee un archivo de intercambio de datos, que ha sido
creado en Excel y grabado con la extensin DIF, para crear un
archivo de datos es necesario comenzar en la celda A1, el archivo
debe contener titulos en la fila 1 y los datos numricos a partir de
la fila 2, escritos en formato E10.4

- 89 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

subroutine CVFxlsLee(archdat,col,n,x)
! Nota: la declaracin del arreglo x(n,col) debe ser la misma que en
! el arreglo del archivo principal, la variable con la que se llama a
! la subrutina debe tener la misma dimensin para que sea compatible.
!
! Argumentos
!
! archdat
Nombre del archivo de datos siempre con extensin DIF
! col
Nmero de columnas del arreglo de datos, esta variable es
!
el resultado de llamar a la subrutina. INTENT (OUT)
! n
Nmero de filas del arreglo de datos. INTENT (OUT)
! x
Arreglo que resulta de leer la informacin desde un archivo
!
de datos DIF, es de dos dimensiones (NxCOL)
use dflib
integer i
integer, intent(out):: n,col
real, intent(out), dimension (200,200):: x
character*25 archdat
character*2 alfa,bravo
! Abrir el archivo para lectura y
! Obtencin del nmero de filas (n) y columnas (col)
open(2,file=archdat,status='old',err=1969)
read(2,10)n
read(2,11)col
10 format(////,2x,i4)
11 format(//,2x,i4)
! Fin de lectura inicial Filas y columnas
! Inicio de lectura por filas
read(2,12)alfa
do i=1,n
read(2,13)
do j=1,col
read(2,14)x(i,j)
end do
end do
12 format(///,a2)
13 format(/,a2)
14 format(2x,e12.6,/)
! Fin de la lectura de datos
! Cerrar el archivo de datos
close (2,status='keep')
! Fin
return
1969 i4 = messageboxqq('El archivo no ha sido encontrado'c, 'Error'c,&
& mb$iconstop.or.mb$ok)
end subroutine

- 90 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

10.5 Ventanas virtuales amplias


Esta rutina es una adaptacin de un ejemplo de Visual Fortran codificado con lenguaje
mixto, C++ & Fortran, la idea es que cuando listamos gran cantidad de tems en la
ventana virtual, sta es muy pequea para ver todos los elementos que hemos listado,
con la rutina que se explica a continuacin podemos ir desplazando la ventana de
presentacin hacia abajo conforme se listan los resultados o simplemente vamos
directamente al final, sin perder la presentacin de los primeros datos de la lista. La
rutina incluye comentarios para ir guiando al usuario.
program VENTANA_SCROLL
use dflib
use dfwin
TYPE (windowconfig) wc
TYPE(qwinfo) wci
TYPE(rccoord) rc
integer*4 i, j, status, irow, rowmoves, pagesize
character*1 ch
I=0
open(unit=6,file="user")
!HAY QUE COLOCAR UN GRAN NUMERO DE FILAS DE TEXTO,
!MUCHO MAYOR QUE LA VENTANA VISIBLE
wc%numtextrows = 1501 ! NUMERO QUE BAJARA CON SCROLL
wc%numtextcols = 80
wc.numxpixels = -1
wc.numypixels = -1
wc.numcolors
= -1
wc.title
= "Unit 6"C
wc.fontsize
= #00080010
! ACTIVAMOS LA CONFIGURACION DE LA VENTANA
status = setwindowconfig(wc)
IROW=1
DO I=1,1000
WRITE(6,*)'DATO No. ',I
ENDDO
!POSICION AL FINALIZAR LA ESCRITURA
call gettextposition(rc)
rowmoves = rc.row - irow
!AJUSTAMOS LA VENTANA VISIBLE
pagesize = 20
rowmoves = rowmoves - pagesize+1
!call tobottom(6) ! LO MAS SIMPLE
call scrolldown(6, rowmoves) ! EL SCROLL VIAJA CON LA ESCRITURA
END
subroutine tobottom(unit)
use dflib
use dfwin
integer unit, hwnd, res
hwnd = GetHwndQQ(unit)
res = SendMessage(hwnd,WM_VSCROLL,SB_BOTTOM,0)
end subroutine tobottom
subroutine scrolldown(unit,rows)
use dflib

- 91 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

use dfwin
integer unit, hwnd, res, rows, i
hwnd = GetHwndQQ(unit)
do i = 1, rows
res = SendMessage(hwnd,WM_VSCROLL,SB_LINEDOWN,0)
enddo
end subroutine scrolldown

Un ejemplo de aplicacin se muestra en la figura No. 31.

Figura No. 31.- Ejecucin de la rutina ScrollDown, a la izquierda el inicio y a la derecha


el fin, ntese que con una ejecucin normal no podramos ver el inicio del archivo

10.6 Resolucin de sistemas de ecuaciones lineales


10.6.1 Resolucin Numrica
El mtodo numrico de resolucin de ecuaciones lineales no evala previamente el
determinante de la matriz para determinar la regularidad de la matriz de coeficientes,
aunque se puede evaluar la matriz teniendo en cuenta la diagonal principal y el origen
del sistema para de esta forma determinar el tipo de matriz.
La generacin de algoritmos implica optimizacin y eficacia, existen tres criterios
fundamentales para analizar los algoritmos.
1. Nmero de operaciones necesarias: este criterio tiene que ver con el tiempo que demora
el computador en resolver el sistema, si bien no es exactamente el valor obtenido de
multiplicar el tipo de operaciones bsicas por el nmero de veces que ser realiza, debido
a que existen operaciones lgicas, lazos anidados, etc. Sin embargo es un buen
indicador de la tendencia, ya que depende normalmente de n, dimensin de la matriz,

- 92 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

por lo que podramos ver como vara si alteramos o cambiamos el orden n de la


matriz.
2. Necesidades de almacenamiento: este criterio tienen que ver con la capacidad del
computador en lo que respecta a memoria fsica, el tipo de almacenamiento vendr dado
por el tipo de sistema que tengamos.
3. Rango de aplicacin: no todos los mtodos resuelven todos los sistemas no singulares
de ecuaciones lineales, pequeos errores de redondeo pueden acarrear grandes errores
en la solucin numrica, luego en un sistema de ecuaciones medio-grande el anlisis de
errores por redondeo no es trivial.

Los algoritmos deben cumplir simultneamente los tres criterios planteados.


Desde el punto de vista general las matrices ms usuales en ingeniera pueden
englobarse en dos categoras:
1. Matrices llenas pero no muy grandes: llenas entendemos que tienen pocos elementos
nulos, y no muy grandes de sistemas de hasta algunos miles de ecuaciones, son tpicos
de problemas estadsticos, matemticos y fsicos.
2. Matrices vacas pero muy grandes: vacas entendemos que tienen pocos elementos no
nulos y ubicados con cierta simetra, y muy grandes indica que superan los miles,
incluso llegan a los millones. Son tpicas de problemas de ingeniera.

En trminos generales los mtodos de resolucin se ajustan a los tipos de matrices, los
primeros se resuelven con mtodos directos y los segundos con mtodos iterativos.

10.6.2 Mtodos de resolucin

Mtodos directos
Los mtodos directos de resolucin son aquellos que permiten obtener la solucin del
sistema despus de un nmero finito de operaciones.
Debido a que las computadoras tienen un nmero finito de cifras decimales, los errores
de redondeo se propagan, de manera que se pretende desarrollar mtodos con un
nmero mnimo de operaciones, la clasificacin de los mtodos directos son:

Sistemas con solucin inmediata


1. Matriz diagonal: en este caso se escribe A como:

- 93 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

Y la solucin se obtiene directamente como:

Existe solucin si los elementos de la diagonal son no nulos y el determinante de A es


igual al producto de todos los trminos de la diagonal, el nmero de operaciones que
deben realizarse es n.
2. Matriz triangular superior y triangular inferior: en este caso se definen como L (lower) a
la matriz triangular inferior, y U (upper) a la matriz triangular superior. Y se las define
como:

La solucin se expresa como sustitucin hacia delante o hacia atrs, segn se est
resolviendo un sistema triangular superior o inferior respectivamente. Los algoritmos
para resolver estas matrices son:

El nmero de operaciones que deben realizarse en cada caso es: n2 para ambos casos

Mtodos de eliminacin
1. Mtodo de Gauss, eliminacin simple: este mtodo se basa en transformar la matriz
original A, mediante permutaciones y combinaciones lineales de las ecuaciones en una
matriz triangular superior, este nuevo sistema equivalente se resuelve de manera
inmediata, aplicando el algoritmo del apartado anterior.
Las ecuaciones que transforman la matriz original en una triangular superior y
modifican al trmino independiente son:

- 94 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

El nmero total de operaciones que se realizan en el algoritmo son:


Este mtodo supone que los elementos de la diagonal principal modificada son no
nulos, as que la obtencin de un elemento nulo hara que el sistema falle.
Si el elemento nulo existe en la diagonal, se permuta entre filas hasta obtener el
elemento no nulo mayor en valor absoluto, esta permutacin de filas no solo tiene
inters cuando el pivote es exactamente cero, es obvio que para valores pequeos del
pivote los errores de redondeo ocasionan grandes errores, ya que siempre se divide para
el valor del pivote; existen dos tcnicas para escoger el valor absoluto mayor:
a. En el k-simo sistema se toma como pivote el coeficiente de mayor valor absoluto
de la columna k situado por debajo de la fila k inclusive. Para esto es necesario
permutar las filas k y la correspondiente al pivote escogido en la matriz y su
trmino independiente. A este mtodo se conoce como Mtodo de Gauss con
pivotamiento parcial
b. En el k-simo sistema, se toma como pivote el coeficiente mayor en valor absoluto
de la submatriz de orden n-k, definida por los coeficientes que quedan or debajo de
la fila k y a la derecha de la columna k. Para ello, se permuta la fila k y la columna
k con las correspondientes al coeficiente que cumple con la condicin citada. Al
final del proceso deben ponerse en el orden inicial las componentes del vector
solucin puesto que su posicin ha sido modificada al realizar las permutaciones de
columnas. A este mtodo se conoce como Mtodo de Gauss con pivotamiento total.
2. Mtodo de Gauss-Jordan: Es una modificacin del mtodo de Gauss, cuyo objetivo
adems de transformar la matriz, sigue realizando operaciones para convertir la matriz
en la matriz identidad, luego la solucin del sistema es el trmino independiente
resultante. Se puede definir esta matriz como

Las ecuaciones que definen el algoritmo son las siguientes:

El nmero de operaciones que se realizan con este algoritmo son:

Mtodos de descomposicin
Los mtodos de factorizacin se fundamentan en el concepto de que toda matriz A
puede descomponerse en matrices triangulares superiores e inferiores o en el producto

- 95 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

de ambas luego el sistema original A x = b se transforma en dos sistemas de solucin


inmediata, de la forma:

1. Mtodo de Crout: este mtodo de factorizacin transforma la matriz A en dos matrices


triangulares donde una de ellas, la superior tiene la diagonal llena de unos. El algoritmo
que transforma la matriz es el siguiente.

Finalmente el sistema se resume a resolver dos sistemas de solucin inmediata de


manera sucesiva. El mtodo de Doolitle es similar a este algoritmo ya que consigue el
mismo resultado, sin embargo este es ms eficiente.
2. Mtodo de Cholesky: la factorizacin de Cholesky se aplica nicamente a matrices
simtricas y definidas como positivas, aprovecha el concepto de que una matriz A
puede transformarse en una triangular inferior, y la superior corresponde a la
transpuesta de esta matriz triangular. Simblicamente se representa como:
A = LLT
El algoritmo que factoriza la matriz A es el siguiente:

- 96 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

3. Mtodos de descomposicin generalizada: Al igual que en el mtodo de Crout, si se


desea se puede conseguir que las dos matrices triangulares de la descomposicin tengan
unos en la diagonal, agregando una matriz D a la factorizacin de la matriz A,
obtenindose como resultado: A = LDU, de igual forma para el mtodo de Cholesky
puede generalizarse como A = LLT.
El algoritmo para realizar esta transformacin es para el caso del Mtodo de Crout:

El algoritmo para realizar la transformacin para el caso del Mtodo de Cholesky es el


siguiente:

- 97 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

4. Mtodo de Thomas: matrices tridiagonales, este mtodo se obtiene particularizando el


mtodo de Crout al caso de u = l = 1, el algoritmo que resuelve esta matriz es:

10.6.3 Ejercicio de aplicacin


En la resolucin numrica de una ecuacin diferencial ordinaria que modela la
deformacin de una viga de longitud la unidad, sometida a una carga distribuida de
valor la unidad se ha obtenido un sistema lineal de ecuaciones Ax = b, donde A es una
matriz de orden n, simtrica y en banda, cuyos coeficientes se determinan como:

Y b es un vector con coeficientes:


Donde los valores de E, I, a, b, pa, pb son constantes del problema y

. Se pide

1. Escribir un programa en FORTRAN usando dimensionamiento dinmico para generar


la matriz A y el vector b
2. Resolver el sistema de ecuaciones por un mtodo de los revisados en el curso para los
siguientes datos: a = 0, b = 1, pa = 1, pb = 1, E = 105, I = 10-5 y para n con valores 5, 19
y 99.
3. Importar los resultados a EXCEL y generar para cada valor de N una lista de pares
ordenados
con i = 0, ., n+1, segn las siguientes relaciones:

- 98 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

Y xi con i = 1, ., n, iguales a los resultados obtenidos a partir del programa. Presentar


un solo grfico con las tres series de pares ordenados.

Nota: Toda la teora, algoritmos y ejemplo han sido extrados del texto de la referencia:
[8]

- 99 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

11.0 Normas Europeas para escribir y documentar


cdigos fuente en Fortran 90
El siguiente es un extracto de los aspectos ms importantes de las normas europeas de
codificacin en Fortran 90 obtenida del sitio de Internet: www.met-office.gov.uk , los
comentarios o puntos de vista del autor, van en cursiva.

11.1 Documentacin
La documentacin de una aplicacin puede ser agrupada en dos categoras, la
documentacin externa, es decir la que se genera fuera del cdigo y la interna que viene
incluida dentro del cdigo. Para fines de modificaciones, stas deben hacerse en los dos
tipos de documentacin y en lo posible si el cdigo va a ser colocado en Internet o para
intercambio con otros centros de investigacin deben escribirse en ingls.

11.1.1 Documentacin Externa


Debe ser provista a manera de libretn impreso, es opcional el formato digital conocido
en el medio: DOC, PDF, HTML, TXT, etc. Y en trminos generales debe contener los
siguientes apartados:
1. Documentacin cientfica: aqu se describe el problema que se est resolviendo,
el motivo y el mtodo adoptado para su solucin, esta informacin es
independiente y no debe hacer referencia al cdigo.
2. Documentacin de la implementacin: es la descripcin de la implementacin
del mtodo de solucin enunciado en la parte 1, Todas los subprogramas
(subrutinas, mdulos, funciones, etc.) deben listarse por orden alfabtico y hacer
un pequeo resumen en el que se describa que hacen. Adems debe incluirse un
rbol de llamadas a los subprogramas.
3. Gua de uso del programa: se describe en detalle todas las variables de entrada y
salida de informacin, incluido los argumentos de los subprogramas y cualquier
otra variable que ingrese informacin ya sea desde pantalla o archivo, se indica
tambin el tipo de variable y los lmites que pueden tener los valores ingresados,
la lista de archivos que son ledos o escritos por el programa.
La documentacin externa es obligatoria a cada aplicacin o paquete de aplicaciones
que se presenten.

11.1.2 Documentacin Interna


Esta informacin es aplicada para cada nivel de subprograma y programa principal,
existen 4 tipos de documentacin interna y todos deben estar presentes en el cdigo.
1. Encabezados: todo programa principal o subprograma debe contener el
encabezado donde se describe brevemente el subprograma o programa y se
declaran todas las variables usadas con una descripcin de lo que hacen. Puede
hacerse referencia a la documentacin externa pero no se puede omitir los
encabezados ni su estructura. Al final de este captulo, se encuentran las formas
de los encabezados de programas principales y subprogramas.
2. Inicios de seccin dentro de un programa o subprograma: dividen el cdigo en
secciones lgicas de operaciones, se escriben dentro del cdigo y al inicio de
cada seccin. El formato que debe seguirse es el siguiente:

- 100 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

!----------------------------------------------!
! [Nmero de seccin] [Ttulo de seccin]
!
!-----------------------------------------------------------------------

3. Otros comentarios, estn orientados a simplificar el entendimiento de los que se


est haciendo en cada paso, se incluye dentro de las lneas y en cualquier lugar
del cdigo. El formato recomendado es el siguiente
! [Comentario]

4. Nombres de significados fciles de entender: va orientado a que cualquier


persona identifique rpidamente el tipo de variable o lo que almacena. Por
ejemplo una variable que almacena la informacin de distancia puede llamarse:
longitud distancia, que se entendera mejor que si se llama X o D.

11.2 Obsolescencias de otras versiones


Algunas de las siguientes sentencias se recomiendan no usarlas en la codificacin de
Fortran 90, debido a que causan redundancia y hacen poco eficientes los programas, se
incluye al lado de cada declaracin obsoleta la declaracin aplicable a la Versin F90.
1. COMMON blocks Use MODULES
2. EQUIVALENCE Use POINTERS o sus derivados
3. GOTO Use SELECT CASE
4. IF aritmtico Use IF THEN
5. DO seguido de un nmero Use DO ENDDO
6. Lnea de FORMAT Use formatos especficos dentro de READ o WRITE; otra
opcin es declarar el parmetro fmt.
7. PAUSE

11.3 Reglas bsicas de codificacin


1. Siempre use sintaxis de formato libre (free format)
2. La lnea de cdigo debe tener mximo 80 caracteres, si bien Fortran 90 admite
132 columnas, esto puede causar problemas de visualizacin y errores en la
impresin de hojas A4.
3. Siempre debe usarse la sentencia IMPLICIT NONE, de tal forma que puedan
detectarse los errores en declaracin o uso de variables.
4. Los nombres de las variables deben ser trminos que indiquen el valor que se
almacena o se pide, se aceptan abreviaciones de estas palabras cuando son
demasiado largas. Lo importante es que sean fcilmente identificadas.
5. Las sentencias y declaraciones deben escribirse con maysculas solo la primera
letra y el resto con minsculas, se admiten esquemas mixtos cuando se unen dos
palabras.
6. Los cortes de lneas de cdigo deben hacerse en lugares que sean fciles de
interpretar y entender.
7. Usar espacios en blanco vertical y horizontal, para dar facilidad de lectura, en el
sentido vertical, luego de un comentario o para separar bloques de ejecucin, y
horizontal antes y despus de un signo de operacin para separar las variables de
otras sentencias o declaraciones.
8. Borre todo cdigo o comentario que no sirva en la ejecucin final de la
aplicacin.
- 101 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

9. No coloque mltiples declaraciones en una sola lnea, reduce la facilidad de


lectura del cdigo.
10. Cuando se declaran variables observar las siguientes normas:
a. Para arreglos no use la declaracin DIMENSION sola, use la sintaxis
para declarar arreglos de la siguiente forma:
Real, dimension (:,:) ::

NombreArreglo

b. Use siempre despus de definir el tipo de variable los signos ::


c. Declare la longitud de las variables de carcter usando la siguiente
sintaxis: character (len = 25) ArchData

11.4 Encabezados para programas y subprogramas


Todo lo que se encuentre entre [ ] debe ser llenado por el usuario con la informacin
correspondiente a cada caso

11.4.1 Programas principales


!
!
Program

[ProgramName]

! Description:
!
[Say what this program does]
!
! Method:
!
[Say how it does it: include references to external documentation]
!
[If this routine is divided into sections, be brief here,
!
and put Method comments at the start of each section]
!
! Input files:
!
[Describe these, and say in which routine they are read]
! Output files:
!
[Describe these, and say in which routine they are written]
! Current Code Owner: [Name of person responsible for this code]
!
!
!
!

History:
Version
Date
---------[version] [date]

Comment
------Original code. [Your name]

! Code Description:
!
Language:
Fortran 90.
!
Software Standards: "European Standards for Writing and
!
Documenting Exchangeable Fortran 90 Code".
! Declarations:
! Modules used:
Use, Only : &
! Imported Type Definitions:
! Imported Parameters:
! Imported Scalar Variables with intent (in):

- 102 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

! Imported Scalar Variables with intent (out):


! Imported Array Variables with intent (in):
! Imported Array Variables with intent (out):
! Imported Routines:
!
Implicit None
! Include statements
! Declarations must be of the form:
! [type]
[VariableName]
! Description/ purpose of variable
! Local parameters:
! Local scalars:
! Local arrays:

!- End of header -------------------------------------------------------

11.4.2 Subrutinas
! [A one line description of this subroutine]
!
Subroutine [SubroutineName] &
!
!
([InputArguments, inoutArguments, OutputArguments])
! Description:
!
[Say what this routine does]
!
! Method:
!
[Say how it does it: include references to external documentation]
!
[If this routine is divided into sections, be brief here,
!and put Method comments at the start of each section]
!
! Current Code Owner: [Name of person responsible for this code]
!
! History:
! Version
Date
Comment
! ---------------! [version] [date]
Original code. [Your name]
!
! Code Description:
!
Language:
Fortran 90.
!
Software Standards: "European Standards for Writing and
!
Documenting Exchangeable Fortran 90 Code".
!
! Declarations:
! Modules used:
Use, Only : &
! Imported Type Definitions:
! Imported Parameters:

- 103 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

! Imported Scalar Variables with intent (in):


! Imported Scalar Variables with intent (out):
! Imported Array Variables with intent (in):
! Imported Array Variables with intent (out):
! Imported Routines:
! [Repeat from Use for each module...]
Implicit None
! Include statements:
! Declarations must be of the form:
! [type]
[VariableName]
! Description/ purpose of variable
! Subroutine arguments
! Scalar arguments with intent(in):
! Array

arguments with intent(in):

! Scalar arguments with intent(inout):


! Array

arguments with intent(inout):

! Scalar arguments with intent(out):


! Array

arguments with intent(out):

! Local parameters:
! Local scalars:
! Local arrays:
!- End of header ------------------------------------------------

11.4.3 Funciones
! [A one line description of this function]
!
Function [FunctionName]]&
([InputArguments])
&
Result ([ResultName]) ! The use of result is recommended
! but is not compulsory.
!
!
!
!
!
!
!
!
!
!
!
!

Description:
[Say what this function does]
Method:
[Say how it does it: include references to external documentation]
[If this routine is divided into sections, be brief here,
and put Method comments at the start of each section]
Current Code Owner: [Name of person responsible for this code]
History:
Version

Date

Comment

- 104 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

!
!
!
!
!
!
!
!
!
!

---------[version] [date]

------Original code. [Your name]

Code Description:
Language:
Fortran 90.
Software Standards: "European Standards for Writing and
Documenting Exchangeable Fortran 90 Code".
Declarations:
Modules used:

Use, Only : &


! Imported Type Definitions:
! Imported Parameters:
! Imported Scalar Variables with intent (in):
! Imported Scalar Variables with intent (out):
! Imported Array Variables with intent (in):
! Imported Array Variables with intent (out):
! Imported Routines:
! [Repeat from Use for each module...]
Implicit None
! Declarations must be of the form:
! [type]
[VariableName]
! Description/ purpose of variable
! Include statements:
! Function arguments
! Scalar arguments with intent(in):
! Array

arguments with intent(in):

! Local parameters:
! Local scalars:
! Local arrays:
!- End of header ----------------------------------------------------

11.4.4 Mdulos
! [A one line description of this module]
!
Module [ModuleName]
!
! Description:
!
[Say what this module is for]
!
! Current Code Owner: [Name of person responsible for this code]
!

- 105 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

! History:
!
! Version
Date
Comment
! ---------------! [version] [date]
Original code. [Your name]
!
! Code Description:
!
Language:
Fortran 90.
!
Software Standards: "European Standards for Writing and
!
Documenting Exchangeable Fortran 90 Code".
!
! Modules used:
!
Use, only : &
! Imported Type Definitions:
! Imported Parameters:
! Imported Scalar Variables with intent (in):
! Imported Scalar Variables with intent (out):
! Imported Array Variables with intent (in):
! Imported Array Variables with intent (out):
! Imported Routines:
! Declarations must be of the form:
! [type]
[VariableName]
! Description/ purpose of variable
Implicit none
! Global (i.e. public) Declarations:
! Global Type Definitions:
! Global Parameters:
! Global Scalars:
! Global Arrays:
! Local (i.e. private) Declarations:
! Local Type Definitions:
! Local Parameters:
! Local Scalars:
! Local Arrays:
! Operator definitions:
!
Define new operators or overload existing ones.
Contains
! Define procedures contained in this module.
End module [ModuleName]
!- End of module header

- 106 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

12.0 Ejercicios Propuestos


1. Escribir un programa que obtenga el nmero factorial de un entero ingresado por
pantalla, el resultado debe mostrarse por pantalla
2. Escribir un programa para resolver la ecuacin de 2do. Grado ingresando los
coeficientes de la ecuacin de la forma Ax2+Bx+C=0. Incluir las opciones con
respuestas imaginarias.
3. Escribir un programa para realizar la integracin de un conjunto de ordenadas,
ledas desde un archivo, usando el mtodo de Simpson 1/3. Los resultados deben
mostrarse en pantalla y en un archivo de resultados.
4. Escriba un programa que ordene los valores de un vector de mayor a menor y
viceversa, el vector se lee desde un archivo.
5. Escriba un programa que dada una matriz nxm sume filas, columnas y general,
halle promedios entre filas y columnas y general, la matriz se lee desde un
archivo y los resultados deben ser impresos por pantalla y en un archivo.
6. Escriba un programa que realice operaciones con vectores en 3 dimensiones,
suma, resta, producto escalar y vectorial y determinacin del mdulo del vector.
7. El arqueo bruto de un barco puede aproximarse usando formulacin sencilla, y
considera al volumen TRB desglosado en las siguientes capacidades, todas en
m3:
a. Volumen del casco por debajo de la cubierta de Arqueo, hasta el nivel
del puntal.
VDB LPP B D CBD
D T
CBD CB 0.35
1 CB
T
b. Volumen debido a la brusca de la cubierta
VBR 0.012LPP B 2
c. Volumen de superestructuras y casetas
VSUP 41LPP 755
Escriba un programa para determinar de manera aproximada el TRB de un barco
dados LPP, B, D, T y CB. La informacin y el resultado final, deben mostrarse
en pantalla, los resultados intermedios deben guardarse en un archivo de
resultados con el nombre del barco.
8. La seleccin de un coeficiente de bloque adecuado est relacionado con el
nmero de Froude, elegido de esta forma nos permite posteriormente optimizar
las formas. Existen varias formulaciones para determinar el CB a partir del
nmero de Froude, a continuacin se listan 4, con estas formulaciones escribir
un programa que muestre los valores que se obtienen de CB para un rango del
nmero de Froude entre 0.14 y 0.32 para el mismo buque: LPP de 115 m y
Manga de 11 m., la informacin debe presentarse en forma de tabla y la columna
final debe obtener un promedio de cada caso.

- 107 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

V
0.5V
3.28 LPP
LPP
CB 0.7 0.125ATAN 25
0.14 LPP 20B
CB
FN
26B
0.23 LPP 20B
CB
3
26B
FN 2
CB

0.23 FN

9. El efecto de superficie libre sobre la estabilidad del buque, en el caso de los


tanques de carga de un tanquero tiene un tratamiento diferente al clsico, el
momento escorante debido al movimiento del lquido se calcula con la frmula:
M IT WPVOL C , donde WPVOL es el peso especfico del lquido en
TON/m3, IT el momento de inercia transversal del tanque en m4, C es una
correccin en funcin de la geometra del tanque, grado de llenado y ngulo de
escora. La correccin del brazo adrizante se calcula como:
M
GZ
Se pueden presentar 3 casos:
a. La superficie libre no toca el techo ni el fondo del tanque
1
C SEN 1
TAN 2
2
Esta relacin es vlida para ngulos menores al definido por:
2N H
TAN
B
b. La superficie libre est limitada por el techo y una pared del tanque
N S
C 2N S 3COS
3N S SEN
4COS2
SEN 2
Esta relacin es vlida para ngulos menores al definido por:
H
TAN
2N B
c. La superficie libre est limitada por el techo y el fondo del tanque, la
correccin en el intervalo - 90 grados se define como
1 2
C S 6 N 1 N COS
S SEN
S COS 2 COS2
2
Donde N es la fraccin vaca del tanque, H la altura del tanque, B manga del
tanque y S la relacin H/B.
Escribir un programa asumiendo un tanque de seccin rectangular en toda su
eslora, para determinar el brazo de adrizamiento de un barco tanquero de 2000
TON de desplazamiento con tanques de 17 m de largo por 12 de ancho y 10 de
alto, para fracciones de llenado desde 10% a 90% para los 3 casos. El resultado
debe mostrarse como una tabla en pantalla y en un archivo de resultados.
10. Escriba un programa en Fortran que almacene en una matriz de dimensin NxN,
la funcin que se describe, entre los valores de -2.0 y 2.0, para X y Y.

- 108 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

x 2 y2

11. Las caractersticas de maniobrabilidad de un buque reguladas por IMO, se


definen en cuatro parmetros: dimetro de giro, dimetro tctico, avance y cada
o transferencia. En el ao 1979 se propusieron frmulas para estimar estos
parmetros, deducidas del anlisis de una muestra de buques de esloras entre 50
y 350 m.
Dimetro de giro (turning diameter)
Buques de una hlice:

DG

Lpp 4.19

203Cb

47.4TRIM
Lpp

13B
Lpp

194

35.8APala
Lpp H

7.79ABulbo
Lpp H

Esta frmula se refiere a codastes abiertos, sin considerar diferencias entre los
giros de estribor o babor, si el codaste es cerrado, el sexto trmino se reemplaza
el coeficiente de -35.8 por +3.82.
Buques de dos hlices

DG

Lpp 0.727

197Cb

41TRIM
Lpp

4.65B 188
Lpp

218APala
Lpp H N 1

25.66ABulbo
Lpp H

Dimetro tctico o de evolucin (tactical diameter)


IMO requiere que el dimetro tctico no exceda de 5 veces la eslora entre
perpendiculares
Buques de una hlice:

0.234V
0.675
Lpp
Buques de dos hlices
DG
DT Lpp
0.14
Lpp
Avance (advance)
IMO requiere que el avance no exceda de 4.5 veces la eslora entre
perpendiculares
DT

Lpp

0.91DG
Lpp

Buques de una hlice:


0.519DT
ADVC Lpp
1.33
Lpp
Buques de dos hlices
0.514DT
ADVC Lpp
1.10
Lpp
Cada o Transferencia (transfer)
Buques de una hlice:
0.497DT
TRANS Lpp
0.065
Lpp

- 109 -

1.77V
Lpp

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

Buques de dos hlices


0.531DT
TRANS Lpp
Lpp

0.357

En general IMO requiere que, tras haber metido el timn 10, el buque no
recorra ms de 2.5 veces su eslora cuando su rumbo haya cambiado 10.
Escriba un programa en FORTRAN, que permita obtener los parmetros de
maniobrabilidad del buque. El programa debe reunir obligatoriamente los
siguientes aspectos:
1. Usar el formato de codificacin de las Normas Europeas para Fortran 90
2. Debe usarse al menos un tipo de subprograma para realizar los clculos
3. Debe usar DLL para los subprogramas.
4. Los resultados y los parmetros de ingreso deben almacenarse en un archivo
5. La matriz de resultados debe imprimirse por pantalla como una tabla que
permita verificar la informacin de manera fcil, se considera la dimensin X
como los parmetros de maniobrabilidad y la dimensin Y los ngulos de caa.
12. En cierto tipo de material metlico de prueba, se sabe que la resistencia a la
traccin sobre un metal est relacionada funcionalmente con la resistencia al
corte. La tabla siguiente es un conjunto de datos experimentales codificados
sobre las dos variables.

Resistencia a la traccin
26.8
25.4
28.9
23.6
27.7
23.9
24.7
28.1
26.9
27.4
22.6
25.6

Resistencia al corte
26.5
27.3
24.2
27.1
23.6
25.9
26.3
22.5
21.7
21.4
25.8
24.9

1. Escribir un programa en FORTRAN 90, para estimar la lnea de regresin


simple de estos datos, usando el mtodo de los mnimos cuadrados.
2. El programa debe permitir obtener cualquier valor intermedio usando la
frmula de la regresin, este valor se ingresa por pantalla.
3. En un archivo de datos debe leerse la informacin y en un archivo de
resultados escribir los clculos intermedios y resultados finales. El programa
termina cuando el usuario decide no realizar ms clculos.
4. Deben usarse subprogramas en la creacin del programa.
5. Debe codificarse observando las normas Europeas para escribir y
documentar un cdigo fuente.
6. Debe enviarse por correo electrnico solo los archivos *.F90.
- 110 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

Relaciones tiles:
Ecuacin de la lnea de regresin simple:

YX

Coeficientes a y b usando mtodo de mnimos cuadrados


n

x i yi

xi

i 1

yi

i 1
n

i 1
2

x i2

xi

i 1
n

i 1
n

yi

xi

i 1

i 1

n
13. Escribir un programa en FORTRAN, que calcule el momento de inercia I zz y el
mximo momento flexionante de un perfil estructural L,T,I,H y C, el programa
debe tener las siguientes caractersticas:
a. Mensajes para continuar con otra figura hasta que el usuario desee salir
b. Mensajes de advertencia y error cuando se ingresa un dato errneo
c. Todas las subrutinas deben realizarse usando DLL
d. Debe mostrar una tabla en pantalla con los valores intermedios y el
resultado
e. Debe guardar en un archivo los valores intermedios y el resultado
f. Debe haber opciones para vigas de varios materiales.
Frmulas tiles

yA

I zz
mx

Io

(Distancia del eje neutro respecto la lnea base)

Ad 2

Io

bh 3
(Donde b es la base, h la altura)
12

Mc
I zz

Valores de esfuerzos mximos:


MATERIAL
Aluminio de aleacin
Hierro colado gris
Magnesio de aleacin
Acero al nquel y carbono

- 111 -

ESFUERZO A
TENSION (Kg/cm2)
4200
2100
2800
14000

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

14. El sistema EAN es un conjunto de normas que homogeneizan la numeracin de


todos los productos de gran consumo y tiene tres caractersticas principales:
1. Puede ser utilizado por fabricantes y distribuidores en el intercambio y en la
mejora de las informaciones.
2. Identifica la unidad del producto de forma biunvoca (un cdigo, un
producto).
3. No es explicativo o significativo: toda la informacin est contenida en el
registro de la base de datos al que se accede con el cdigo.
La representacin del cdigo EAN se efecta mediante la visualizacin de 13
dgitos que identifican el producto:
1. Los dos primeros dgitos/caracteres corresponden al pas. Para el caso que
nos ocupa decir que el cdigo numrico asociado a nuestro pas es el 84
2. Los cinco caracteres siguientes identifican la empresa fabricante del artculo.
3. Los cinco siguientes caracteres ser un nmero que identificar cada uno de
los productos que la empresa produzca. La empresa podr poner su propia
numeracin de productos.
4. Por ltimo, el dgito 13, es un dgito de control y se calcula mediante un
sencillo algoritmo matemtico. Este algoritmo elimina cualquier posibilidad
de error en la lectura.
Caractersticas del smbolo
La representacin del cdigo se ha de efectuar mediante la simbolizacin de los
dgitos de forma que puedan leerse y traducirse directamente del decodificador,
que a travs de la interface se comunica con el computador. El smbolo estndar
est formado por una serie de barras paralelas, de diferente grosor. En la parte
inferior del smbolo se representa el mismo cdigo en cifras para que sea legible.
El smbolo es de tamao variable. Su tamao estndar es de 37,29*26,26 mm.,
pero este tamao puede variar en funcin de las medidas del envase o de la
etiqueta. En estos casos la variacin est entre el 0,8 y 2 veces el tamao del
estndar.
El dgito de control
La utilizacin del dgito de control tiene por objetivo el establecer un mecanismo
que evite errores en el tratamiento automtico de los cdigos EAN. El dgito de
control es la ltima cifra del cdigo EAN de un producto. Su clculo se realiza
automticamente en funcin del valor de las posiciones que le preceden en el
cdigo, mediante un sencillo algoritmo.
Algoritmo para calcular el dgito de control
Los pasos a seguir a la hora de calcular el dgito de control (para este tipo de
simbolizacin EAN-13) son
1. Multiplicamos por 1 las posiciones impares y por 3 las posiciones pares del
cdigo empezando de derecha a izquierda.
2. Tomemos como ejemplo el siguiente cdigo: 841234567890 sabiendo que el
84 corresponde con el pas, los siguientes 5 dgitos con la empresa y los
ltimos 5 dgitos con el artculo/producto. Sumamos los valores resultantes.
8+12+1+6+3+12+5+18+7+24+9+0 = 105

- 112 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

3. Restamos de la decena superior el valor de la suma de los valores resultantes.


El resultado de esta operacin es el valor del cdigo de control (primera
posicin del cdigo de barras desde la derecha). 110 - 105 = 5 ==> valor del
cdigo de control.
4. Otra posibilidad es dividir la suma resultante (105) para 10 siendo el residuo
de sta divisin el valor del dgito de control: 105 / 10 = 10 Cociente y 5 de
residuo. El resultado final del cdigo es: 84 12345 67890 5 (EAN-13).
Representacin grfica del cdigo
Cada carcter numrico debe tener obligatoriamente dos barras y dos espacios.
Para conformar un carcter es necesaria la unin de 7 mdulos. Un mdulo es la
unidad mnima o bsica del cdigo. Visualmente, un carcter podra
representarse como lo indica la figura 1.

Figura No. 1.- Carcter del cdigo


Este carcter se compone de 7 mdulos, 2 barras y 2 espacios de diferente grosor
(casualmente el grosor de los espacios es el mismo).
Por norma estndar la anchura de un mdulo es de 0,33 mm. De tal forma que si
un carcter dispone de 7 mdulos la anchura total de un carcter ser: 0,33 mm
X 7 = 2,31 mm.
Los juegos de smbolos
Para poder identificar simblicamente los caracteres numricos usando los siete
mdulos se definen 3 juegos de caracteres llamados A, B y C. Cada uno de ellos
tiene 10 valores (del 0 al 9), que combinan dos barras y dos espacios para los
siete mdulos que componen cada carcter numrico. Los juegos de caracteres
se simbolizan de cmo lo indica la figura 2.
El juego A tiene un nmero impar de mdulos oscuros. Por esta razn se dice
que el juego de simbolizacin A tiene paridad impar. Los juegos B y C son
juegos de simbolizacin con paridad par (el nmero de mdulos oscuros es par).

Los caracteres auxiliares


Los caracteres auxiliares se componen de la siguiente forma:
Separador lateral

3 mdulos

Separador Central

5 mdulos

- 113 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

Como su nombre indica, el separador central est en el centro del smbolo,


separando los doce caracteres simbolizados, en dos grupos de seis. Los mdulos
del principio y del final son claros, con lo que de sta forma, los caracteres
situados a la izquierda y a la derecha de este separador central, cambian la
alineacin.
Los separadores laterales indican principio y fin de las barras del smbolo. El
separador lateral izquierdo se representar con los 3 mdulos laterales ms 11
mdulos claros a la izquierda
El separador lateral derecho se representar con los tres mdulos laterales ms 7
mdulos claros a la derecha.
Estos mdulos claros deben de existir de tal forma que la omisin de estos, no
garantizara la correcta lectura.
El formato del smbolo EAN-13
Volviendo a nuestro cdigo de ejemplo (84 12345 67890 5) veamos qu formato
y qu simbolizacin tendra cada uno de los caracteres dependiendo de la
posicin de estos. El formato, de izquierda a derecha y de mayor a menor
posicin, es el siguiente:
Segn nuestro cdigo el carcter dcimo tercero es el 8, como comentbamos
antes, el prefijo del pas es el 84. Este carcter no ser representado mediante
cdigos de barras quedando a la izquierda del cdigo de barras. Segn la tabla 1
utilizaremos la simbolizacin A o B para las posiciones del 7 al 12 segn
convenga y del 1 al 6 utilizaremos la tabla C.
La parte del cdigo que es representada mediante barras tiene el siguiente
formato:
1. El separador lateral izquierdo incluyendo los 11 mdulos claros a la
izquierda.
2. 6 caracteres numricos, simbolizados por medio de los juegos A y B, que
corresponde a los caracteres de la izquierda del smbolo.
3. El separador central
4. 6 caracteres numricos, simbolizados por medio del juego de caracteres C,
correspondientes a los caracteres de la derecha del smbolo.
5. El separador lateral derecho incluyendo los 7 mdulos claros por la derecha.

- 114 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

Figura No. 2.- Juego de caracteres


13
0
1
2
3
4
5
6
7
8
9

12
A
A
A
A
A
A
A
A
A
A

11
A
A
A
A
B
B
B
B
B
B

10
A
B
B
B
A
B
B
A
A
B

9
A
A
B
B
A
A
B
B
B
A

8
A
B
A
B
B
A
A
A
B
B

7
A
B
B
A
B
B
A
B
A
A

Tabla No. 1.- Juego de caracteres de simbolizacin EAN-13


1. Escribir un programa en FORTRAN 90, para codificar un nmero con el
sistema de simbolizacin EAN-13, usando la norma Europea de codificacin
y documentacin del lenguaje.
2. El programa permite el ingreso de informacin desde pantalla y almacena el
resultado en un archivo de resultados, haciendo constar el nmero ingresado
y el cdigo de barras.

- 115 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

15. Escriba un programa en Fortran que permita escoger una figura para graficar
entre la siguientes opciones: rectngulo, polgono de N lados, elipse o crculo, el
usuario debe seleccionar el tipo e ingresar la informacin referente a
dimensiones o nmero de lados, el grfico se lo hace en pantalla y en un archivo.
16. Haga un programa en Fortran para dibujar un boceto a mano alzada sobre la
ventana.

- 116 -

ESCUELA SUPERIOR POLITECNICA DEL LITORAL


FACULTAD DE INGENIERIA MARITIMA Y CIENCIAS DEL MAR
PROGRAMACION APLICADA 1

Referencias
[1] Etzel, M., Dickinson, K. Digital Visual Fortran Programmers Guide, 1999
[2] Digital Equipment Co. Digital Fortran, Language Reference Manual, 1997.
[3] Nyhoff, L., Leestma, S., Fortran 90 for Engineers and Scientists, 1997
[4] Jones, C., Fortran 90 Standards, 2001
[5] PlotWorks, Plot88 Users Manual, 2000.
[6] Moreno, J., CVFGraf Manual de Usuario, 2004
[7] Santos, D., Otero D., DXFortran Gua del Usuario, 2002
[8] Varios, Mtodos Numricos Introduccin, aplicaciones y programacin, 1998.
[9] Varios, Programacin en FORTRAN 95 y Problemas resueltos, 2005.

- 117 -

Вам также может понравиться