Upload
vankhanh
View
220
Download
0
Embed Size (px)
Citation preview
Fundamentos de Informática Fundamentos de Informática
Tema 4
Introducción a Fortran 90
1
Contenidos
Introducción a F-90. Identificadores y palabras reservadas Datos y Tipos de Dato
Datos e identificadores Tipos de dato intrínsecos Variables Constantes Literales Tipos de dato definidos por el usuario
Expresiones y operadores Operadores aritméticos Operadores relacionales Operadores lógicos Operadores de cadenas Precedencia de operadores
Comentarios Sentencia de asignación Entrada y salida de datos (E/S) Funciones y subrutinas intrínsecas Estructura general de un programa
2
Introducción a F-90. FORmula TRANslator. 1957. Fortran II, IV, V, 77, 90(95). 2000
Lenguaje sencillo pero potente para manejar matrices (como MatLab)
Defectos achacados
Escasa facilidad para manejo de texto ( ↑ en F-90).
Sentencias de Control rígidas. (↑ en F-77 y en F-90)
Falta Estructura flexible de datos ( F-90 registros)
Falta de Procedimientos recursivos (algo en F90).
No memoria dinámica (F-90 matrices Allocatables).
ELEMENTOS BÁSICOS EN F-90:
Alfabeto (character). { (A - Z), (a – z), ( 0 - 9), $ & _ + - * / ** = ( ) [ ] . , ; : ' “ % ! ? }
3
Elementos básicos en F-90 Identificadores y palabras reservadas Palabra reservada
Aquella que tiene un significado concreto en el lenguaje, que el usuario no puede cambiar (Diccionario de palabras reservadas). ¡ Ojo con la ortografía!
Identificador Palabra nueva que utilizamos para denominar algo en el lenguaje. Construcción :
El primer símbolo del identificador será un carácter alfabético inglés (a, …, z). Después, se pueden poner caracteres alfanuméricos (a, …, z) y (0, 1, …, 9), el
guión de subrayado ‘_’ o la interrogación de cierre ‘?’. La longitud máxima entre 6 y 32 caracteres (compiladores distinguen solo 8) Uso indistinto de mayúsculas y minúsculas (Alto, ALTO, AlTo son la misma) . No pueden (realmente no deben) coincidir con una palabra reservada. Es bueno que sean ‘autodescritos’ (NumAlumnos)
Ejemplos válidos: a, pepe, r456, tu_re_da, AnTeNa, antena
Ejemplos no válidos: 345abc, mi variable, Nombre.Largo, cañada, camión
Reglas de Sintaxis y Semántica. Para construir instrucciones (frases) correctas y con significado.
4
. . .127
89
. . .
. . . . . .
. . .
Contenido
216
89
127
N 2
. . .
2
1
0
Pos.
N 1
Contenido
Memoria Lineal
Pos.
0
3002
3003
Contenido
Sumar
Suma de dos números
3001
Pos.
0
3002
3003
3001
Datos e identificadores
Una variable no es más que un nombre simbólico que identifica una dirección de memoria. Suma el contenido de la posición 3001 y la 3002 y lo almacenas en la posición 3003 (ordenador). Suma cantidad1 y cantidad2 y lo almacenas en total. (usuario)
5
Programa Instrucciones
Datos de entrada
Datos de salida DATOS. Pueden ser:
Variables (concepto más amplio que Matemáticas).
Se identifican con iden-tificador que refiere a una posición de memoria.
Constantes: Literales (se representan por su valor).
Con nombre (identificador que no cambia de valor)
Tipos de datos Intrínsecos INTEGER (es palabra reservada)
Números enteros: ± 1073741826 (231) 4 bytes.
REAL Números reales. Forma científica. Hasta 10 E+(-)256. 8 bytes Double Precision. Hasta 10 E+(-)512. 16 bytes
COMPLEX Números complejos. Pareja de reales. 8 + 8 bytes
CHARACTER Caracteres del alfabeto (ASCII). Uso de “ “ para distinguirlo de
identificadores ( A ≠ ‘A’). La unión forma cadenas de caracteres
LOGICAL Valores de verdad o falso (.true. , .false.); . . distingue identificadores
6
Variables
Para usar una variable en un programa hay que declararla. Darle nombre y tipo de dato que almacena. El ordenador conoce así cómo codificar la información que se va
a almacenar en la posición de memoria correspondiente.
La declaración se hace al principio del programa.
Efectos de la declaración (variables, constantes-nombre): El compilador reserva la memoria adecuada [p.e., 4 bytes si es
integer, 8 bytes si es real, o 20 bytes para un dato character (20) ]. Si se le da un valor, lo almacena en la dirección de memoria asignada.
Además, al leer la secuencia de 0-1 almacenada, el programa interpreta el dato correctamente, porque sabe el tipo de dato.
7
.f90
Declaración de variables TIPO [lista-atributos]::<lista-variables>
Atributos (no obligados) sirven para indicar características especiales
Inicialización en la declaración: • Les damos un valor inicial. • Se usa el símbolo = y valores literales del tipo adecuado.
1. INTEGER :: a, b, c
2. REAL :: total, suma
INICIALIZAR VARIABLES
1. INTEGER :: cantidad = 100
2. REAL :: x = 5.67
Declaración implícita Declaración implícita de variables:
Fortran 90 declara automáticamente las variables que haya en el programa sin estar previamente declaradas:
Lo hace en función de la primera letra: I, J, K, L, M, N : INTEGER En otro caso: REAL
Se puede modificar con sentencia IMPLICIT
No es una buena costumbre. Hay que usar siempre: IMPLICIT NONE
.f90
Constantes con nombre TIPO [lista-atributos], PARAMETER::<lista de nombre=valor>
TIPO , PARAMETER::<lista-constantes>
1. INTEGER, PARAMETER :: Y =123
2. REAL, PARAMETER :: X=34.56, PI = 3.1416
3. REAL, PARAMETER :: PI_2 = 2*PI
4. CHARACTER (5), PARAMETER :: PEPE
Constantes: Valores literales
INTEGER: +25451 -21 4324
LOGICAL: .TRUE. .FALSE.
REAL: 2.45645 -321765.13 25. 23.00 .8298 -6.2E-06
CHARACTER: “hola”, ‘a’ “-32”
COMPLEX: (2, 4.5) (3.54, -3.2E2)
.f90
Cadenas de caracteres CHARACTER :: <lista de identificadores>
CHARACTER (LEN=<número>) :: <lista de identificadores>
CHARACTER (número) :: <lista de identificadores>
1. CHARACTER (LEN=10):: cad 2. CHARACTER (10):: cad ; CHARACTER :: carácter Inicialización al declarar: 1. CHARACTER (LEN=10):: cadena=“Hola” Constantes: 1. CHARACTER, PARAMETER :: X=‘a’ 2. CHARACTER (LEN=10), PARAMETER :: cad=“hola” 3. CHARACTER (LEN=*), PARAMETER :: cad)=“hola” Uso de comillas: 1. CHARACTER (LEN=*), PARAMETER :: mensaje = ‘ “hola” ’ 2. CHARACTER (LEN=*), PARAMETER :: palabra = “ don’t ”
Importante: Al dar valores, se trunca o se rellena de blancos
.f90
Tipos de dato definidos por el usuario Sirven para englobar datos que se refieren al mismo ente en una única variable estructurada.
Definición:
TYPE <Nombre_Nuevo_Tipo>
<Estructura>
END TYPE <Nombre_Nuevo_Tipo>
Declaración de variables:
TYPE (<Nombre_Tipo>) :: <identificadores>
Acceso a los campos:
Identificador%campo
12
Es un tipo de dato estructurado heterogéneo y estático.
Diferenciar el Tipo de dato, de las Variables que toman valores de ese tipo
Tipos de datos definidos por el usuario 1. TYPE Punto3D
2. REAL :: x, y, z
3. END TYPE Punto3D
4. TYPE Fecha
5. INTEGER :: dd, mm, aa
6. END TYPE Fecha
7. TYPE Persona
8. CHARACTER (LEN=15) :: nombre
9. CHARACTER (LEN=30) :: apellidos
10. TYPE (Fecha) :: fechaNacimiento
11. END TYPE Persona
12. TYPE (Punto3D) :: pto1, pto2
13. TYPE (Fecha) :: fechaNacimiento
14. Añadir acceso
13
.f90
OPERACIONES CON DATOS ESCALARES Expresiones y operadores aritméticos
- unario ► signo negativo
** ► exponenciación
*, / ► producto y división
+,- ► suma y resta
14
1. 30*2+4 ► 64
2. 30+2*4 ► 38
3. 2.0 ** -4.0 /7.0*8.0 ► 0,0714
4. 2 ** -4 /7 * 8 ► 0
5. 2 * ‘a’ !!! NO ES UNA EXPRESIÓN CORRECTA
Importante: Los operandos y el resultado han de ser del mismo tipo. Asi, cuidado con la división de números enteros
.f90
Expresiones y operadores lógicos .AND. ► Conjunción
.OR. ► Disyunción
.NOT. ► Negación
15
1. .TRUE. .OR. .FALSE. ► .TRUE.
2. .NOT. .TRUE. ► .FALSE.
3. 3>4 .OR. 6<9 ► .TRUE.
TABLA DE VERDAD
.f90
Expresiones y operadores relacionales < ó .LT. ► menor que
> ó .GT. ► mayor que
<= ó .LE. ► menor o igual que
>= ó .GE. ► mayor o igual que
= = ó .EQ. ► igual (Para datos lógicos se usa .EQV. )
/= ó .NE. ► distinto (Para datos lógicos se usa .NEQV. ) Con enteros y reales el orden conocido. Con los complejos sólo la igualdad y la desigualdad.
Con caracteres se usa el orden alfabético-ASCII (orden en el código de representación ASCII). En datos lógicos, .true. > .false.
16
1. 2 > 4 ► .FALSE.
2. “Pepe” .EQ. “pepe” ► .FALSE.
3. (7*2-3) .LE. 11 ► .TRUE.
4. 11-4 > “Alberto” !!! No es una expresión correcta
5. .TRUE. > .FALSE. !!! No es una expresión correcta
Importante: Se comparan datos del mismo tipo. El resultado es un dato LOGICO. Cuidado al comparar números reales (por la precisión en la representación).
.f90
Expresiones y operadores de cadenas Concatenación: cad1//cad2 .Se pone cad2 a continuación de cad1
Extracción de subcadenas: cadena (inf : sup)
• Si se omite inf, se toma por defecto el inicio.
• Si se omite sup, se toma por defecto el final.
• inf y sup se incluyen en la subcadena
17
1. CHARACTER (LEN=10) :: cad=“Hola” , as
2. Cad // “Pepe” ► “Hola Pepe”
3. “Pepe” // cad ► “PepeHola ”
4. As = cad(1:2) ► as = “Ho”
5. cad(2:4) = ‘ppp’ ► cad = “Hppp ”
6. cad(3: ) ► “la ”
7. cad( : 3) ► “Hol”
Precedencia de operadores ** *, / +, - // .GT., >, .LE., … .NOT. .AND. .OR. .EQV., .NEQV.
Se pueden usar paréntesis para cambiar el orden de operaciones Los que tienen igual nivel, se aplican en orden de aparición de
izquierda a derecha, excepto ** que se hace al revés.
18
EVALUAR EXPRESIONES. FUNCIONES PROPIAS
Cosas a tener en cuenta: En Fortran se escriben de forma lineal (no hay ‘castillos’, exponentes, ..) División de enteros da entero. Si varios tipos (numéricos), devuelve
tipo más alto (E< R< C): Hace copia tipo más bajo en más alto. Para evitar resultado erróneo, sumar 0.0 ó mult *1.0 a un entero Potencias: La base ha de ser positiva, si el exponente es real. Prioridad
de drcha a izqda: 3**2**3 es 3**8 y no 9**3. Comparar reales igualdad: Compara ABS(A-B) con EPSI (prox. a 0) Longitud máxima de las cadenas es 255. La compatibilidad de tipo impera. Válidas asignaciones como A = A*B Símbolo diferente para “comparar con =” (==) Además se pueden usar una serie de funciones como SQRT, LOG,
LOG10 , ABS, INT, NINT, SIN, COS .... que tienen prioridad sobre todas las operaciones. El/los argumentos siempre entre paréntesis
19
Evaluar expresiones. Ejemplo
A = (5*x1 +1 /(3+3/5)* exp(5.2) ) / (sin(x1)+ log(y1)* 3/ (5+ cos(0.5)))
B =
20
.f90
Comentarios en los programas ! Comentario
Todo lo que sigue a la “!” hasta el final de línea es ignorado por el compilador.
• Es muy importante introducir aclaraciones en el código mediante un uso adecuado de comentarios.
• Facilitan la legibilidad y la compresión del código.
• El traductor ignora los comentarios al procesar el código para generar un ejecutable.
1. ! Tipo para representar personas
2. TYPE Persona
3. CHARACTER (LEN=15):: nombre ! Cadena de longitud 15
4. CHARACTER (LEN=30) :: apellidos
5. TYPE (Fecha) :: fechaNacimiento
6. END TYPE Persona
.f90
La Estructura Secuencial Sentencia de asignación
<variable> = <expresión>
• Dar valor a las variables de nuestro programa.
• Uso conjunto con las expresiones.
• Coincidencia de tipo
Pasos:
• Se evalúa la expresión de la derecha.
• Se cambia el valor de la variable por el resultado.
1. a= 3*7+2
2. b=47.3 + 3 + c
3. a=4
4. a=a + 2
5. a%x = 4
6. Pepe = ‘Hola’ // ‘federico’
La Estructura Secuencial Entrada y salida de datos (E/S)
Comunicación básica con el usuario: Leer datos de teclado. Escribir información en la pantalla.
23
Operaciones
Salidade
Entradade
Operaciones
Dispositivosde
Entrada Salidade
Dispositivos
Memoria
C.P.U.
...
Disco
Ratón
Teclado Pantalla
Impresora
Disco
...
.f90
La Estructura Secuencial Salida de datos
PRINT*, <lista_expresiones>
24
1. CHARACTER (LEN=4) :: nombre=“Pepe” 2. REAL, PARAMETER :: PI=3.14159
3. REAL :: radio = 2 4. PRINT*, “hola “, nombre, “, ¿cómo estás?”
Resultado: hola Pepe, ¿cómo estás?
9. PRINT*, “El área del círculo de radio “, radio, “es “, PI*radio**2 Resultado: El área del círculo de radio 2. es 12.5663605
.f90
La Estructura Secuencial Entrada de datos
READ*, <lista_variables>
Efecto:
• Lee un dato por teclado.
• Asigna ese valor a la variable (Hasta completar la lista de variables)
En los tipos definidos por el usuario, da igual poner cada componente que el tipo en su conjunto (se desglosa automáticamente).
25
1. PRINT*, “Introduce el valor de a:”
2. READ*, a
3. PRINT*, “Dame tu fecha de nacimiento (dd, mm, aa):”
4. READ*, dd, mm, aa
La Estructura Secuencial Funciones y subrutinas intrínsecas Fortran 90 incorpora una serie de funciones y subrutinas
intrínsecas y predefinidas que completan el conjunto de operadores que hemos visto.
Estas funciones y subrutinas permiten: Convertir tipos. Hacer operaciones matemáticas complejas. Trabajar con cadenas de caracteres. …
Pueden usarse dentro de las expresiones, como si se tratase de operadores ya existentes en el lenguaje (predefinidas). También se hacen llamadas directas (CALL)
Funciones y Subrutinas. Las básicas FUNCIONES Int (x), Nint(x), Ceiling(y), Floor(y) ; x, y real, devuelve integer Real(n), Cmplx(x, y), Conjg(z) ; n integer (o complex); z complex Abs(x), Sqrt (x), Max (x1, x2, …), Min (x1, x2, …) Mod (m, n) ;devuelve resto de división entera [m – (m/n)*n] Exp(x), Log(x), Log10(x), Sin(x), Asin(x), Sinh(x), Cos(x), Tan(x), … Huge (x), Epsilon(x), Precision(x) ; Tamaño max y min representable
SUBRUTINAS (Call nombre) Random_seed() ; cambio semilla aleatoria Random_Number (x) ; devuelve (x) un número aleatorio en [0, 1)
27
Funciones y Subrutinas sobre cadenas Char(n), Ichar(c) ; n integer, c character; pasar carácter a código ASCCII
AdjustL(cad), AdjustR(cad) ; ajustar a izqda o drcha Index (cad, c1) ; devuelve posición (integer) en cad, del primer
carácter de c1, si c1 está contenida en cad; sino, devuelve 0 Len (cad) ; Longitud de la cadena (la que se declaró para cad) Trim (cad) elimina blancos finales de cad Len_Trim (cad) ; Longitud sin blancos finales Repeat (cad, i) : concatena cad , i veces Scan (cad, c1) ; devuelve posición (primero en cad) de cualquier
carácter de c1 que exista en cad; sino hay ninguno, devuelve 0
28
Ejemplos
29
Llamada Respuesta ADJUSTL(‘ Hola ‘) ‘Hola ‘ ADJUSTR(‘ Hola ‘) ‘ Hola’ INDEX (‘Camión’ ,’mi’) 3 INDEX(‘Cadena de prueba’, ‘na’) 5 INDEX(‘Camión’ ,’Mi’) 0 REPEAT (‘Hola’, 3) ‘HolaHolaHola’ SCAN(‘Cadena de prueba’, ‘na’) 2 TRIM(‘ Hola ‘) ‘ Hola’ LENTRIM (‘Hola ‘) 4 LEN(‘Hola ‘) 7
Estructura general de un programa F-90 ! Inicio Programa; Nombre = identificador. !Comentarios, tras ! al final. PROGRAM Nombre ! PROGRAM EjemploUno !! Es obligada IMPLICIT NONE ! Elimina Declaración Implícita ! Declaración de Constantes con nombre TipoDato, PARAMETER :: NomCons = valor, …. ! Integer, parameter:: NotaMax =10, NotaMin = 0 !Declaración de Variables (e Inicializar) TipoDato [, atributos]:: Lista NomVariables CHARACTER, PARAMETER (*) :: Cadena = ‘Hola Tu’ INTEGER:: Zx, Luis, X10 =5 ; REAL:: Pedro, A02x4 ; COMPLEX:: Z DOUBLE PRECISION:: Dp ; LOGICAL:: Encon = .True., Valido CHARACTER (LEN= 25) :: Pepe, LuisMiguel*10 ; ! CHARACTER (25) :: Pepe, LuisMiguel*10 !Sentencias Ejecutables (Estructuras) !! Estructura secuencial Read*, pedro ; zx = x10 * ABS (-1 * Pedro) ; Print*, ‘El valor de zx es ‘, zx !! CONTAINS !! No se usa si no hay subprogramas !! Subprogramas (ya los veremos) ! Final del programa END [PROGRAM Nombre] ! END PROGRAM EjemploUno ; !END !! Es obligada
Estructura general de un programa 1. PROGRAM AreaCirculo
2. IMPLICIT NONE 3. ! Cálculo del área de un círculo mediante la expresión:
4. !S = PI*R^2
5. ! Declaración de constantes 6. REAL, PARAMETER :: PI=3.1415926535
7. ! Declaración de variables
8. REAL :: r,S
9. ! Lectura de datos de entrada 10. PRINT*, "Dime el radio del círculo"
11. READ*, r
12. ! Calcular área 13. S = PI * r**2
14. ! Mostrar área en pantalla
15. PRINT*, "El área del círculo es ",S 16. END PROGRAM AreaCirculo
Estructura general de un programa
Estructura general de un programa 1. PROGRAM SistemaEcuaciones
2. IMPLICIT NONE 3. ! Cálculo de un sistema de 2 ecuaciones con 2 incógnitas:
4. ! ax + by = c 5. ! dx + ey = f
6. ! Declaración de variables
7. REAL::a,b,c,d,e,f 8. REAL::x,y
9. ! Entrada de datos
10. PRINT*, "Introduce los coeficientes del sistema (a,b,c,d,e,f):" 11. READ*, a,b,c,d,e,f
12. ! Cálculos
13. y = (d*c-a*f) / (d*b-a*e) 14. x = (c-b*y) / a
15. ! Salida de datos
16. PRINT*, "La solucion es X=", x, " e Y=", y 17. END
Estructura general de un programa
Preparar y Ejecutar Programas F-90
Programas F-90 no tienen estructura rígida, pero exige cierto orden entre sentencias. Se escribe en un editor o procesador (modo texto) de textos. Editor propio de Fortran-90.
Cada sentencia en una línea (hasta 132 caracteres), pero no es buen estilo (en pantalla normal solo 70-90). Se puede escribir más de una sentencia en la misma línea, separándolas con un punto y coma (;).
Línea continuación. Se termina la línea con & (indica al compilador que la sentencia continúa en la línea siguiente). Una sentencia puede tener hasta 20 líneas. Recomendable empezar la línea siguiente también con &
Estilo: Mantener criterios de sangrar párrafos, forma de escribir (palabras claves en may., variables inicial may, ...). Poner comentarios aclaratorios
El Programa, se guarda en un fichero (programa fuente .f90). Se compila programa objeto (.obj). Si errores, editar programa y corregir. Se linka (si errores, corregir) prog. ejecutable (.exe). Si resultados mal, corregir el diseño inicial del programa (algoritmo). Errores sintácticos se detectan bien (compilador). Los semánticos más difícil. Hacer la Prueba ayuda.
35
1.- Calcula e imprime B (trasparencia 20 ; pepe es de entrada)
Análisis: Es necesario introducir el valor de pepe con un read. Se calcula B Se imprime B y se termina B= (3*Pepe+ 1/3– 5* 4/7*2**3**3.5 + 4 ) /(cos(pepe)+ 15– 4/3*7/5+1/ (3- 10/3) Solución F-90 PROGRAM Calculo !! Este programa calcula una expresión compleja e imprime el resultado. Real:: PEPE, B !! Declaración de Variables !! Introducción de Datos de entrada Print*, ‘Introduce un valor real para la variable pepe’ ; Read*, pepe !! ahora calculamos el valor de B, según la expresión B = (3 * Pepe + 1/3 – 5 * 4/7 *2**3**3.5 + 4 ) /& & (cos (pepe) + 15 – 4/3*7/5 + 1 / (3- 10/3) !! Salida de resultados Print*, ‘Dado el valor ‘, pepe, ‘ la expresión vale ‘, b END Program Calculo
36
2.- Para fabricar un producto intervienen un diseñador y tres fabricantes. Diseñar un algoritmo que a partir del precio de venta, diga cuanto cobran cada de ellos, sabiendo que el diseñador cobra el doble que los otros.
Análisis Para encontrar la solución del problema dividiremos el total ganado al vender el
producto (VentaTot = UnidVend * Precio) en cinco partes. Dos partes serán para el diseñador (Slds) y cada una de las partes restantes para los fabricantes (Sldfabr).
Solución En Fortran-90 Program Producto Integer: UVend ; Real :: Precio, VentaTot, SlD, SldF Print *, ' Introduce las unidades vendidas y el precio de la unidad del
producto' Read*, UVend, Precio VentaTot = UVend * Precio ; SldF = VentaTot /5 ; SlD = SldF*2 Print *, 'Lo que cobra cada participante es: ' Print*, ' Diseño: ', Int (slds), ' Fabrica: ', Int(sldfabr), ' cada uno' End
37
Prueba: 120 unidades vendidas a 55 euros
38
Instrucc UVend Precio VentaTot SlD SlDF
Read 120 55
Vent 6600
Sldf 1320
Sld 2640
Salida 1320 2640
LA SALIDA ES CORRECTA
39
3.- De un material interesa conocer sus datos (nombre, densidad, dureza, resistencia y duración media), que se introducen por el teclado. Se debe imprimir como salida, el nombre, la duración media del material y el valor, que se calcula como la suma de 2 veces la dureza con el producto de la duración media por la resistencia
Análisis El problema es muy sencillo y no requiere mayor análisis. Solo tener en cuenta que Valor = 2 * dureza + duracmed * resistencia . Escribiremos directamente el programa en Fortran-90
Solución en F-90 PROGRAM Materiales Type TipoClaseMat !! Estilo: Poner siempre TipoNombre character (10) :: nombre real :: densid, dureza, resist, duracm endtype Type (TipoClaseMat) :: material ; Real:: valor Read *, material !! ¿Como sería el Print * explicativo? !! Read*, material%nombre, material%densid, material%dureza, ……. Valor = 2*material%dureza + material%duracm * material%resist Print *, 'La duracion media del material', material%nombre, ' es ', & &material%duracm Print*, ‘ y su valor es : ‘, valor END
4.- PROBLEMA. Hallar los errores en el siguiente programa y arreglarlos
Program Media X1,X2,X3 reales ; real:: Med Read *, X1 ; Read *, X2, X3 Med := x1+x2+x3/3 Print *, ’La media es , Med End
Solución Los errores sintácticos que existen en este programa son : X1,X2,X3:Reales; el tipo de dato reales no existe en F-90. Además la declaración está
mal hecha. La forma correcta sería Real:: X1,X2,X3. En Med:=x1+x2+x3/3, hay un error sintáctico (sobra :) y uno semántico. Por el ambiente
se deduce que se calcula la media de tres números Med = (x1+x2+x3) / 3. Falta cerrar las comillas en el print Pueden declararse (y leer) todas las variables de una vez. Se debe indicar que tipo de datos se introducen
40
41
5.- Un banco recibe todos los días del Banco Mundial una lista de los cambios de monedas del mundo respecto del dólar. Diseñar un programa que a partir de la cantidad en moneda extranjera y el cambio actual dé la cantidad en euros. Suponer un % variable de ganancia del banco.
Análisis: Primero se cambia la moneda extranjera (DinExtj) a dólares y esta cantidad a euros (DinEsp), ya que solo se dispone de la tabla de cambios a dólares (CamDol). Una vez realizado este cambio tendremos que sumarle el porcentaje de ganancia del banco (PcenAct). Algoritmo Cambio V. Entrada DinExtj, CamDol, CamDolPts, PcenAct : real V. auxiliares : CMEDol: real ; V. Salida DinEsp: real 1. [Entrada de datos] Escribe(’Dime el cambio a dólares de la moneda (1 dólar = aaa.bbbb & &unidades de la moneda) : ’ ; Lee(CamDol) Escribe(’Cambio Euro-dólar (1 dólar= aaa.bbbb €): ’; Lee(CamDolEu) Escribe(’Dime cantidad a cambiar: ’) ; Lee(DinExtj) Escribe(’Introduce el % de ganancia: ’) ; Lee(PcenAct) 2. [Convertir moneda extranjera a dolares] CMEDol = DinExtj / CamDol 3. [Conversion de dolares a euros] DinEsp = CMEDol * CamDolPts 4. [Introducción de la ganancia del banco] DinEsp = DinEsp + (DinEsp * PcenAct) / 100 5. [Salida de datos] Escribe(’El cambio es : ’, DinEsp) 6. [Final] FIN.
42
SOLUCIÓN EN FORTRAN-90. PROGRAM CAMBIO Real:: DinExtj, CamDol, CamDolEu, PcenAct, Cmedol, DinEsp ; Character (6) :: NomMon !! Entrada de datos Print*, ‘Dime la moneda extranjera’ ; Read*, NomMon Print*, ’Dime el cambio a dólares de la moneda (1 dólar = aaa.bbbb & & unidades de la moneda) : ’ ; Read*, CamDol Print*, ’Dime el cambio de euro a dólares (1 dólar = aaa.bbbb ptas.) : ’ Read*, CamDolEu Print*, ’Introduce la cantidad a cambiar: ’ ; Read*, DinExtj Print*, ’Introduce el porcentaje actual de ganancia: ’ ; Read*, PcenAct !! Conversion de la moneda extranjera a dolares y estos a euros CMEDol = DinExtj / CamDol ; DinEsp = CMEDol * CamDolEu !! Introducción de la ganancia del banco DinEsp = DinEsp - (DinEsp * PcenAct) / 100 !! Salida de datos Print*, ’El cambio de ’, DinExtj, NomMon, ‘ es en euros: ‘, DinEsp END
PASAMOS EL ALGORITMO A F-90
Prueba para Cambiar 400 francos suizos (FraSui), si 1 dólar es 1’4 FraSiu y 0,82 euros. El banco gana 3%
43
Instrucc DinExtj CamDol CamDolEu PcenAct Cmedol DinEsp NomMon
Entrad Datos
400 1.4 0.82 0.03 FraSui
CMEDol 285.71
DinEsp 234.29
DinEsp% 227.26
SALIDA 227.26