• No se han encontrado resultados

01 Programas Ambiente Fortran y Estructuras de Control

N/A
N/A
Protected

Academic year: 2021

Share "01 Programas Ambiente Fortran y Estructuras de Control"

Copied!
66
0
0

Texto completo

(1)

Programas

Programas

Ambiente FORTRAN90

Ambiente FORTRAN90

Estructuras de control

Estructuras de control

Mg.Sc. Eduardo E. Escalante R.

Mg.Sc. Eduardo E. Escalante R.

Universidad Centroccidental

“Lisandro Alvarado”

Decanato de Ciencias y tecnología

Departamento de Matemática

(2)

I.- Programas

1. Lenguajes de Programación

2. Lenguajes de Programación de Alto Nivel

3. Ejemplos de Programas

4. Como escribir un programa

4.1 Análisis del problema

4.2 Algoritmo

4.3 Editar el programa

4.4 Prueba del programa

4.5 Análisis de resultados

4.6 Análisis de errores (Compilación y Ejecución)

5. Software de FORTRAN

(3)

II.- Ambiente FORTRAN

1. Desarrollo y evolución de FORTRAN

1.1 Historia del Lenguaje

1.2 Objetivos

1.3 Evolución

1.4 Nuevas facilidades del FORTRAN 90

1.5 Nuevas facilidades del FORTRAN 95

1.6 Nuevas facilidades del FORTRAN 2000

2. Elementos de FORTRAN

2.1 Formato Fuente

2.2 Códigos de Formato libre

2.3 Conjunto de caracteres

2.4 Manejo de espacios en blanco

2.5 Manejo de comentarios

2.6 Nombres

(4)

3. Data Objects

3.1 Tipo Intrínseco

3.2 Constantes literales

3.3 Tipo Implícito

3.4 Declaraciones Numéricas y lógicas

3.5 Declaración de caracteres

3.6 Constantes (parámetros)

3.7 Inicialización

3.8 Ejemplos

4. Expresiones y Asignaciones

4.1 Expresiones

4.2 Asignación

4.3 Operaciones numéricas intrínsecas

4.4 Operadores relacionales

4.5 Operaciones lógicas intrínsecas

4.6 Errores de precisión

4.7 Precedencia (orden de ejecución)

4.8 Operaciones con caracteres

(5)

III.- Estructuras de Control

1. Instrucción IF

2. Instrucción IF ... THEN

3. Instrucción IF ... THEN ... ELSE

4. Instrucción IF ... THEN ... ELSEIF

5. Construcciones anidadas de la instrucción IF

6. Instrucción EXIT

7. Instrucción CYCLE

8. Instrucción DO ... WHILE

9. Instrucción DO ... END DO

10. Instrucción SELECT CASE

11. Mezcla de objetos de diferente tipo

12. Procedimientos intrínsecos

(6)

Introducción

1. El computador

2. Hardware / Software

(7)

3. Cómo funciona el computador 4. Almacenamiento numérico a) Enteros

b) Reales Double Precision

overflow / underflow ( KIND) c) Caracteres

−32767, 32767 0.31459 ×101

(8)

Lenguajes de Programación

1.- Código Binario ( 0 / 1) Complejo Propenso a errores 2.- Lenguajes Ensambladores LDA'3F2C' ADD'3F29' STO'3F2A' 3.- Lenguajes de Programación Inequívoco Expresivo Práctico Fácil de usar

(9)

I.- Lenguajes de Bajo Nivel

1.- La estructura del lenguaje refleja refleja la instrucción de CPU.

2.- Permiten utilizar de manera muy eficiente la máquina. Aunque son difíciles de utilizar. 3.- Códigos ensambladores.

II.- Lenguajes de Alto Nivel

1.- Portables.

2.- Permiten mayor grado de abstracción del hardware.

3.- Son más expresivos, seguros y rápidos de usar. Por ejemplo, FORTRAN90, FORTRAN77, ADA, C, JAVA.

4.- Deben ser compilados.

(10)

Ejemplos de Programas

Diseñar un programa que convierta grados farenheit ( °F ) a grados centígrados ( °C ), para ello puede utilizar la siguiente regla de conversión.

Y que también transforme de °C a grados Kelvin (°K).

PROGRAM conversion_de_temperatura IMPLICIT NONE

INTEGER :: grad_F, grad_C, K

write(*,*)'Ingrese la temperatura en grados F' read(*,*)grad_F

grad_C=5*(grad_F-32)/9

write(*,*)'Grados centigrados = ', grad_C,'°C' K=grad_C+273

write(*,*)'y', K, '°K'

END PROGRAM conversion_de_temperatura C = 5 ×  f − 32 / 9

(11)

Análisis del programa

Sección de Especificación

Es el área del programa apartado para las declaraciones de las posiciones de memoria ( o variables) que serán utilizadas en el área ejecutable. Esta sección, además de dar los nombres de las variables a utilizar, es necesaria para indicar el tipo de data de cada variable.

Sección de Ejecución

Es el área del código que ejecuta todas las instrucciones. En este caso el programa lleva a cabo las siguientes acciones:

1. Pide datos de entrada

