Structured Data Types
Date Types
•
We
have seen various data types
– Integer, Real,
Character, Logical
•
All
these types define data values of different kinds
– 128, 4500, 1, 0
(Integer)
– 0.5E19, 28.0,
0.214141E2 (Real)
– hari,maithoo,cs101,
fortran (character strings)
– .True., .False.
(logical)
•
The
Data types define, besides values,
– operations, relations
and intrinsic functions
•
A
summary given here - refer to books/manuals for details
Numerical Data Types
Constants: 127, - 456, 12.76, 56.7 E
10, - 0.12E-23
Note: decimal points in mantissa but
not in exponent
no commas allowed
12,23,600
Operations: +,*,/,-
Relations: >,<,>=,<=,==,/=
Intrinsic Functions:
Real, Nint,Int, Abs, Mod, Exp,Log,
Sign, Sin, Cos, Sinh,Cosh, …
Character Data Types
Constants: ABabDf, Fortran, CS101
Note: capital and small letters
distinguished
Operations: //, (n:m)
Relations: equality operators, ==, /=
Other comparison operators: < , <=, >, >=
ASCII encoding: 8 bit encoding of characters
A is 65, B is 66, etc
a is 97, b is 98 etc
Lexicographic Ordering
Collating Sequence: order in which
characters occur in
ASCII set
Relation over individual characters
based upon the collating sequence order
eg. A < E, Z < a, d < s
How to compare strings?
– Dictionary ordering (Lexicographic
ordering)
– eg.
AAA < AAB, AAA < AAAA,
AAAA < AB
Intrinsic Functions: Trim, Len,
Logical Data Types
Constants: .true., .false.
Operations: .not., .and.,.or.,.equiv,
.nequiv.
Structured Data
•
All
these data types (except character) are atomic
– values are simple and non composite
– scalar data types
•
Many
real life entities are organized (or structured) collections of simpler data
values:
–
students,
accounts, employees (records with constituent items)
– pack of cards, tables, vectors, matrices
– queues, stacks, graphs
•
Referring
to the constituent data values rather than the whole
– results in loss of abstraction and clarity
– cumbersome
Structured Data Types
• Modern PL enable design of rich set of
structured data types to represent structured data
• They provide constructs using which
complex and structured data types can be built from scalar types
• A PL provides
– fixed primitive types for
representation of simple data value
– constructs for building organized
collection from primitive types
• hence called user defined data types
Single Dimensional Arrays
•
Array
is one of the simplest and most often used structure
•
Examples: Vectors,
list of students ordered by roll
numbers, array of
cars in a parking lot
•
Array
data type is provided to represent such data
•
Typical
array values are:
– (32, 45, 67, 100, 780) - integer array
– (4.50, 345.0E10, 28.25E-12) - real array
– (Fortran, Pascal, C, C++, ADA) - character array
– (.true., .false., .true., .false., .false., .true., .true.) –
logical array
Properties of Arrays
• All entries in an array are values of identical types
• The data values are of some type, called the base type
• An array can contain one or more number of entries
• Every entry is associated with an index
• By default, the index of the first entry is 1, that of
second 2, etc
• The number of entries is called the size or length of the
array
• Any entry can be accessed directly by indicating its index –
hence called random access data structure
• Arrays are called
single dimensional
Example
• Let MARKS be an array (32,24,49,20,0)
– base type of MARKS is integer
– size or length of the array is 5
– MARKS(5) is 0 while MARKS(2) is 24
• Let Planets = (Venus, Earth, Mars, Saturn, Uranus, Neptune, Pluto)
– base type is character
– length is 7
– Planets(4) is Saturn
Array Declarations
• Program Variables can store array values like any other
basic values
• Typical declarations:
– Integer, Dimension(5) :: Marks
– Character(len=8), Dimension(7)::
Planets
• base type and length
mentioned in declarations
• The index of these arrays, also called as subscripts, start
from 1 and end in the number specified
• The subscripts can start anywhere and end anywhere; they
should be specified then
– Integer, Dimension(-8:10):: Students
– specifies the subscripts of Students to
range from -8 to 10
Array References
• Arrays can be referred in statements
either as a whole or individually
• Individual array elements are like any
other variable of the base type
• They can appear anywhere where the
variables can appear, eg.
– Students(2) = 5
– Marks(5) = Students(2) * 10
– Students(i) = Student(i+1)
– Passed(j) = .TRUE.
– Planets(k) = Jupiter
– if (Students(i) > 0) then
• Type matching same as variables of the
base type
Whole array references
•
The
whole array variable can also appear on both rhs and lhs, eg.
– Planets = (/ Mars,Earth,Pluto,Neptune,Venus,Jupiter /)
– Marks = Students
•
These
are whole array assignments; the types of both lhs and rhs should match
•
Types
of two array valued expressions match provided
– they evaluate to arrays
– of the same size and base type
– subscript ranges may be different
•
The
same constant value can be assigned to all elements of an array
– Passed = .FALSE.
– All the array entries are assigned the value false; useful
for initialization
Array Initialization
• Arrays can be initialized at
declarations, eg.
– integer, dimension(10) :: a = (/ 0,1,2,3,4,5,6,7,8,9 /)
– initializes array a to
(0,1,2,3,4,5,6,7,8,9)
• Implied do loop (Shorthand notation for
loops) can be used for initialization, eg.
– a = (/ (2*i, i=1,10) /) ! i must be
declared before use
– a=
(/ (i,i, i = 1,10,2) /)
• a is
1,1,3,3,5,5,7,7,9,9
Reading/Writing of Arrays
• Arrays may be read or printed as a whole, eg.
– read *, a
– print *, a
• Values input/output on a single line
• Implied do loops may also be used, eg.
– read *, (a(i), i = 1,n)
– values of a(1) to a(n), read on one
line
Array Sections
• Arrays can be
referred as a whole, per entry or even in parts
• Parts of the
arrays can be referred using sections, eg
– Given
an array Ex declared as follows
integer dimension(100), Ex
– Ex(8:89:2)
- part of the array
Ex(8),Ex(10),...,Ex(88)
– Ex(10:50) - references Ex(10),Ex(11),...,Ex(50)
– Ex(28::5) - refer to Ex(28),Ex(33),...,Ex(98)
– Ex(28:2)
- null array
– Ex(1:100)
- whole section, referred directly as Ex itself
Array Bounds
•
Every
array has bounds - lower and upper bounds
•
The
above array Ex has 1 as lower bound and 100 as upper bound
•
Ex(i)
is defined provided 1 <= i <= 100
•
Any
reference to Ex(-25) or Ex(111) is illegal and may produce unknown results
•
A
reference is illegal or not can be detected,in general, at run-time only
•
Ex(j)
exceeds bound or not depends on value of j - not known at compile time
•
Fortran
compiler provides the option of detecting (at run-time) of array index
exceeding bounds
•
If
this option is on, it inserts code, which can produce run-time errors
•
If
off, you have the responsibility for illegal references
Operations on Arrays
• Array assignments involve expressions involving whole arrays
• Operations are defined over arrays depending upon the base
type
• Operations are `lifted' from the base type
– arithmetic operations over real and
integer arrays
– logical operations over logical arrays
• Operations apply `point wise' to the array entries
• Arrays involved should be of the same size
Example
integer, dimension(50) :: A, B
integer, dimension(51:100) :: C
read *, A, B ! reads 100
values (A followed by B)
C = 2*A + B + 5 ! C(i) = 2*A(i) +
B(50+i) + 5
• operation is applied to corresponding elements in “parallel”
• similar to component wise vector addition
• other arithmetic operations (except **) applied similarly
• scalar operation performed on each element
Relational Operators
• whole array or array sections can be compared using
relational operator
• As usual, type and size constraints need to respected
• Comparison to scalars also possible
• Example:
integer, dimension(50) :: a, b
logical, dimension(50) :: c
c = (a < b) .and. ( a > a(1))
! c(i) is .true. iff a(i) < b(i) and a(i) > a(1),
1<=i <=50
• similarly for other
relational operators
Intrinsic Functions
• Many intrinsic functions
available for arrays
• `Lifting' of Intrinsic functions of base type to arrays
• functions of integers and reals can be applied to integer or
real arrays
• functions applied pointwise - to all elements separately
– size(a): number of elements in array a
– maxval(a) and minval(a)
• maximum and minimum value in integer or
real array a
Intrinsic Functions (contd.)
• sum(a),
product(a)
– sum or product of elements of integer or real
array a
• dot_product(a,b)
– dot product of two vectors of same size
• Array
operations and intrinsic functions makes program more readable
• More
efficient also, as operations can be done in parallel