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