2. Lee datos de entrada (grad_F) 3. Calcula la temperatura en °C 4. Imprime el valor en °C

5. Calcula la temperatura en °K 6. Imprime el valor en °K

(12)

PROGRAM conversion_de_temperatura IMPLICIT NONE

INTEGER :: grad_F, grad_C, K

write(*,*)'Ingrese la temperatura en grados F' read(*,*)grad_F

grad_C=5*(grad_F-32)/9

write(*,*)'Grados centigrados = ', grad_C,'°C' K=grad_C+273

write(*,*)'y', K, '°K'

END PROGRAM conversion_de_temperatura Sección de Especificación:

IMPLICIT NONE: Su presencia indica que todas las variables mencionadas en el programa deben declararse en la sección de especificación.

DECLARACIÓN DE VARIABLES NUMÉRICAS:

Enteras ---> INTEGER

Reales ---> REAL ---> 3.1459, 0.31417E05 Lógicas ---> LOGICAL ---> .TRUE. / .FALSE.

Caracteres ---> CHARACTER --->Caracteres alfanuméricos

(13)

Sección de ejecución:

write(*,*)'Ingrese la temperatura en grados F'

Escribe por pantalla la frase que se encuentra entre comillas.

read(*,*)grad_F

Lee el valor asignado desde el teclado para la variable entera grad_F

grad_C=5*(grad_F-32)/9

Declaración de asignación, el lado derecho es evaluado y le asigna a la variable entera grad_C el valor calculado. Esta declaración contiene los operadores:

* Multiplicación - Sustracción = Asignación + Adición / División

write(*,*)'Grados centigrados = ', grad_C,'°C'

K=grad_C+273 write(*,*)'y', K, '°K'

(14)

Ejemplo:

Escriba un programa que calcule las raíces de una ecuación cuadrática de la forma:

donde las raíces vienen dadas por la expresión I- Algoritmo

Leer los valores de los coeficientes a, b y c

Si a es cero el programa se detendrá debido a que no se tiene una ecuación cuadrática Calcula el valor del discriminante

Si D es cero hay una sola raíz

Si D > 0 hay dos raíces reales y

Si D < 0 hay dos raíces complejas y Imprimir la solución a x2bxc=0 x=−b±

[b 24 a c ] 2a D=b2−4 acb 2a −bD  2a −b−D  2a −bi−D 2a −b−i−D 2a

(15)

II- Programa

PROGRAM QES IMPLICIT NONE INTEGER:: a, b, c, D

REAL:: real_part, imag_part

WRITE(*,*)”Ingrese los valores a a, b y c” READ(*,*)a, b, c

IF(a /= 0) then

!calculo del discriminante D=b*b – 4*a*c

IF(D == 0) then !una sola raíz

WRITE(*,*)”La raíz es ”, -b/(2.0*a) ELSE IF (D > 0) then

!Raices reales

WRITE(*,*)”Las raíces son”, (-b+sqrt(real(D)))/(2.0*a) WRITE(*,*)”y”, (-b-sqrt(real(D)))/(2.0*a)

ELSE

real_part=-b/(2.0*a)

!D<0, calculamos la SQRT de -D imag_part=(SQRT(real(-D))/(2.0*a))

WRITE(*,*)”Primera raíz”, real_part,”+”,imag_part,”i” WRITE(*,*)”Segunda raíz”, real_part,”-”,imag_part,”i” ENDIF

ELSE !a==0

WRITE(*,*)”No es una ecuación cuadrática” ENDIF

(16)

Como escribir un programa

1.- Especificar el problema

2.- Analizar y dividir en una serie de subtareas para obtener la solución (algoritmo) 3.- Escribir el código en lenguaje FORTRAN90 (Edición del programa)

4.- Compilar y ejecutar (test de programa) 5.- Análisis de resultados

6.- Análisis de errores

a) Compilación Errores

(17)

II.- Ambiente FORTRAN

1. Desarrollo y Evolución de FORTRAN

1.1. - 1.2. - 1.3. Desarrollo, objetivos y evolución de FORTRAN

1950

FORTRAN =====> Mathematical FORmula TRANslation System (IBM)

1960

Popularización 1960

Versiones Diferentes =====> Crecimiento divergente (Dialectos)

1963 existían 40 compiladores diferentes

1972

FORTRAN66

Primer lenguaje oficialmente standard

1975

* Todos los computadores estaban dotados con FORTRAN66

* Programas podían ser mudados para trabajar en otros sistemas

* Lenguaje más utilizado en el mundo para aplicaciones no comerciales

(18)

1980

FORTRAN77

Compiladores más eficientes

a.- Estructuras de datos

Deficiencias de FORTRAN77

b.- Almacenamiento dinámico

FORTRAN 8X

1992

FORTRAN90

FORTRAN77 sigue siendo reconocido por FORTRAN90

portable + eficiente + seguro + mantenimiento

2000

VAST / LOFT90

Crecimiento de FORTRAN90 ==> Ambigüedades / conflictos / Areas grises

FORTRAN95

(19)

1.4. Características de FORTRAN 77

1-. Formato fuente fijo, 'Formato Fijo'

* Las primeras 5 columnas se reservan para numerar líneas de programación

