home *** CD-ROM | disk | FTP | other *** search
- 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 assume. Look at
- the Pascal program ENTYPES 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. 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 "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 for our output, 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 and each day. The data
- is formatted carefully to make a nice looking table of pay
- rates as a function of "time" and "day".
-
-
-
-
- Page 35
-
-
-
-
-
-
-
-
-
- CHAPTER 8 - Scalars, subranges, and sets.
-
-
- 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.
-
- LETS LOOK AT SOME SUBRANGES
-
- Examine the program SUBRANGE for an example of
- subranges. 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
- runtime 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.
-
- 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 first part of the
- program 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 in the rest. The
- errors are self explanatory.
-
- There are seven assignment statements as examples of
- subrange variable use. Notice that the variable "day" can
-
-
- Page 36
-
-
-
-
-
-
-
-
-
- CHAPTER 8 - Scalars, subranges, and sets.
-
-
- 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 for the others.
-
- THREE VERY USEFUL FUNCTIONS
-
- The last section of the example program demonstrates 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, that is 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 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, and
- 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,
- or scalar.
-
- SETS
-
- Now for a new topic, sets. Examining the example Pascal
- program SETS will 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
-
-
- Page 37
-
-
-
-
-
-
-
-
-
- CHAPTER 8 - Scalars, subranges, and sets.
-
-
- or alphabetic value as most other variables have.
- Continuing in the program, 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. 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. 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. 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.
-
- This example resulted 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 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
- 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, is a repeat of one already found, or
- is a new one 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 to search for upper-case letters.
-
-
-
-
- Page 38
-