Structures
or Derived Types
Real Life Objects
• Often structured
– Students, Employees, Cars, Accounts,
Cricket matches, flats etc
• contain heterogeneous sub-objects
– Students
• Name (string),
• Age (integer in [15, 65],)
• Height (real),
• CPI (real number in [1,10])
– Car
• Weight (Real), Volume (Real),
• Make (String), Seating
capacity(Integer) ,
• Year of make (integer)
Arrays
• Two Structured Data Types
• Arrays and Character strings
– Both are homogeneous:
• components are of identical type
– Accessing a component through indices
• not very natural
•
More natural data types
desirable
Derived Data Types
• Fortran's solution to representing general structured data
• Heterogeneous collection of data values
• Components identified directly by names rather than indices
• Generalized random access
• Derived data type objects called structures (in C ) and
Records (Pascal)
Example
Type :: Cricketer
Character(len=25) :: Name
Integer ::
Age
Real ::
Height
Character(len=10) ::
Country
logical ::
in_action
Real ::
ave_score
logical
:: bowler
end type Cricketer
Structure variables
• Variables declared to be of a derived type
• Similar syntax used, eg.
– Type (Cricketer)::
indian_top_scorer_01,
england_captain_99,
aussie_keeper_74
– Type (Cricketer), Dimension(15):: Indian_Team_02
• The latter is an array of structures or records
Initialization
Indian_top_scorer_01 = Cricketer("Tendulkar", 29, 5.2,
"India",
.true. ... )
England_captain_02 = Cricketer("Hussain", 24, 5.6,
"England", .true. , ... )
• Structure Constructor operation(inspired by C++)
Accessing the Components
• The components of a structure (a variable of derived type)
can be accessed by the names
top_scorer%height
captain%ave_score
Indian_Team_02(i)%ave_score
• Each of these is like a variable of appropriate type
• can appear wherever such variables can occur
– top_scorer%height = 5.
– if (captain%ave_score > 25) then
– top_scorer%ave_score = …
– Int(captain%ave_score) + 26
– Indian_Team_02(i)%ave_score <
Eng_Team_02(i)%ave_score
Structure inside structure
• Components can be intrinsic types or even other derived
types
Type:: team_pair
character(len=10):: team1
character(len=10):: team2
end type team_pair
Type:: match
type(team_pair):: teams
Integer:: date
Character(len=10):: ground
Character(len=10):: country
end type match
Type:: cricketer
...
type(match)::
top_score_match
...
end type cricketer
Component Selection
• Any component can be selected using series of component
selectors
Eg.
eng_captain%topscore_match%ground = “Lords”
• Recursive Structures
– One of the component can be of the
parent type itself!
• More on this later
Program structure
Type:: cricketer
Character(len=15):: name,country
real:: average
integer:: top_score
end type
type(cricketer), dimension(15):: natwest_series_team
character(len=15):: player
real:: average
integer:: i
read *, natwest_series_team
read *, player
do i = 1, 15
if
(trim(natwest_series_team(i)%name) == player) then
average =
natwest_series_team(i)%average
print *, average
exit
endif
end do
Complex Data Types
• Complex data types can be defined as structured data types
type :: Compx
real:: re_part
real:: im_part
end type Compx
type(Compx):: xyz
• But direct support is available in Fortran 90
• Complex data type is an intrinsic type
Complex:: a1 = (3.1410, - 2.3456)
• declares a1 to be of type complex with given real and
imaginary parts
Accessing components
• Complex numbers can be read or written
component-wise
complex:: a1
read*, a1
• requires input to be (2.345, 6.7890)
• Print command also outputs in the same
way
• To assign a variable, use
a1 = complex(a,b)
• a1 will get the value (a,b)
• Kind parameter is an optional parameter
Intrinsic Functions
• Real(), Int() - throws the imaginary
part and converts the real part to real or integer data types
• Aimag() - converts the imaginary part
to a real number
• Cabs(c) - absolute value of c
= sqrt(a^2 + b^2)
Example
program quadratic
implicit none
real :: a, b, c, disc, x_r
complex:: x_c1,x_c2 = (0.0, 0.0)
real, parameter :: eps = 1.0e-6
read *, a, b, c
if (a == 0.0) then
! a is 0, not a quadratic
equation
print *, "equation is not
quadratic"
else
disc = b*b - 4.0*a*c
x_r = -b/(2.0*a)
if ( abs(disc) < eps
) then
! discriminant is
nearly zero
print *,
"double real root", x_r
else
x_c1 = (x_r +
Sqrt( Cmplx(disc,0.0))/(2.0*a))
x_c2 = (x_r - Sqrt( Cmplx(disc,0.0))/(2.0*a))
print *, Real(x_c1),"+ i", Aimag(x_c1)
print *,
Real(x_c2),"- i", Aimag(x_c2)
endif
endif
end program quadratic