* La sexta columna se utiliza unicamente para indicar continuación de linea anterior

* Los comentarios solo pueden hacerse marcando la primera columna con un caractér especial * Se recomienda trabajar utilizando letras mayúsculas

* El nombre de las variables debe ser de un máximo de 6 caracteres * No se permiten comentarios entre líneas

2-. No trabaja en paralelo

3-. Carece de almacenamiento dinámico 4-. Carece de portabilidad numérica

5-. Carece de estructuras definidas por el usuario 6-. Carece de recurrencia explícita

(20)

1.5. Características de FORTRAN 90

1-. Formato fuente libre, 'Formato Libre'

* No necesita posicionamiento específico * Máximo 132 columnas por línea

* Más de una declaración por línea * Permite comentarios entre líneas * Acepta mayúsculas y minúsculas

* Es virtualmente imposible ubicar mal un caractér * Nombres de variables más largos (31 caractéres)

* Permite la utilización de puntos ( . ) y underscores ( _ ) 2-. Facilidades de paralelismo

3-. Introduce almacenamiento dinámico 4-. Permite portabilidad numérica ( KIND ) 5-. Permite estructuras definidas por el usuario 6-. Permite recurrencia explícita

(21)

2. Elementos de FORTRAN

Formato Fuente

Códigos de Formato Libre Conjunto de Caracteres Elementos de FORTRAN 90 Manejo de espacios en blanco Manejo de comentarios

Nombres

Estructura del programa 2.1. Formato Fuente

Son las reglas básicas de cualquier lenguaje de programación. Estas reglas determinan exactamente como deben escribirse las instrucciones para la máquina.

2.2. Código de Formato Libre

Fortran 90 tiene dos formatos fuentes básicamente incompatibles, uno es la forma compatible con la utilizada en FORTRAN 77, formato fijo, y una forma nueva más conveniente para el ambiente de cómputación moderno, formato libre.

FORTRAN 77 ===> formato fijo

FORTRA 90 ===> formato libre

(22)

Fortran 90 soporta el nuevo formato libre:

* 132 caracteres por linea

* Serie de caracteres extendido ( . , _ ) * & Indicador de continuación de línea * ! Indicador de comentario

* ; Separador de instrucciones en la misma línea * Espacios en blanco

Ejemplo:

PRINT *, “PROGRAMA& PRINT *, “PROGRAMA&

&CION” & CION”

2.3. Conjunto de Caracteres A - Z a – z 0 – 9 _ , .

espacios en blanco , + , - , = , * , / , ( , ) ,

,

,

.

,

' '

,

“ “

,

:

,

;

,

!

,

&

,

%

,

<

,

>

,

$

,

?

(23)

2.4. Manejo de espacios en blanco

* Los espacios en blanco consecutivos tienen el mismo significado que uno solo.

* Los espacios en blanco no son permitidos en palabras claves ( keywords ) del lenguaje de programación. * Los espacios en blanco no están permitidos en nombres definidos por el programador.

* Si el nombre está compuesto de dos palabras se estila utilizar un underscore ( _ ) como separador. * Las palabras claves y los nombres deben escribirse separados.

Ejemplo:

INTEGER / = INT EGER horas / = ho ras

SUBROUTINEClear / = SUBROUTINE Clear INTEGER : : a / = INT EGER : : a

INTEGER FUNCTION fit( i ) ! válida INTEGERFUNCTION fit( i ) ! inválida INTEGER FUNCTIONfit( i ) ! inválida

(24)

2.5. Comentarios

En cualquier línea el caracter

!

indica que todos los caracteres siguientes a este hasta el final de la línea es un comentario. Los comentarios son ignorados por el compilador, forman parte del programa fuente pero están dirigidos al programador y no a la máquina.

Ejemplo:

PROGRAM Area

!

!Evalúo el área del triángulo !

A = b * h / 2

WRITE( * , * ) ' Esto no es un comentario ! ! ! '

! La siguiente línea es una directiva HPF !HPF$ PROCESSORS P( 3, 3, 3 )

! Cambia a formato fijo !DIR$ FIXED_FORM

(25)

2.6. Nombres

El lenguaje FORTRAN define una serie de nombres, o palabras clave, tales como PRINT, INTEGER, MAX,

WRITE, SUBROUTINE, FUNCTION, DIMENSION, entre otras cuya sintaxis está definida por el lenguaje.

Por otro lado, hay hay una serie de entidades que deben ser nombradas por el programador, tales como

variables, procedimientos, constantes. Estos nombres deben ser escogidos de tal manera que obedezcan las

siguientes reglas:

a.- Debe tener un máximo de 31 caracteres alfanuméricos. b.- El primer caracter en cualquier nombre debe ser una letra.

c.- En los nombres, las mayúsculas como las minúsculas son equivalentes. Ejemplo:

Válidas: A , aAa , entrada , num1 , N1205 , contador_ciclos

CHARACTER ( LEN = 12 ) : : nombreusuario CHARACTER ( LEN = 12 ) : : nombre_usuario

Inválidas: INTEGER : : 1A

INTEGER : : depth:0 REAL : : A-3

(26)

