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
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
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
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
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
Introducción
1. El computador
2. Hardware / Software
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
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 usarI.- 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.
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
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
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
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'
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 x2bxc=0 x=−b±
[b 2−4 a c ] 2a D=b2−4 ac −b 2a −bD 2a −b−D 2a −bi−D 2a −b−i−D 2aII- 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
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
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
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
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
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
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
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 , + , - , = , * , / , ( , ) ,
,
,
.
,
' '
,
“ “
,
:
,
;
,
!
,
&
,
%
,
<
,
>
,
$
,
?
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
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
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
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.
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.
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.
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.
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 > ]
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
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.
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.
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
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
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
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 )
4.3. Operaciones Numéricas Intrínsecas Literales Constantes Aplican Escalares Arreglos
Operadores
+ , - , * , / , **
Un operando => monádico TiposDos operandos ==> diádico Ejemplo:
a = b – c
f = -3 * 6 / 5 + z ** x
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 ⋅ = ⋅ = π π
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
.≥. .≤. .≠. .=.
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
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
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
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
AB /C≠ A B /C
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
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 }
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 )
IF ( I > 17 ) PRINT (*,*) “I > 17” PRINT (*,*) “Próxima línea”
IF ( I > 17 ) I > 17
PRINT (*,*) “ I > 17 ” I <= 17
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
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
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
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 ”
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 > ]
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.
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
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
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
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.
Ejemplo:
i = 0 DO i = i + 1 if ( i .GT. 10 ) EXIT write(*,*) “ i = ”, i END DOLazos 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.
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
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
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 DOLazos 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.
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 DOSeguimiento 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