Fortran - Cuerdas

El lenguaje Fortran puede tratar los caracteres como un solo carácter o como cadenas contiguas.

Una cadena de caracteres puede tener solo un carácter de longitud o incluso puede tener una longitud cero. En Fortran, las constantes de caracteres se dan entre un par de comillas simples o dobles.

El tipo de datos intrínseco characteralmacena caracteres y cadenas. La longitud de la cadena se puede especificar mediantelen specifier. Si no se especifica una longitud, es 1. Puede hacer referencia a caracteres individuales dentro de una cadena refiriéndose por posición; el carácter más a la izquierda está en la posición 1.

Declaración de cadena

Declarar una cadena es lo mismo que otras variables:

type-specifier :: variable_name

Por ejemplo,

Character(len = 20) :: firstname, surname

puede asignar un valor como,

character (len = 40) :: name  
name = “Zara Ali”

El siguiente ejemplo demuestra la declaración y el uso del tipo de datos de caracteres:

program hello
implicit none

   character(len = 15) :: surname, firstname 
   character(len = 6) :: title 
   character(len = 25)::greetings
   
   title = 'Mr.' 
   firstname = 'Rowan' 
   surname = 'Atkinson'
   greetings = 'A big hello from Mr. Beans'
   
   print *, 'Here is', title, firstname, surname
   print *, greetings
   
end program hello

Cuando compila y ejecuta el programa anterior, produce el siguiente resultado:

Here isMr.   Rowan          Atkinson       
A big hello from Mr. Bean

Concatenación de cadenas

El operador de concatenación // concatena cadenas.

El siguiente ejemplo demuestra esto:

program hello
implicit none

   character(len = 15) :: surname, firstname 
   character(len = 6) :: title 
   character(len = 40):: name
   character(len = 25)::greetings
   
   title = 'Mr.' 
   firstname = 'Rowan' 
   surname = 'Atkinson'
   
   name = title//firstname//surname
   greetings = 'A big hello from Mr. Beans'
   
   print *, 'Here is', name
   print *, greetings
   
end program hello

Cuando compila y ejecuta el programa anterior, produce el siguiente resultado:

Here is Mr. Rowan Atkinson       
A big hello from Mr. Bean

Extraer subcadenas

En Fortran, puede extraer una subcadena de una cadena indexando la cadena, dando el índice inicial y final de la subcadena en un par de corchetes. Esto se denomina especificador de extensión.

El siguiente ejemplo muestra cómo extraer la subcadena 'mundo' de la cadena 'hola mundo' -

program subString

   character(len = 11)::hello
   hello = "Hello World"
   print*, hello(7:11)
   
end program subString

Cuando compila y ejecuta el programa anterior, produce el siguiente resultado:

World

Ejemplo

El siguiente ejemplo usa el date_and_timefunción para dar la cadena de fecha y hora. Usamos especificadores de extensión para extraer la información de año, fecha, mes, hora, minutos y segundos por separado.

program  datetime
implicit none

   character(len = 8) :: dateinfo ! ccyymmdd
   character(len = 4) :: year, month*2, day*2

   character(len = 10) :: timeinfo ! hhmmss.sss
   character(len = 2)  :: hour, minute, second*6

   call  date_and_time(dateinfo, timeinfo)

   !  let’s break dateinfo into year, month and day.
   !  dateinfo has a form of ccyymmdd, where cc = century, yy = year
   !  mm = month and dd = day

   year  = dateinfo(1:4)
   month = dateinfo(5:6)
   day   = dateinfo(7:8)

   print*, 'Date String:', dateinfo
   print*, 'Year:', year
   print *,'Month:', month
   print *,'Day:', day

   !  let’s break timeinfo into hour, minute and second.
   !  timeinfo has a form of hhmmss.sss, where h = hour, m = minute
   !  and s = second

   hour   = timeinfo(1:2)
   minute = timeinfo(3:4)
   second = timeinfo(5:10)

   print*, 'Time String:', timeinfo
   print*, 'Hour:', hour
   print*, 'Minute:', minute
   print*, 'Second:', second   
   
end program  datetime

Cuando compila y ejecuta el programa anterior, proporciona la información detallada de fecha y hora:

Date String: 20140803
Year: 2014
Month: 08
Day: 03
Time String: 075835.466
Hour: 07
Minute: 58
Second: 35.466

Recortar cuerdas

los trim La función toma una cadena y devuelve la cadena de entrada después de eliminar todos los espacios en blanco finales.

Ejemplo

program trimString
implicit none

   character (len = *), parameter :: fname="Susanne", sname="Rizwan"
   character (len = 20) :: fullname 
   
   fullname = fname//" "//sname !concatenating the strings
   
   print*,fullname,", the beautiful dancer from the east!"
   print*,trim(fullname),", the beautiful dancer from the east!"
   
end program trimString

Cuando compila y ejecuta el programa anterior, produce el siguiente resultado:

Susanne Rizwan      , the beautiful dancer from the east!
 Susanne Rizwan, the beautiful dancer from the east!

Ajuste izquierdo y derecho de cuerdas

La función adjustl toma una cadena y la devuelve eliminando los espacios en blanco iniciales y agregándolos como espacios en blanco finales.

La función adjustr toma una cadena y la devuelve quitando los espacios en blanco finales y agregándolos como espacios en blanco iniciales.

Ejemplo

program hello
implicit none

   character(len = 15) :: surname, firstname 
   character(len = 6) :: title 
   character(len = 40):: name
   character(len = 25):: greetings
   
   title = 'Mr. ' 
   firstname = 'Rowan' 
   surname = 'Atkinson'
   greetings = 'A big hello from Mr. Beans'
   
   name = adjustl(title)//adjustl(firstname)//adjustl(surname)
   print *, 'Here is', name
   print *, greetings
   
   name = adjustr(title)//adjustr(firstname)//adjustr(surname)
   print *, 'Here is', name
   print *, greetings
   
   name = trim(title)//trim(firstname)//trim(surname)
   print *, 'Here is', name
   print *, greetings
   
end program hello

Cuando compila y ejecuta el programa anterior, produce el siguiente resultado:

Here is Mr. Rowan  Atkinson           
A big hello from Mr. Bean
Here is Mr. Rowan Atkinson    
A big hello from Mr. Bean
Here is Mr.RowanAtkinson                        
A big hello from Mr. Bean

Buscando una subcadena en una cadena

La función de índice toma dos cadenas y comprueba si la segunda cadena es una subcadena de la primera cadena. Si el segundo argumento es una subcadena del primer argumento, devuelve un número entero que es el índice inicial de la segunda cadena en la primera cadena, de lo contrario, devuelve cero.

Ejemplo

program hello
implicit none

   character(len=30) :: myString
   character(len=10) :: testString
   
   myString = 'This is a test'
   testString = 'test'
   
   if(index(myString, testString) == 0)then
      print *, 'test is not found'
   else
      print *, 'test is found at index: ', index(myString, testString)
   end if
   
end program hello

Cuando compila y ejecuta el programa anterior, produce el siguiente resultado:

test is found at index: 11