2.7. Orden y estructura del programa

Básicamente en cualquier programa o procedimiento deben usarse las siguientes reglas:

a.- La declaración de encabezamiento debe ir al principio, ( PROGRAM, FUNCTION o SUBROUTINE ) b.- Todas las instrucciones de especificación deben estar antes que las instrucciones de ejecución.

c.- Las instrucciones ejecutables deben seguir el orden requerido por la lógica del programa. d.- El programa debe terminar con la declaración END.

(27)

3. Objetos de data

3.1. Tipos Intrínsecos

Clases Tipos

Caracter ---> CHARACTER Tipos Booleana ---> LOGICAL INTEGER

Numérica REAL, DOUBLE PRECISION COMPLEX

CHARACTER : Cadena de uno o más caracteres.

LOGICAL : Objetos que tienen dos valores, definidos por Verdadero / Falso ( .TRUE. / .FALSE. ). INTEGER : Números Enteros.

REAL ( DOUBLE PRECISION ) : valores aproximados o de punto flotante.

(28)

Ejemplos

CHARACTER : : sexo ! letras

CHARACTER (LEN = 12) : : nombre ! Cadena de letras LOGICAL : : estado_civil ! casad@

REAL : : altura

DOUBLE PRECISION : : pi ! 3.14159 INTEGER : : edad ! nros. Enteros COMPLEX : : val ! x + yi

Observaciones:

1.- En la mayoría de los lenguajes de programación están presentes las tres clases.

2.- Las clases no pueden mezclarse entre sí, a no ser que se desarrolle algún tipo de relación.

3.- Los objetos REAL y DOUBLE PRECISION son aproximaciones. En FORTRAN90, DOUBLE PRECISION no debe ser utilizado. En FORTRAN77, un objeto D. P. tiene mayor precisión que uno de tipo real.

4.- Todos los tipos numéricos tienen rango finito.

(29)

3.2. Constantes Literales

Son entidades con un valor fijo. Ejemplos: +12345 ! INTEGER 2. ! REAL -6.6E-06 ! REAL -6.6D-06 ! DOUBLE PRECISION . FALSE . ! LOGICAL 'MA''DIB' ! CHARACTER “MA”DIB” ! CHARACTER Observaciones:

1.- Solo existen dos valores lógicos ( LOGICAL ).

2.- Los valores enteros son representados por una secuencia de dígitos con un signo (+) ó (-), (+) es opcional. 3.- Los valores reales contienen un punto decimal o un símbolo de exponente.

4.- Los valores de tipo caracter siempre están delimitados por comillas, que deben ser del mismo tipo. 5.- Los valores numéricos tienen un rango finito.

(30)

3.3. Tipo Implícito

Si una variable es utilizada, pero no es declarada, el compilador la considerará declarada de forma implícita. El tipo que se asume dependerá de la primera letra del nombre del objeto.

A, B , C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z

Nota: Al Utilizar IMPLICIT NONE el usuario será informado de cualquier variable no declarada.

3.4. Declaraciones numéricas y lógicas

Las variables utilizadas en un programa deben declararse en la sección de declaración.

SINTAXIS:

< TIPO > [, < lista de atributos > ] : : < lista de variables > [ = < valor > ]

(31)

Ejemplos:

REAL : : x

INTEGER : : i , j

LOGICAL, POINTER : : ptr

REAL, DIMENSION (10, 10) : : y , z( 10 )

DOUBLE PRECISION, DIMENSION (0:9,0:9) : : w

Atributos: PARAMETER, SAVE, INTENT, POINTER, TARGET, DIMENSION 3.5. Declaración de Caracteres

SINTAXIS:

< TIPO > [LEN = < longitud > ][, < lista de atributos >] : : < lista de variables > [ = < valor > ] [LEN = < longitud >] puede ser modificada al usarse el asterisco.

Ejemplos:

CHARACTER( LEN = 10 ) : : nombre CHARACTER : : sexo

CHARACTER ( LEN = 32 ) : : str

CHARACTER ( LEN = 10 ) : : nombre, sexo*1, str*32

CHARACTER ( LEN = 10 ), DIMENSION : : tom(10)*2, dick, harry(10,10,10)*20 CHARACTER, POINTER : : P2ch

(32)

3.6. Declaración de Constantes ( PARAMETER )

Las constantes simbólicas, conocidas en Fortran como PARAMETER, pueden configurarse tanto en una declaración con atributo o en una declaración de PARAMETER.

Ejemplo:

ESTILO FORTRAN77 ESTILO FORTRAN90

INTEGER numero INTEGER , PARAMETER : : numero = 256

PARAMETER ( numero = 256 ) REAL pi

PARAMETER ( pi = 3.14159 ) REAL, PARAMETER : : pi = 3.14159

CHARACTER hijo , padre CHARACTER ( LEN = * ), PARAMETER : : hijo = ' bart ', padre = “homero” PARAMETER ( hijo = ' bart ' )

PARAMETER ( padre = “ homero ” )

Observaciones:

1.- Las constantes deben utilizarse cuando se tiene la seguridad que la variable solo toma un valor. Con esta declaración la variable no podrá ser modificada en el transcurso del programa, si alguna declaración intente cambiar este valor el compilador lo interpretará como un error.

