Professional Documents
Culture Documents
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
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
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
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. .true.
Operadores aritmticos
Los operadores aritmticos son los que representan operaciones numricas. Sus operandos pueden ser enteros o reales. Los operadores aritmticos binarios son:
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:
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:
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 ::
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
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'
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
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
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
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
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'
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
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
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
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))