Category : Pascal Source Code
Archive   : PASTUT.ZIP
Filename : CHAP08.TXT

 
Output of file : CHAP08.TXT contained in archive : PASTUT.ZIP



Chapter 8
SCALARS, SUBRANGES, AND SETS


PASCAL SCALARS
____________________________________________________________

A scalar, also called an enumerated type, =================
is a list of values which a variable of ENTYPES.PAS
that type may assume. Look at 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, then Day is 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, 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

Page 8-1

Scalars, Subranges, and Sets

and each day. 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 SUBRANGE.PAS
instruction on 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

Page 8-2

Scalars, Subranges, and Sets

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 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.




Page 8-3

Scalars, Subranges, and Sets

SETS
____________________________________________________________

Now for a new topic, sets. Examining the ================
example Pascal program SETS.PAS will SETS.PAS
reveal some 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 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 4 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 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

Page 8-4

Scalars, Subranges, and Sets

char, we do not need to define a scalar ================
before defining the set, we can define the FINDCHRS.PAS
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.

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


  3 Responses to “Category : Pascal Source Code
Archive   : PASTUT.ZIP
Filename : CHAP08.TXT

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/