Estructura Programa Fortran

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

  • do i = inicio, fin, inc print *, i end do i = inicio do while (i
  • 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