program variablesAndTypes !//////////////////////////////////////////////////////// !/ Este programa ejemplifica las declaraciones y uso / !/ de los tipos de datos y variables mas usados en / !/ Fortran. / !//////////////////////////////////////////////////////// !print*;print*,"===== TIPOS DE DATOS Y VARIABLES ======";print*; ! Los tipos de datos intrinsecos pertenecen a tres clases: ! Numericos: real ! integer ! complex ! ! logicos: logical ! ! caracteres: character ! Ejemplos basicos: real :: rea11, real2 = 3.0 integer :: int1, int2 = 2 character :: char1 = "A" character(len=26) :: char2 = "abcdefghijklmnopqrstuvxyz" logical :: bool1 = .true. , bool2 = .false. ! Las declaraciones aceptan ciertos tipos de "parametros" y/o "atributos" ! que especifican aun mas el tipo de dato (por ej. el len(..) en character) ! Con "kind" podemos especidicar cuantos Bytes se utilizan para definir el real: ! kind=4 (sp, por defecto): se usan 4 Bytes (32 bits) , precision ~ 7 cs - rango ~ [-1e30,1e30] ! kind=8 (db) : se usan 8 Bytes (64 bits) , precision ~ 15 cs - rango ~ [-1e308,1e308] ! sp='simple precision' | dp='doble precision' | cs='cifras significativas' real(kind=4) :: real3 ! equivalente a: real::real3 real(kind=8) :: real4 ! doble precision complex(kind=8) :: complex1 ! la parte real e imaginaria se representan con 8 Bytes ! Tambien los enteros aceptan el uso de kind: ! kind=1 : se usa 1 byte, rango= [-128,127] ! kind=2 : se usa 2 bytes, rango= [-32768,32767] ! kind=4 (por defecto) : se usa 4 bytes, rango= [-2147483648,2147483647] ! kind=8 : se usa 8 bytes, rango~ +- 9.2x10^18 integer(kind=8) :: int3 ! Tipo de dato ARRAY. Un ARRAy o ARREGLO de rango K es un conjunto ! indexado de K tipos de variables independientes entre si. LA DIMENSION ! de cada una de las variables determina el la cantidad de elementos que ! tiene c/una integer :: vectorInteger(3) real, dimension(5) :: vector real, dimension(2,2) :: matrix ! TIPOS DE DATOS DERIVADOS ! Es un tipo de dato definido por el usuario en base a tipos de datos intrinsecos type planet integer :: planetNumber real :: radiusKM character(10) :: name end type ! Puedo declarar variables de tipo "planeta", al igual que con los tipos de ! datos intrinsecos: type(planet) :: Tierra, Marte !Ejemplos de uso print* print*,"---- TIPOS DE DATOS Y VARIABLES -----";print* print*," REALES Y ENTEROS DE DISTINTA PRECISION ";print* ! Asigno PI para algunas de las variables reales, real3 es de simple precision: real3 = 3.14159265358979323846 print*,"pi_sp=",real3 ! real4 es de tipo real kind=8, o sea doble precision. real4 = 3.14159265358979323846 print*,"pi_dp=",real4 ! int1 esta def. con kind=4, si le sumo al maximo posible del rango (2147483647) 1 entonces: ! DESCOMENTAR LAS DOS SENTENCIAS DE ABAJO Y COMPILAR !int1 = 2147483647+1 !print*,"El entero 2147483647+1=",int1 ! int3 es kind=8 entonces el resultado anterior devuelve: int3 = 2147483647 int3 = int3 + 1 print*,"El entero (kind=8) 2147483647+1=",int3 print* !Ejemplos de uso de ARRAYS print*;print*,"---- USO DE ARRAYS ----";print* ! Hay varias formas de instanciar un array, la primera es asignandole ! un valor a c/componente: vectorInteger(1) = 1 vectorInteger(2) = 4 vectorInteger(3) = 8 print*,"vectorInteger=",vectorInteger ! Otra forma es instanciando varias componentes al mismo tiempo con los ! delimitadores (/../) : vectorInteger(1:2) = (/2,9/) vectorInteger(3) = 15 print*,"vectorInteger=",vectorInteger ! Otra forma es instanciar las componentes mediante un "do implicito": vector(1:5) = (/(sqrt(real(I)),I=1,5)/) print*,"vector=",vector ! La declaracion de arrays de rango mayor que uno: matrix(1,1) = 1 matrix(1,2) = 2 print*,"matrix=",matrix ! Para instanciar un tipo de dato derivado: tierra = planet(1,12478.5,"TIERRA") print*,"Datos del planeta Tierra:",tierra ! Puedo referirme a una componente de la estructura con el simbolo % print*,"EL radio en KM de la tierra es:",tierra%radiusKM end program variablesAndTypes