2.- Son utilizadas para hacer que la lectura del programa se haga más sencilla.

3.- Mantenimiento: cuando un valor constante debe ser cambiado, este se ajusta al cambiar la línea de la sección de declaración.

(33)

3.7. Inicialización

Cuando un programa se carga a la memoria de un computador, el contenido de las variables es indefinido. Por lo tanto siempre es útil asignarle valores iniciales a las variables.

Asignar valores iniciales ===> INICIALIZACION

Ejemplos:

INTEGER : : i = 5 , j = 100 REAL : : max = 10. D 5

CHARACTER ( LEN = 5 ) : : light = ' ambar ' CHARACTER ( LEN = 9 ) : : boot = “ wellie ” LOGICAL : : on = .TRUE. , off = .FALSE.

Observaciones:

1.- En las declaraciones tipo caracter:

a) El objeto se completa con espacios en blanco.

b) La expresión de inicialización se trunca al lado derecho. 2.- Hay diferentes maneras de inicializar a las variables:

a) Instrucción PARAMETER. REAL, PARAMETER : : pi = 3.141592 b) Instrucción DATA.

(34)

3.8. Ejemplos de declaraciones

CHARACTER ( LEN = 20 ) : : lugar ! Nombre del hospital

CHARACTER : : turno ! A, B, C, D

INTEGER : : num_niños_nacidos = 0 ! Suma total de nacimientos

REAL : : tiempo_ transcurrido = 0.0 ! Tiempo desde el primer nacimiento ( hora )

REAL : : tmax_entre_nacim = 0.0 ! Máximo tiempo de espera entre nacimientos

REAL : : tprom_entre_nacim ! Tiempo de espera promedio entre nacimientos

REAL : : t_desde_el_ultimo_nacim ! Tiempo medido desde el último nacimiento

(35)

Ejemplos:

De la siguientes, cuales son declaraciones incorrectas?

1.- ReAl : : x 13.- CHARACTER ( len ), PARAMETER : : “barquisimeto” 2.- CHARACTER : : name 14.- REAL, PARAMETER : : py = 22.0 / 7.0

3.- CHARACTER ( len = 10 ) : : name 15.- REAL : : dos_pi = py * 2 4.- REAL : : var-1 16.- REAL : : a = 1 . , b = 2

5.- INTEGER : : 1ª 17.- LOGICAL ( len = 12 ) : : frisnet

6.- BOOLEAN : : loji 18.- CHARACTER ( len = 6 ) : : palabra = ‘y’know” 7.- DOUBLE : : X 19.- CHARACTER ( len = 6 ) : : palabra = “y’know” 8.- CHARACTER ( len = 5 ) : : ciudad = “barquisimeto” 20.- INTEGER : : ia ib ic id

9.- CHARACTER ( len = * ) : : ciudad = “barquisimeto” 21.- DOUBLE PRECISION : : pattie = +1.0D0 10.- CHARACTER ( len = * ), PARAMETER : : estado = ‘Lara’ 22.- DOUBLE PRECISION : : pattie = -1.0E-0 11.- INTEGER : : pi = +22 / 7 23.- LOGICAL, DIMENSION ( 2 ) bool

(36)

4. Expresiones y Asignaciones

4.1. Expresiones

Son la combinación de operadores y operandos, en las que cada tipo de las tres clases de objetos tienen sus propios operandos. Una expresión está compuesta por un operador y, al menos, un operando.

Operadores  + , - , * , / , // , * * , definidos por el usuario Ejemplo:

Numérico alfa + 1

Caracter “ carrera ” // ciencias Lógico a = 100 ; b = 5 ; a .GT. B

(37)

4.2. Asignación

Es el operador que permite darle sentido práctico a la combinación de expresiones. Ejemplo:

A = B

C = sin ( .7 ) * 12.7

nombre = iniciales // apellido bool = ( a .EQ. b .OR. c .NE. d )

(38)

4.3. Operaciones Numéricas Intrínsecas Literales Constantes Aplican Escalares Arreglos

Operadores 

+ , - , * , / , **

Un operando => monádico Tipos

Dos operandos ==> diádico Ejemplo:

a = b – c

f = -3 * 6 / 5 + z ** x

(39)

Ejemplo:

Escribir un programa que lea el radio y calcule el área de la circunferencia correspondiente así como el volumen de la esfera.

PROGRAM area

REAL : : r , area , volumen REAL : : pi = 3.14159

Write*,’ Ingrese el valor del radio ’ Read*, r

area = pi * ( r ** 2. )

volumen = ( 4. * pi * ( r ** 3 ) ) / 3.

Write*, ‘ Area de la circunferencia ‘ , area Write*, ‘ Volumen de la esfera ’ , volumen END PROGRAM area

3 4 3 2 r volumen r area ⋅ = ⋅ = π π

(40)

4.4. Operadores de relación FORTRAN77 FORTRAN90 > .GT. > < .LT. < .GE. >= .LE. <= .NE. /= .EQ. == 1.- Compara valores entre dos operandos.

