Structures or Derived Types Real Life Objects Often

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) Integer Real Character(len=10) logical Real logical end type Cricketer : : : : Name Age Height Country in_action ave_score bowler

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): : team 1 character(len=10): : team 2 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(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: : a 1 = (3. 1410, - 2. 3456) • declares a 1 to be of type complex with given real and imaginary parts

Accessing components • Complex numbers can be read or written component-wise complex: : a 1 read*, a 1 • requires input to be (2. 345, 6. 7890) • Print command also outputs in the same way • To assign a variable, use a 1 = complex(a, b) • a 1 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_c 1, x_c 2 = (0. 0, 0. 0) real, parameter : : eps = 1. 0 e-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_c 1 = (x_r + Sqrt( Cmplx(disc, 0. 0))/(2. 0*a)) x_c 2 = (x_r - Sqrt( Cmplx(disc, 0. 0))/(2. 0*a)) print *, Real(x_c 1), "+ i", Aimag(x_c 1) print *, Real(x_c 2), "- i", Aimag(x_c 2) endif end program quadratic
- Slides: 15