Download presentation
Presentation is loading. Please wait.
Published byDoreen Richard Modified over 8 years ago
1
Structures or Derived Types
2
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)
3
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
4
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)
5
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
6
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
7
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++)
8
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
9
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
10
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
11
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
12
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
13
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
14
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)
15
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
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.