2.- Entrega un resultado lógico ( .TRUE. / .FALSE. ). 3.- Aplica a operandos numéricos (COMPLEX ?). 4.- Aplica a objetos tipo CHARACTER ---> ASCII. 5.- No aplica a objetos de tipo lógico.

Ejemplo: PROGRAM RELACION IMPLICIT NONE LOGICAL : : bool INTEGER : : i , j REAL : : c , d

write(*,*)' Ingrese los valores i, j ' read(*,*) i , j

bool = i .GT. J

write(*,*)' respuesta logica ', bool END PROGRAM RELACION

.≥. .≤. .≠. .=.

(41)

4.5. Operadores lógicos intrínsecos

Expresiones que dan como resultados .TRUE. / .FALSE.

.NOT. .NOT. (a .LT. b)

.AND. (a .GT. 5) .AND. (b .LT. 3)

.OR. (a .GT. 6) .OR. (b .LT. 10)

.EQV. Ambos operandos iguales

.NEQV. Ambos operandos diferentes

Ejemplo:

REAL : : a, b, x, y LOGICAL : : L1, L2

L1 = (.NOT. (x .EQ. y .AND. a .EQ. B ))

L2 = (L1 .EQV. ( ( x .GT. a .OR. y .LT. b ) .NEQV. a .EQ. b ) )

X1 X2 .NOT. X2 X1 .AND. X2 X1 .OR. X2 X1 .EQV. X2X1 .NEQV. X2

TRUE TRUE FALSE TRUE TRUE TRUE FALSE

TRUE FALSE TRUE FALSE TRUE FALSE TRUE

FALSE TRUE FALSE FALSE TRUE FALSE TRUE

(42)

4.5. Operadores con caracteres

a.- Subcadenas de caracteres (SUBSTRINGS)

CHARACTER (LEN = *), PARAMETER : : palabra = 'abcdefgh' write(*,*) palabra abcdefgh

write(*,*) palabra (1:1) a

write(*,*) palabra (2:4) bcd

write(*,*) palabra (1) ! Inválida

write(*,*) palabra (1:) abcdefgh

(43)

