You are on page 1of 26

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 .true. .true. q .true. p .and. q p .or. q .not. p .true. .true. .true. .true. .false. .true. .false.

.false. .false. .false.

.false. .true.

.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 <; el menor o igual que <=.

Precedencia de operadores
La precedencia de operadores es una regla que especifica en qu orden deben ser evaluadas las operaciones de una expresin. (Por escribir)

Llamadas a funciones
Una funcin es un tipo de operacin que, en vez de estar representada por un smbolo, tiene un nombre. Los operandos de una funcin se llaman parmetros o argumentos. Por ejemplo, la funcin exp tiene un parmetro real x, y entrega como resultado ex.

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 ::

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', print *, c, case ('A', 'E', print *, c, case ('b', 'c', 'k', 'l', 's', 't', print *, c, case ('B', 'C', 'K', 'L', 'S', 'T', print *, c, case ('0', '1', '5', '6', print *, c, case default print *, c, end select

'i', ' es 'I', ' es 'd', 'm', 'v', ' es 'D', 'M', 'V', ' es '2', '7', ' es

'o', 'u') una vocal minuscula' 'O', 'U') una vocal mayuscula' 'f', 'g', 'h', 'j', & 'n', 'p', 'q', 'r', & 'w', 'x', 'y', 'z') una consonante minuscula' 'F', 'G', 'H', 'J', & 'N', 'P', 'Q', 'R', & 'W', 'X', 'Y', 'Z') una consonante mayuscula' '3', '4', & '8', '9') un digito'

' es un simbolo'

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):

do i = inicio, fin, inc print *, i end do i = inicio do while (i <= fin) print *, i i = i + inc end do

Salir de un ciclo
Adems de las condiciones de trmino propias de los ciclos do y dowhile, siempre es posible salir de un ciclo en cualquier momento usando la sentencia exit. Lo lgico es que sea usada dentro de un condicional, para evitar que todos los ciclos se terminen a la primera. Por ejemplo, en el programa para determinar si un nmero es primo o no, la bsqueda de divisores puede ser terminada prematuramente apenas se encuentra el primero de ellos:
es_primo = .true. do d = 2, n - 1 if (mod(n, d) == 0) then es_primo = .false. exit end if end do

Saltar a la siguiente iteracin


La sentencia cycle se usa para saltar a la iteracin siguiente sin llegar al final de la que est en curso. Por ejemplo, el siguiente programa muestra el seno, el coseno y la tangente de los nmeros del 1 al 30, pero omitiendo los que terminan en 7:
do i = 1, 30

if (mod(i, 10) == 7) then cycle end if print print print print end do *, *, *, *, i 'Seno: ', sin(real(i)) 'Coseno: ', cos(real(i)) 'Tangente:', tan(real(i))

You might also like