Upload
rodrigo-cabrera
View
17
Download
0
Embed Size (px)
Citation preview
Algoritmo 1: convertir grados Fahrenheit a
grados Celsius
Entrada: nmero real f, los grados Fahrenheit.
Salida: el equivalente de f en grados Celsius.
Diagrama de flujo:
Cdigo:
program convertir_fahrenheit implicit none real :: f real :: c read *, f c = (f - 32) * 5 / 9 print *, c end program convertir_fahrenheit
Algoritmo 2: calcular el valor absoluto
Entrada: nmero real x.
Salida: el valor absoluto de x.
Diagrama de flujo:
Cdigo:
program valor_absoluto implicit none real :: a, x read *, x if (x < 0) then a = -x else a = x end if print *, a end program valor_absoluto
Algoritmo 3: calcular potencia
Entrada: nmero real b, nmero entero positivo n.
Salida: la n-sima potencia de b.
Diagrama de flujo:
Cdigo:
program potencia implicit none real :: base, resultado integer :: exponente, i read *, base read *, exponente resultado = 1 do i = 1, exponente resultado = resultado * base end do print *, resultado end program potencia
Tipos de datos
Un tipo de datos es una propiedad de un conjunto de valores que
indica cules son los valores vlidos, qu operaciones se pueden
efectuar sobre ellos y cmo son representados internamente por el
computador.
En un programa, cada variable tiene asociado un tipo. Slo se puede
asignar valores de ese tipo a la variable.
En el lenguaje Fortran, los siguientes son los tipos de datos bsicos.
Tipo entero
El tipo integer permite representar nmeros enteros.
No todos los enteros son representables como un valor integer. El rango
de valores permitidos depende del computador, del compilador y del
sistema operativo, pero generalmente los valores permitidos estn
entre -2147483648 y 2147483647.
En el cdigo, los enteros literales se representan como una secuencia de
dgitos, precedidos por un signo opcional:
142857 -123 +1935
Sobre valores de tipo integer pueden ser aplicadas las operaciones
artimticas y relacionales.
Tipo real
El tipo real permite representar nmeros reales.
En el cdigo, los reales literales se representan escribiendo las partes
entera y fraccional separadas por un punto, y precedidos por un signo
opcional:
3.141592654 -0.345
Adems, se puede utilizar notacin cientfica, indicando con una letrae la
potencia de 10 usada:
6.02e23 9.1094e-31
Estos valores son respectivamente iguales a 6,021023 (el nmero de
Avogadro) y 9,10941031 (la masa del electrn en kilgramos).
No todos los nmeros reales son representables por el tipo real.
Internamente, el computador representa los nmeros reales usando la
representacin de coma flotante, que permite expresar nmeros de
distintos niveles de precisin. Esta representacin no es exacta; todos
los nmeros reales y las operaciones que aparecen en un programa son
aproximaciones. Por ejemplo, en muchos computadores el siguiente
cdigo entrega como resultado 0.99999994:
print *, 41.0 * (1 / 41.0)
Sobre valores de tipo real pueden ser aplicadas las operaciones
artimticas y relacionales.
Tipo lgico
El tipo logical permite representar los valores verdadero y falso.
En el cdigo, los valores verdadero y falso se representan
respectivamente como:
.true.
.false.
al imprimirlos usando print, estos valores aparecen por pantalla
respectivamente como T y F.
Sobre valores de tipo logical pueden ser aplicadas slo operaciones
lgicas.
Tipo caracter
El tipo character permite representar smbolos como letras, dgitos,
puntuacin, etc.
Los caracteres literales se representan entre comillas simples:
'a' '!' '7'
Si se pone ms de un caracter entre las comillas, se obtiene unacadena
de caracteres, que permite representar texto:
'En un lugar de La Mancha'
Ejemplo
El siguiente programa ilustra la declaracin de variables de cada uno de
los tipos bsicos y sus asignaciones usando valores literales:
program literales implicit none integer :: n real :: x logical :: p character :: c n = 142857 n = -1234 x = 3.141592654 x = 6.02e23 ! notacion cientifica p = .true. p = .false. c = 'a' c = '#' c = '!' end program literales
Expresiones
Una expresin es una combinacin de valores y operaciones que, al
ser evaluados, entregan un valor.
Algunos elementos que pueden formar parte de una expresin son:
valores literales (como 2, 'hola', .true. o 5.7), variables, operadore
sy llamadas a funciones.
Por ejemplo, la expresin 4 * 3 - 2 entrega el valor 10 al ser evaluada.
El valor de la expresin n / 7 + 5 depende del valor que tiene la
variable n en el momento de la evaluacin.
Una expresin est compuesta de otras expresiones, que son evaluadas
recursivamente hasta llegar a sus componentes ms simples, que son
los literales y las variables.
Por ejemplo, en la expresin:
b * b - 4 * a * c
las subexpresiones que son evaluadas son las siguientes:
b * b b 4 * a * c 4 * a 4 a c
Ejercicio: por qu no a * c?
Operadores
Un operador es un smbolo en una expresin que representa una
operacin aplicada a los valores sobre los que acta.
Los valores sobre los que acta un operador se llaman operandos.
Un operador binario es el que tiene dos operandos, mientras que un
operador unario es el que tiene slo uno.
Por ejemplo, en la expresin 2.0 + x el operador + es un operador
binario que representa la suma, y sus operandos son 2.0 y x.
Los operadores en Fortran se pueden clasificar en: aritmticos,
relacionales y lgicos.
Operadores lgicos
Los operadores lgicos tienen operandos lgicos y resultado lgico.
Los operadores lgicos son:
.and. (en espaol: y) representa la conjuncin lgica;
.or. (en espaol: o) representa la disyuncin lgica.
.not. (en espaol: negacin) representa la negacin lgica.
Los operadores .and. y .or. son binarios, mientras que .not. es unario.
La siguiente tabla muestra todos los resultados posibles de las
operaciones lgicas. Las primeras dos columnas representan los valores
de los operandos, y las siguientes tres, los resultados de las
operaciones.
p q p .and. q p .or. q .not. p
.true. .true. .true. .true. .false.
.true. .false. .false. .true.
.false. .true. .false. .true. .true.
.false. .false. .false. .false.
Operadores aritmticos
Los operadores aritmticos son los que representan operaciones
numricas. Sus operandos pueden ser enteros o reales.
Los operadores aritmticos binarios son:
la suma +;
la resta -;
la multiplicacin *;
la divisin /;
la exponenciacin ** (elevado a).
El operador - tambin funciona como operador unario, cambiando el
signo de su operando.
Operadores relacionales
Los operadores relacionales son los que permiten comparar valores.
Sus operandos son cualquier cosa que pueda ser comparada, y sus
resultados siempre son valores lgicos.
Los operadores relacionales son:
el igual a ==;
el distinto a /=;
el mayor que >;
el mayor o igual que >=;
el menor que
Para usar la funcin, hay que poner el nombre de la funcin, y a
continuacin los argumentos entre parntesis. Esta operacin se
denomina llamar a la funcin.
Funciones intrnsecas
Fortran provee varias funciones que son propias del lenguaje. Se les
denomina funciones intrnsecas.
Las siguientes funciones reciben un argumento real y entregan un
resultado real:
sqrt(x): la raz cuadrada de x.
exp(x): la exponencial de x.
log(x): el logaritmo natural de x.
sin(x): el seno de x.
cos(x): el coseno de x.
La funcin abs puede recibir un argumento real o entero, y entrega un
resultado del mismo tipo:
abs(x): el valor absoluto de x.
Las siguientes funciones sirven para convertir nmeros reales a
enteros. Se diferencian en el criterio que usan para redondear:
int(x): trunca el nmero real x.
nint(x): aproxima el nmero real x al entero ms cercano.
ceiling(x): aproxima el nmero real x hacia arriba.
floor(x): aproxima el nmero real x hacia abajo.
En matemticas y ciencias de la computacin, las ltimas dos funciones
se llaman respectivamente techo y piso, y se representan
como x y x.
La funcin mod (mdulo) recibe dos argumentos del mismo tipo, pero
generalmente la usaremos con argumentos enteros positivos:
mod(a, b): entrega el resto de la divisin entre a y b.
Dos usos importantes de la funcin mod son:
1. verificar si un nmero n es divisible por d usando la
condicinmod(n, d) == 0, y
2. obtener el ltimo dgito de un nmero entero n usando la
expresin mod(n, 10).
Ms adelante aprenderemos cmo crear nuestras propias funciones.
Estructura de un programa Fortran
Los programas en Fortran tienen la siguiente estructura:
program nombre_del_programa implicit none ! declaraciones de variables ! cdigo del programa end program nombre_del_programa
El nombre del programa puede ser cualquiera, pero siempre es
conveniente pensar un nombre que represente lo que el programa hace.
Las lneas en blanco son ignoradas. Se puede agregar u omitir todas las
que se quiera.
Las palabras que son parte del lenguaje pueden ser escritas
indistintamente en maysculas o minsculas. Por ejemplo, es vlido
escribir PROGRAM, Program o pRoGrAm en vez de program.
El cdigo del programa es una secuencia de sentencias (simples y de
control).
Declaracin de variables
En la seccin de declaracin de variables, todas las variables que son
utilizadas por el programa deben ser declaradas junto con su tipo.
La sintaxis de una declaracin es:
tipo :: variable
Por ejemplo, el siguiente programa declara tres variables, de las cuales
dos son reales y una entera:
program ejemplo implicit none real :: x real :: y
integer :: n read *, x, y, n print *, (x * x + y * y) ** n end program ejemplo
Cuando varias variables tienen el mismo tipo, pueden ser especificadas
en la misma declaracin separadas por comas. Por ejemplo, las
declaraciones de x e y en el programa de arriba pueden ser juntadas
as:
real :: x, y
Declaracin de constantes
Adems de las variables, que pueden cambiar de valor durante la
ejecucin, es posible ponerle nombres a valores inmutables que sern
utilizados por el programa. Estos nombres se llaman constantes.
La declaracin de una constante tiene la siguiente sintaxis:
tipo, parameter :: variable = valor
Por ejemplo, el siguiente programa calcula el area y el perimetro de un
circulo cuyo radio fue ingresado por el usuario:
1 2 3 4 5 6 7 8 9 10
program circulo implicit none real :: radio real, parameter :: pi = 3.14159 print *, 'Ingrese el radio del circulo' read *, radio print *, 'El perimetro es ', 2 * pi * radio print *, 'El area es ', pi * radio * radio end program circulo
En este caso, se ha declarado la constante pi con el valor . Si se
intentara cambiar su valor, el compilador arrojara un error.
Comentarios
Un comentario es una seccin del cdigo que es ignorada por el
compilador. Un comentario puede ser utilizado por el programador para
dejar un mensaje en el cdigo que puede ser til para alguien que tenga
que leerlo en el futuro.
En Fortran, los comentarios comienzan con el smbolo !. Todo lo que
est entre el ! y el final de la lnea es ignorado:
! aqu puedo poner cualquier cosa b = 15 a = 1 ! esto es un comentario
Sentencias simples en Fortran
Recordemos que una sentencia es cada una de las
instrucciones que componen un programa.
Las sentencias ms simples que forman un programa son
las asignaciones, la entrada y la salida.
En un programa, cada lnea de cdigo representa una
sentencia.
Asignaciones
Las asignaciones en Fortran son representadas con la
sintaxis que ya presentamos:
variable = expresin
Salida
En Fortran, un programa puede imprimir cosas en la
pantalla usando la sentencia print.
La sintaxis es:
print *, mensaje
El mensaje puede ser cualquier un valor de cualquier tipo.
Por ejemplo, el siguiente cdigo escribe el
mensaje Hola mundo en la pantalla:
print *, 'Hola mundo'
Una sentencia print tambin puede escribir varios
mensajes en la misma lnea, que hay que poner separados
por comas. El ejemplo tambin podra haber sido escrito
as:
print *, 'Hola ', 'mundo'
A veces es conveniente usar variables y expresiones como
mensaje. Por ejemplo:
a = 2 b = 3 print *, 'La suma de ', a, ' y ', b, ' es ', a + b
Entrada
En Fortran, un programa puede leer los datos que el
usuario ingresa con el teclado usando la sentencia read.
La sintaxis es:
read *, variable
Cuando el programa llega a una sentencia read, queda
bloqueado hasta que el usuario ingrese datos y presione
enter.
El texto ingresado por el usuario debe corresponder a la
representacin de un valor del tipo de la variable. Si esto
no se cumple, ocurre un error y el programa termina.
Por ejemplo, el siguiente cdigo le pide al usuario que
ingrese los valores de a, b y c para resolver la ecuacin
cuadrtica:
print *, 'Ingrese a, b y c: ' read *, a read *, b read *, c
a, b y c deben haber sido declaradas previamente con
tipo real.
Para llenar los datos, el usuario podra tipear:
5 2.5 -3
En este caso, la variable a tomar el valor 5.0, la
variable b el valor2.5, y la variable c el valor -3.0.
Tambin se puede leer datos escritos en una nica lnea.
Para eso, hay que poner todas las variables en
el read separadas por comas. Por ejemplo:
print *, 'Ingrese a, b y c: ' read *, a, b, c
En este caso, el usuario debe tipear los tres valores en la
misma lnea, separados por espacios en blanco:
5 2.5 -3
Continuacin de lnea
Cada sentencia debe ocupar una lnea de cdigo. Sin
embargo, a veces conviene separar una sentencia en
varias lneas para hacer el programa ms claro. Para
indicar que una sentencia contina en la lnea siguiente,
hay que poner un smbolo & al final de la lnea:
a = 1 + x + x ** 2 + x ** 3 + & x ** 4 + x ** 5 + &
x ** 6 + x ** 7
En este ejemplo, la variable a toma el resultado de la
expresin1+x+x2+x3+x4+x5+x6+x7.
Sentencias de control en Fortran
Adems de las sentencias simples, que son ejecutadas en
secuencia, existen sentencias de control que permiten
modificar el flujo del programa introduciendo ciclos y
condicionales.
Una secuencia de control incluye otra sentencia dentro de
s. Por ejemplo, una sentencia condicional incluye la
sentencia que puede o no ejecutarse dependiendo de una
condicin.
Al escribir las sentencias que van dentro de una sentencia
de control, se acostumbra a comenzar el rengln varias
columnas ms adelante. Esto se llama indentacin, y es
crucial para entender programas complejos. Para indentar,
lo tpico es usar cuatro espacios. Todos los ejemplos en
esta seccin estn debidamente indentados.
Condicional if-then
La sentencia if-then (en espaol: si-entonces) ejecuta
instrucciones slo si se cumple una condicin. Si la
condicin es falsa, no se hace nada.
La sintaxis es la siguiente:
if (condicin) then ! qu hacer cuando la condicin es verdadera end if
Por ejemplo, el siguente programa felicita a alguien que
aprob la asignatura:
program aprobado implicit none integer :: nota print *, 'Que nota obtuvo: ' read *, nota if (nota >= 55) then print *, 'Felicitaciones' end if end program aprobado
Condicional if-then-else
La sentencia if-then-else (si-entonces-o-si-no) decide
entre dos secuencias de instrucciones a ejecutar
dependiendo si una condicin es verdadera o falsa. La
sintaxis es la siguiente:
if (condicin) then ! qu hacer cuando la condicin es verdadera else ! qu hacer cuando la condicin es falsa end if
Por ejemplo, el siguiente programa recibe como entrada un
ao e indica si es bisiesto o no:
program bisiesto implicit none integer :: year print *, 'Ingrese el ao: ' read *, year if (mod(year, 4) == 0 .and. (mod(year, 100) /= 0) .or. & (mod(year, 400) == 0)) then print *, 'El ao ', year, ' es bisiesto' else print *, 'El ao ', year, ' no es bisiesto' end if
end program bisiesto
Condicional select-case
La sentencia select-case (seleccionar-caso) decide qu
instrucciones ejecutar dependiendo del valor de una
expresin. Es una manera abreviada de escribir
varios ifs uno despus del otro.
La sintaxis es la siguiente:
select case (expresin) case (valor1) ! qu hacer cuando expresin == valor1 case (valor2) ! qu hacer cuando expresin == valor2 ... case default ! qu hacer cuando no se cumpli ! ninguno de los caso anteriores end select
Por ejemplo, el siguiente programa recibe un nmero
entero como entrada e indica si es par o impar:
program par implicit none integer :: n print *, 'Ingrese un numero' read *, n select case (mod(n, 2)) case (0) print *, 'El numero es par' case (1) print *, 'El numero es impar' end select end program par
En un mismo caso es posible poner varios valores
separados por comas. Por ejemplo, el siguiente programa
recibe como entrada un caracter, y lo clasifica como vocal,
consonante, dgito o smbolo:
program clasifica_letras implicit none character :: c print *, 'Ingrese un caracter' read *, c select case (c) case ('a', 'e', 'i', 'o', 'u') print *, c, ' es una vocal minuscula' case ('A', 'E', 'I', 'O', 'U') print *, c, ' es una vocal mayuscula' case ('b', 'c', 'd', 'f', 'g', 'h', 'j', & 'k', 'l', 'm', 'n', 'p', 'q', 'r', & 's', 't', 'v', 'w', 'x', 'y', 'z') print *, c, ' es una consonante minuscula' case ('B', 'C', 'D', 'F', 'G', 'H', 'J', & 'K', 'L', 'M', 'N', 'P', 'Q', 'R', & 'S', 'T', 'V', 'W', 'X', 'Y', 'Z') print *, c, ' es una consonante mayuscula' case ('0', '1', '2', '3', '4', & '5', '6', '7', '8', '9') print *, c, ' es un digito' case default print *, c, ' es un simbolo' end select end program clasifica_letras
Ciclo do-while
El ciclo do-while (hacer mientras) ejecuta una
secuencia de instrucciones mientras una condicin sea
verdadera.
La sintaxis es:
do while (condicin) ! qu hacer mientras la condicin se cumple end do
Por ejemplo, el siguiente cdigo toma un nmero, y lo
eleva al cuadrado hasta pasar de mil:
do while (n < 1000) n = n ** 2 end do
En general, el ciclo do while se utiliza cuando no se puede
saber de antemano cuntas veces se ejecutar un ciclo,
pero s qu es lo que tiene que ocurrir para que se
termine.
La condicin es evaluada al comienzo de cada iteracin. Si
la condicin deja de ser verdadera en medio de la
iteracin, el ciclo no termina, sino que contina hasta el
final. Por ejemplo, el siguiente ciclo se ejecuta tres veces,
a pesar de que la condicin siempre deja de cumplirse
despus de la primera asignacin:
n = 2 do while (n < 10) n = n * 6 n = n - 9 end do
Ciclo do
El ciclo do (hacer) ejecuta una secuencia de
instrucciones un nmero determinado de veces. Para llevar
la cuenta, utiliza unavariable de control que toma
distintos valores en cada iteracin.
La sintaxis es:
do variable = inicio, final ! qu hacer para cada valor de la variable de control end do
En la primera iteracin, la variable de control toma el
valor inicio. Al final de cada iteracin, el valor de la
variable de control aumenta automticamente. Cuando se
pasa de largo del valor final, el ciclo termina.
Por ejemplo, el siguiente programa muestra los cubos de
los nmeros del 1 al 20:
do i = 1, 20 print *, i, i ** 3 end do
Si el valor final es menor al inicial, el ciclo nunca es
ejecutado.
Adems, el ciclo do puede recibir un tercer valor que
representa el incremento de la variable de control, es
decir, en cunto cambiar su valor despus de cada
iteracin.
Por ejemplo, el siguiente programa muestra los cuadrados
de los nmeros impares menores que 100:
do i = 1, 100, 2 print *, i, sqrt(real(i)) end do
Tambin es posible hacer ciclos que van hacia atrs:
do i = 10, 1, -1 print *, i end do print *, 'Feliz an~o nuevo!'
Tanto la variable de control como los valores inicial, final y
de incremento deben ser de tipo entero. La variable de
control es una variable como cualquier otra, y debe ser
declarada apropiadamente al comienzo del programa.
Un ciclo do es una manera abreviada de escribir un tipo
especial de ciclo do while. Los siguientes dos ciclos son
equivalentes (cuando inces positivo):
if (mod(i, 10) == 7) then cycle end if print *, i print *, 'Seno: ', sin(real(i)) print *, 'Coseno: ', cos(real(i)) print *, 'Tangente:', tan(real(i)) end do