Fortran - ciągi
Język Fortran może traktować znaki jako pojedyncze znaki lub ciągłe ciągi.
Ciąg znaków może mieć tylko jeden znak lub może nawet mieć zerową długość. W języku Fortran stałe znakowe są podawane między dwoma podwójnymi lub pojedynczymi cudzysłowami.
Wewnętrzny typ danych characterprzechowuje znaki i ciągi. Długość ciągu można określić za pomocąlen specifier. Jeśli nie określono długości, jest to 1. Możesz odnosić się do poszczególnych znaków w ciągu, odwołując się do pozycji; skrajny lewy znak znajduje się na pozycji 1.
Deklaracja ciągu
Zadeklarowanie łańcucha jest takie samo jak w przypadku innych zmiennych -
type-specifier :: variable_name
Na przykład,
Character(len = 20) :: firstname, surname
możesz przypisać wartość taką jak,
character (len = 40) :: name
name = “Zara Ali”
Poniższy przykład demonstruje deklarację i użycie typu danych znakowych -
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
Kiedy kompilujesz i wykonujesz powyższy program, daje to następujący wynik -
Here isMr. Rowan Atkinson
A big hello from Mr. Bean
Konkatenacja ciągów
Operator konkatenacji // łączy łańcuchy.
Poniższy przykład demonstruje to -
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
Kiedy kompilujesz i wykonujesz powyższy program, daje to następujący wynik -
Here is Mr. Rowan Atkinson
A big hello from Mr. Bean
Wyodrębnianie podciągów
W języku Fortran możesz wyodrębnić podciąg z łańcucha, indeksując go, podając indeks początkowy i końcowy podciągu w parze nawiasów. Nazywa się to specyfikatorem zakresu.
Poniższy przykład pokazuje, jak wyodrębnić podciąg „world” z ciągu „hello world” -
program subString
character(len = 11)::hello
hello = "Hello World"
print*, hello(7:11)
end program subString
Kiedy kompilujesz i wykonujesz powyższy program, daje to następujący wynik -
World
Przykład
Poniższy przykład używa date_and_timefunkcję, aby podać ciąg daty i godziny. Używamy specyfikatorów zakresu, aby oddzielnie wyodrębnić rok, datę, miesiąc, godzinę, minuty i sekundy.
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
Kiedy kompilujesz i uruchamiasz powyższy program, podaje on szczegółowe informacje o dacie i godzinie -
Date String: 20140803
Year: 2014
Month: 08
Day: 03
Time String: 075835.466
Hour: 07
Minute: 58
Second: 35.466
Przycinanie sznurków
Plik trim funkcja przyjmuje ciąg znaków i zwraca ciąg wejściowy po usunięciu wszystkich końcowych spacji.
Przykład
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
Kiedy kompilujesz i wykonujesz powyższy program, daje to następujący wynik -
Susanne Rizwan , the beautiful dancer from the east!
Susanne Rizwan, the beautiful dancer from the east!
Regulacja strun w lewo i w prawo
Funkcja adjustl pobiera ciąg i zwraca go, usuwając początkowe spacje i dołączając je jako końcowe spacje.
Funkcja adjustr pobiera ciąg i zwraca go, usuwając końcowe spacje i dołączając je jako początkowe spacje.
Przykład
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
Kiedy kompilujesz i wykonujesz powyższy program, daje to następujący wynik -
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
Wyszukiwanie podłańcucha w łańcuchu
Funkcja indeksu pobiera dwa ciągi i sprawdza, czy drugi ciąg jest podłańcuchem pierwszego. Jeśli drugi argument jest podłańcuchem pierwszego argumentu, zwraca liczbę całkowitą, która jest początkowym indeksem drugiego ciągu w pierwszym ciągu, w przeciwnym razie zwraca zero.
Przykład
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
Kiedy kompilujesz i wykonujesz powyższy program, daje to następujący wynik -
test is found at index: 11