b.- Concatenación ( // ) Ejemplo:

PROGRAM concatenar

CHARACTER (LEN = *) palabra1, palabra2, palabra3, frase write*, ' Ingrese palabra1, palabra2, palabra3 '

read*, palabra1, palabra2,palabra3 frase = palabra1//palabra2//palabra3 write*, ' frase = ', frase

(44)

4.6. Precedencia

1.- Busca el operador de mayor precedencia.

2.- Si aparece más de una vez, se evalúan las expresiones por separado y de izquierda a derecha. 3.- El orden de evaluación puede alterarse utilizando paréntesis.

4.- Se continúa con las siguientes subexpresiones.

5.- Se mueve al operador más próximo y se repite el procedimiento. Ejemplo:

a.-

b.- .NOT. A .OR. B .EQV. C .AND. D .OR. .NOT. E

c.- .NOT. A .AND. B .EQV. C .OR. D .AND. E .OR. X .GT. Y .AND. Y .EQ. Z

d.- -A * B – C / D ** E / F + G **H + 1 – J / K

Operador Precedencia Ejemplo

Mo nádico us. Mayo r .inverse. A

* * - 10 **4 * o / - 89 *55 Mo nad. + o - - -4 Diadi. + o - - 5+4 / / - str1//str2 >, <, >=, <=... - A>B

.NOT. - .NOT. boo l

.AND. - A .AND. B

.OR. - A .OR. B

.EQV. o .NEQV. - A .EQV. B

Diádico us. Meno r X .DOT. Y

AB /C≠ A B /C

(45)

4.8. Errores de Precisión

Cada vez que dos números reales se combinan se genera una pequeña pérdida de exactitud en el resultado.

La pérdida “Catastrófica” de exactitud, se origina frecuentemente debido a que dos valores casi iguales se restan.

Ejemplo:

máquina

0.123456 – 0.123446=1×10−5

(46)

II.- Estructuras de Control

Programas Construcciones

Estructurados Ejecución Condicional IF

FORTRAN66

GOTO

Declaraciones y construcciones de ejecución condicional { IF, IF... THEN... ELSE IF... ELSE... END IF }

Estas instrucciones son necesarias si una sección del código necesita ser ejecutado y este depende de que se cumplan una serie de condiciones lógicas.

Lazos { DO... END DO }

Estructura que permite al cuerpo del lazo ser ejecutado repetidas veces.

Construcción para selección de múltiples caminos { SELECT CASE... END SELECT CASE }

Estructura que se encarga de elejir un camino particular, dependiendo del valor de la expresión evaluada. Declaraciones de salto incondicional { GOTO }

(47)

1. Instrucción IF

Es la forma básica de ejecución condicional en la que hay una sola opción a ser ejecutada.

SINTAXIS:

IF ( < Expresión lógica > ) < Instrucción a ejecutar >

Evalúa la < Expresión lógica >, si el resultado es verdadero ( .TRUE. ) se ejecuta la < Instrucción a ejecutar > en caso contrario pasa a la próxima línea.

Ejemplos:

IF ( x. LT . y ) write (*,*)' x < y ' IF ( x .GT. y ) maximo = x

IF ( i .NE. 0 .and. j .NE. 0 ) k = 1. / ( i * j ) IF ( i ./=. 0 .and. j ./=. 0 ) k = 1. / ( i * j )

(48)

IF ( I > 17 ) PRINT (*,*) “I > 17” PRINT (*,*) “Próxima línea”

IF ( I > 17 ) I > 17

PRINT (*,*) “ I > 17 ” I <= 17

(49)

Construcción IF

La construcción IF es más flexible que la instrucción IF porque el bloque puede tener diferentes alternativas que se excluyan mútuamente.

La forma más simple de la construcción IF es equivalente a la instrucción IF.

2. IF... THEN Ejemplo: IF ( x .GT. y ) THEN maximo = x x = y y = y + 7 END IF

(50)

IF ( I > 17 ) THEN

PRINT (*,*) “I > 17” END IF

PRINT (*,*) “Próxima línea”

IF ( I > 17 ) I > 17 PRINT (*,*) “ I > 17 ” I <= 17 END IF Próxima línea

(51)

3. IF... THEN... ELSE IF ( x .GT. y ) THEN PRINT *, “ I > 17 ” ELSE PRINT *, “ I <= 17 ” END IF IF ( I > 17 ) THEN I > 17 ELSE PRINT *, “ I > 17 ” PRINT *, “ I <= 17 ” END IF

(52)

4. IF... THEN... ELSE IF IF ( x .GT. y ) THEN PRINT *, “ I > 17 ” ELSE IF ( I == 17 ) THEN PRINT *, “ I == 17 ” ELSE PRINT *, “I < 17 ” END IF IF ( I > 17 ) THEN I > 17 I <= 17

PRINT *, “ I > 17 ” ELSE IF ( I == 17 )THEN

I == 17 ELSE

PRINT *, “I == 17” PRINT *, “ I < 17 ”

(53)

SINTAXIS:

[ < nombre > : ] IF ( < Expresión lógica > ) THEN

< BLOQUE THEN >

[ELSE IF ( < Expresión lógica > ) THEN [ < nombre > ]

< BLOQUE ELSE IF > . . . ]

[ ELSE[ < nombre > ]

< BLOQUE ELSE > ]

END IF [ < nombre > ]

(54)

Ejemplo: IF ( x > 3 ) THEN CALL sub1 ELSE IF ( x == 3 ) THEN CALL sub2 ELSE IF ( x == 2 ) THEN CALL sub3 ELSE CALL sub4 END IF

Las instrucciones, END SUBROUTINE, END FUNCTION o END PROGRAM no son permitidas en los bloques pertenecientes a la estructura IF.

(55)

5. Construcciones IF nombradas y anidadas

Cuando aparece una construcción IF en cualquier bloque de otra estructura IF este bloque se considera

ANIDADO. Ejemplo: salida: IF ( a < 0 ) THEN PRINT *, “ a < 0 ” IF ( c /= 0 ) THEN PRINT *, “ a< 0 y c /= 0 ” ELSE PRINT *, “ a < 0 pero c == 0 ” END IF

ELSE IF ( a > 0 ) THEN salida PRINT *, “ a > 0 ”

ELSE salida

PRINT *, “ a debe ser = 0 ” END IF salida

(56)

Observaciones:

a.- Si la declaración IF tiene nombre, este debe estar presente en la declaración END IF. No es obligatorio en el

ELSE IF o en el ELSE.

b.- Los nombres no deben repetirse en el ningún lugar del cuerpo del programa.

Ejemplo:

Escriba un programa que acepte tres longitudes (enteras) y reporte como resultado si estas longitudes definen un triángulo equilátero, isóceles o escaleno (3, 2 o ningún lado igual) o si no forman ningún triángulo.

Demuestre que el programa funciona para:

1. ( 1, 1, 1 ) 4. ( 3, 4, 5 ) 2. ( 2, 2, 1 ) 5. ( 3, 2, 1 ) 3. ( 1, 1, 0 ) 6. ( 1, 2, 4 ) Sugerencia: Si las tres longitudes forman un triángulo entonces

(57)

PROGRAM TRIANGULO IMPLICIT NONE

LOGICAL l1, l2

INTEGER lado1, lado2, lado3

PRINT (*,*) “Ingrese los tres valores” READ(*,*) lado1, lado2, lado3

IF( 2 * MAX(lado1,lado2,lado3) >= lado1 + lado2 + lado3 ) THEN PRINT(*,*) “No es un triángulo”

ELSE

l1 = lado1 .EQ. lado2 l2 = lado2 .EQ. lado3 IF ( l1 .AND. l2 ) THEN

WRITE(*,*) “Es un triángulo equilátero” ELSE

IF ( l1 .OR. l2 .OR. Lado1 .EQ. Lado3 ) THEN write(*,*) “Triángulo Isóceles”

ELSE

write(*,*) “Triángulo Escaleno” END IF

END IF END IF

(58)

6. Lazos con salida condicional ( EXIT )

Un lazo DO comprende un bloque de declaraciones que se ejecutan cíclicamente. Al

alcanzarse el final del lazo, el bloque se repite nuevamente desde el principio.

Observaciones

a.- El bloque de declaraciones que componen el lazo está delimitado por las declaraciones

DO – END DO

b.- En cada iteración del lazo, se evalúa la condición y la primera vez que ésta se cumple se lleva a

cabo la instrucción EXIT y el procesamiento continúa a partir de la declaración siguiente a la frase

clave END DO.

c.- El bloque del lazo puede contener otros bloques como DO, IF, CASE. Pero estas construcciones

deben estar contenidas completamente dentro del lazo.

(59)

Ejemplo:

i = 0 DO i = i + 1 if ( i .GT. 10 ) EXIT write(*,*) “ i = ”, i END DO

(60)

Lazos con ciclos condicionales CYCLE

La instrucción CYCLE transfiere el control a una instrucción DO interna (la única que

contiene la instrucción CYCLE) y el lazo comienza una nueva iteración.

Ejemplo:

i = 0

DO

i = i + 1

IF( i >= 5 .AND. i <= 8 ) CYCLE

IF( i > 10 ) EXIT

write(*,*) “i =”, i

END DO

write(*,*) “Lazo terminado. Ahora i =”, i

Observaciones:

a.- El lazo debe contener una instrucción EXIT para que pueda finalizar.

(61)

Lazos Anidados y Nombrados

0 salida: DO

1 entrada: DO

2 . . .

3 IF(a.GT.b) EXIT salida

!linea 9

4 IF(a.GT.b) CYCLE salida

!linea 0

5 IF(c.GT.d) EXIT entrada

!linea 8

6 IF(c.EQ.a) CYCLE

!linea 1

7 END DO entrada

8 END DO salida

(62)

Lazos DO . . . WHILE

El lazo DO ... WHILE se utiliza cuando una condición debe ser evaluada al principio del lazo

DO.

DO WHILE ( a.EQ.b )

BLOQUE WHILE

END DO

Observaciones:

a.- Los valores de a o b deben ser modificados dentro del lazo.

b.- Es equivalente a:

DO; IF(a.NE.b)EXIT

BLOQUE DO

END DO

(63)

Ejemplo:

a = 5; b = 5 DO WHILE (a.EQ.b) i = i + 1 IF(i.EQ.3)THEN a = a + 1 b = b + 2 END IF END DO

(64)

Lazos DO con índices

Estos lazos son utilizados cuando se requiere que alguna instrucción se realice una cantidad fija de veces.

DO i = 1, 100, 1 DO i = 1, 100

BLOQUE DO BLOQUE DO END DO END DO

Sintaxis:

DO < variable DO > = < EXPR1 >, < EXPR2 > [ , < EXPR3 > ] Declaraciones de ejecución

END DO

Observaciones:

a.- El lazo se ejecuta a partir de la < EXPR1 > a la < EXPR2 > en pasos de < EXPR3 >. b.- El número de iteraciones se calcula con la siguiente expresión:

MAX(INT((<EXPR2> - <EXPR1> + <EXPR3>) / <EXPR3>) , 0)

c.- Si la <EXPR3> está ausente el valor de ella se asume como 1.

(65)

Conteo para lazos

1.- sloopy: DO i = 1, 30, 2 . . . END DO sloopy 2.- DO j = 30, 1, -2 . . . END DO 3.- DO m = 30, 1, 2 . . . END DO 4.- DO n = 1, 30 . . . END DO 5.- DO p = 30, 1 . . . END DO

(66)

Seguimiento de variables DO

1.- DO i = 4, 45, 17

write(*,*) “i en el lazo”, i END DO

write(*,*) “i después del lazo =”, i

2.- Examine y determine el valor de la variable x.

a.- b.-

x = 0 x = 0

DO index1 = 1, 10 DO index = 1, 10

DO index2 = index1, 10 IF(x == 10)CYCLE IF(index2 > 6)EXIT x = x + index

x = x + 1 END DO END DO

Referencias

Documento similar

Sanz (Universidad Carlos III-IUNE): &#34;El papel de las fuentes de datos en los ranking nacionales de universidades&#34;.. Reuniones científicas 75 Los días 12 y 13 de noviembre

(Banco de España) Mancebo, Pascual (U. de Alicante) Marco, Mariluz (U. de València) Marhuenda, Francisco (U. de Alicante) Marhuenda, Joaquín (U. de Alicante) Marquerie,

Un dato es la representación de una variable que puede ser cuantitativa o cualitativa que indica un valor que se le asigna a las cosas y se representa a través de una secuencia

La campaña ha consistido en la revisión del etiquetado e instrucciones de uso de todos los ter- mómetros digitales comunicados, así como de la documentación técnica adicional de

You may wish to take a note of your Organisation ID, which, in addition to the organisation name, can be used to search for an organisation you will need to affiliate with when you

Where possible, the EU IG and more specifically the data fields and associated business rules present in Chapter 2 –Data elements for the electronic submission of information

Products Management Services (PMS) - Implementation of International Organization for Standardization (ISO) standards for the identification of medicinal products (IDMP) in

This section provides guidance with examples on encoding medicinal product packaging information, together with the relationship between Pack Size, Package Item (container)