


                                                        Chapter 8
                                     SCALARS, SUBRANGES, AND SETS


PASCAL SCALARS
_________________________________________________________________

A scalar, also called an enumerated type, is a    ===============
list of values which a variable of that type may    ENTYPES.PAS
assume.  Examine the Pascal program ENTYPES.PAS   ===============
for an example of some scalars.  The first type
declaration defines Days as being a type which
can take on any one of seven values.  Since, within the var
declaration, Day is assigned the type of Days, Day is then a
variable which can assume any one of seven different values. 
Moreover Day can be assigned the value Mon, or Tue, etc., which is
considerably clearer than using 0 to represent Monday, 1 for
Tuesday, etc.  This makes the program easier to follow and
understand.  

Internally, Pascal does not actually assign the value Mon to the
variable Day, but it uses an integer representation for each of the
names.  This is important to understand because you need to realize
that you cannot print out Mon, Tue, etc., but can only use them for
indexing control statements.

The second line of the type definition defines Time_Of_Day as
another scalar which can have any of four different values, namely
those listed.  The variable Time can only be assigned one of four
values since it is defined as the type Time_Of_Day.  It should be
clear that even though it can be assigned Morning, it cannot be
assigned Morning_time or any other variant spelling of Morning,
since it is simply another identifier which must have an exact
spelling to be understood by the compiler.  Several real variables
are defined to allow us to demonstrate the use of the scalar
variables.  After writing a header in lines 16 through 20, the real
variables are initialized to some values that are probably not real
life values, but will serve to illustrate the scalar variable.


A BIG SCALAR VARIABLE LOOP
_________________________________________________________________

The remainder of the program is one large loop being controlled by
the variable Day as it goes through all of its values, one at a
time.  Note that the loop could have gone from Tue to Sat or
whatever portion of the range desired.  It does not have to go
through all of the values of Day.  Using Day as the case variable
of a case statement, the name of one of the days of the week is
written out each time we go through the loop.  Another loop
controlled by Time is executed four times, once for each value of
Time.  The two case statements within the inner loop are used to
calculate the total pay rate for each time period and each day. 

                                                         Page 8-1

                            Chapter 8 - Scalars, Subranges & Sets

The data is formatted carefully to make a nice looking table of pay
rates as a function of Time and Day.

Take careful notice of the fact that the scalar variables never
entered into the calculations, and they were not printed out.  They
were only used to control the flow of logic.  It was much neater
than trying to remember that Mon is represented by a 0, Tue is
represented by a 1, etc.  In fact, those numbers are used for the
internal representation of the scalars but we can relax and let
Pascal worry about the internal representation of our scalars. 
Compile and run this program and observe the output.


LET'S LOOK AT SOME SUBRANGES
_________________________________________________________________

Examine the program SUBRANGE.PAS for an example  ================
of subranges and some additional instruction on    SUBRANGE.PAS
scalar variables.  It may be expedient to define ================
some variables that only cover a part of the
full range as defined in a scalar type.  Notice
that Days is declared a scalar type as in the last program, and
Work is declared a type with an even more restricted range.  In the
var declaration, Day is once again defined as the days of the week
and can be assigned any of the days by the program.  The variable
Workday, however, is assigned the type Work, and can only be
assigned the days Mon through Fri.  If an attempt is made to assign
Workday the value Sat, a run-time error will be generated.  A
carefully written program will never attempt that, and it would be
an indication that something is wrong with either the program or
the data.  This is one of the advantages of Pascal over older
languages and is a reason for the relatively strong type checking
built into the language.

Further examination will reveal that Index is assigned the range
of integers from 1 through 12.  During execution of the program,
if an attempt is made to assign Index any value outside of that
range, a run time error will be generated.  Suppose the variable
Index was intended to refer to your employees, and you have only
12.  If an attempt was made to refer to employee number 27, or
employee number -8, there is clearly an error somewhere in the data
and you would want to stop running the payroll to fix the problem. 
Pascal would have saved you a lot of grief.


SOME STATEMENTS WITH ERRORS IN THEM.
_________________________________________________________________

In order to have a program that would compile without errors, and
yet show some errors, the section of the program in lines 16
through 27 is not really a part of the program since it is within
a comment area.  This is a trick to remember when you are debugging
a program, a troublesome part can be commented out until you are
ready to include it with the rest of the code.  The errors are self

                                                         Page 8-2

                            Chapter 8 - Scalars, Subranges & Sets

explanatory and it would pay for you to spend enough time to
understand each of the errors.

There are seven assignment statements as examples of subrange
variable use in lines 29 through 35.  Notice that the variable Day
can always be assigned the value of either Workday or Weekend, but
the reverse is not true because Day can assume values that would
be illegal to assign to the others.


THREE VERY USEFUL FUNCTIONS
_________________________________________________________________

Lines 37 through 42 of the example program demonstrate the use of
three very important functions when using scalars.  The first is
the Succ function that returns the value of the successor to the
scalar used as an argument, the next value.  If the argument is the
last value, a run time error is generated.  The next function is
the Pred function that returns the predecessor to the argument of
the function.  Finally the Ord function which returns the ordinal
value of the scalar.  

All scalars have an internal representation starting at 0 and
increasing by one until the end is reached.  In our example
program, Ord(Day) is 5 if Day has been assigned Sat, but
Ord(Weekend) is 0 if Weekend has been assigned Sat.  As you gain
experience in programming with scalars and subranges, you will
realize the value of these three new functions.

A few more thoughts about subranges are in order before we go on
to another topic.  A subrange is always defined by two predefined
constants, and is always defined in an ascending order.  A variable
defined as a subrange type is actually a variable defined with a
restricted range.  Good programming practice would dictate that
subranges should be used as often as possible in order to prevent
garbage data.  There are actually very few variables ever used that
cannot be restricted by some amount.  The limits may give a hint
at what the program is doing and can help in understanding the
program operation.  Subrange types can only be constructed using
the simple types, integer, char, byte, or scalar.

Compile and run this program even though it has no output.  Add
some output statements to see what values some of the variables
assume.


SETS
_________________________________________________________________

Now for a new topic, sets.  Examining the          ==============
example Pascal program SETS.PAS will reveal some      SETS.PAS
sets.  A scalar variable is defined first, in      ==============
this case the scalar type named Goodies.  A set
is then defined with the reserved words set of

                                                         Page 8-3

                            Chapter 8 - Scalars, Subranges & Sets

followed by a predefined scalar type.  Several variables are
defined as sets of Treat, after which they can individually be
assigned portions of the entire set.

Consider the variable Ice_Cream_Cone which has been defined as a
set of type Treat.  This variable is composed of as many elements
of Goodies as we care to assign to it.  In the program, we define
it as being composed of Ice_Cream, and Cone.  The set
Ice_Cream_Cone is therefore composed of two elements, and it has
no numerical or alphabetic value as most other variables have.  

In lines 21 through 26, you will see four more delicious deserts
defined as sets of their components.  Notice that the banana split
is first defined as a range of terms, then another term is added
to the group illustrating how you can add to a set.  All five are
combined in the set named Mixed, then Mixed is subtracted from the
entire set of values to form the set of ingredients that are not
used in any of the deserts.  Each ingredient is then checked to see
if it is in the set of unused ingredients, and printed out if it
is.  Note that in is another reserved word in Pascal.  Running the
program will reveal a list of unused elements.

In this example, better programming practice would have dictated
defining a new variable, possibly called Remaining for the
ingredients unused in line 32.  It was desirable to illustrate that
Mixed could be assigned a value based on subtracting itself from
the entire set, so the poor variable name was used.

When you compile and run this program you will see that this
example results in some nonsense results but hopefully it led your
thinking toward the fact that sets can be used for inventory
control, possibly a parts allocation scheme, or some other useful
system.



SEARCHING WITH SETS
_________________________________________________________________

The Pascal program FINDCHRS.PAS is more useful   ================
than the last one.  In it we start with a short    FINDCHRS.PAS
sentence and search it for all lower case        ================
alphabetic letters and write a list of those
used.  Since we are using a portion of the
complete range of char, we do not need to define a scalar before
defining the set, we can define the set using the range 'a'..'z'. 
The set Data_Set is assigned the value of no elements in the first
statement of the program, and the print string, named Print_Group,
is set to blank in the next.  The variable Storage is assigned the
sentence to search, and the search loop is begun.  Each time
through the loop, one of the characters is checked.  It is either
declared as a non-lower-case character, as a repeat of one already
found, or as a new character to be added to the list.


                                                         Page 8-4

                            Chapter 8 - Scalars, Subranges & Sets

You are left to decipher the details of the program, which should
be no problem since there is nothing new here.  Run the program and
observe how the list grows with new letters as the sentence is
scanned.



PROGRAMMING EXERCISE
_________________________________________________________________

1.   Modify FINDCHRS.PAS to search for upper-case letters.












































                                                         Page 8-5
