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

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



Chapter 5
PROCEDURES AND FUNCTIONS


A PASCAL PROGRAM OUTLINE
____________________________________________________________

In order to properly define procedures and functions we need
to lay some groundwork in the form of a few definitions.
These are important concepts, so pay close attention. Every
Pascal program is composed of three fundamental parts which
can be defined as follows.

Program Heading - This is the easiest part since it is only
one line, at least it has been in all of our programs up
to this point. It is simply the program line, and it
never needs to be any more involved or complicated than
it has been up to this point in TURBO Pascal. You may
remember that we said it is not even necessary in TURBO
Pascal.

Declaration Part - This is the part of the Pascal source code
in which all constants, variables, and user defined
auxiliary operations are defined. In some of the
programs we have examined, there have been one or more
var declarations. These are the only components of the
declaration part we have used to this point. There are
actually five components in the declaration part, and
procedures and functions which are the topics of this
chapter, are the fifth part. We will cover the other
components in the next chapter.

Statement Part - This is the last part of any Pascal program,
and it is what we have been calling the main program.
It is one compound statement bracketed with the reserved
words begin and end. Note that neither of these two
words are optional since both are required to have a
Pascal program.

It is very important that you grasp the above definitions
because we will be referring to them constantly during this
chapter and throughout the remainder of this tutorial. With
that introduction, let's go on to our first Pascal program
with a procedure in it, in fact it will have three procedures.


THE FIRST PROCEDURES
____________________________________________________________

Load PROCED1.PAS as your first example =================
program with a procedure and display it on PROCED1.PAS
your monitor. You will notice that it =================
doesn't look like anything you have seen
up to this point because it has procedures

Page 5-1

Procedures and Functions

in it. Lets go back to our definitions from above. The first
line is the Program Heading which should pose no difficulty.
The Declaration Part begins with the var statement in line 4
and continues down through and including all three procedures
ending in line 19. Lines 21 through 26 constitute the
Statement Part. It may seem strange that what appears to be
executable Pascal statements, and indeed they are executable
statements, are contained in the Declaration Part rather than
the Statement Part. This is because of the Pascal definition
and it will make sense when we have completed our study of
procedures and functions.

Continuing to examine PROCED1.PAS, we will make note of the
program itself, which is the Statement Part. The program, due
to the nature of Pascal and the carefully chosen procedure
names, clearly tells us what it will do. It will write a
header, eight messages, and an ending. The only problem we
are faced with is, how will it write these messages? This is
where the Declaration Part is called upon to define these
operations in detail. The Declaration Part contains the three
procedures which will completely define what is to be done by
the procedure calls in the main program.


DEFINITIONS GO IN THE DEFINITION PART
____________________________________________________________

It should be clear to you that the definitions of the
procedures should be in the Definition Part of the program
because that is exactly what they do. In the case of a var,
a variable is defined for later use by the main program, and
in the case of a procedure, the procedure itself is defined
for later use by the main program.

Let's arbitrarily pick one of the procedures, the first, and
examine it in detail. The first executable statement we come
to in the main program is line 22 and says simply,
Write_A_Header, followed by the usual statement separator, the
semicolon. This is a simple procedure call. When the
compiler finds this statement, it goes looking for a
predefined procedure of that name which it can execute. If
it finds one in the Declaration Part of the program, it will
execute that procedure. If it doesn't find a user defined
procedure, it will search the Pascal library for a system
defined procedure and execute it. The Write and Writeln
statements are system procedures, and you have already been
using them quite a bit, so procedures are not completely new
to you. If the compiler doesn't find the procedure defined
in either place, it will generate an error message. Depending
on which version of TURBO Pascal you are using, the system may
search several libraries to find the procedures called by the
program. Much more will be said about this later in this
tutorial.


Page 5-2

Procedures and Functions

HOW TO DEFINE & CALL A PROCEDURE
____________________________________________________________

To call a procedure, we simply need to state its name. To
define a simple procedure, we use the reserved word procedure
followed by its calling name, with a semicolon as a
terminator. Following the Procedure Heading, there is the
Declaration Part of the procedure followed by a body which is
nothing more than a compound statement bracketed by the
reserved words begin and end. This is identical to the
Statement Part of the main program except that the procedure
ends with a semicolon instead of a period. Any valid Pascal
statements can be put between the begin and end, and in fact,
there is no difference in what can be put in a procedure and
what can be put in the main program.

The program we are examining would be no different if we would
eliminate the first procedure completely and move the Writeln
contained in it down to the Statement Part in place of
Write_A_Header. If that is not clear, go back and reread the
last two paragraphs until it is.

Lines 23 and 24 will cause the procedure named Write_A_Message
to be called 8 times, each time writing a line of output to
the monitor. Suffice it to say at this time, that the value
of the variable Count, as defined here, is available globally,
meaning anywhere in the entire Pascal program. We will define
the scope of variables shortly. Finally, the last procedure
call is made, causing the ending message to be displayed, and
the program execution is complete.


THE UNBROKEN RULE OF PASCAL
____________________________________________________________

Having examined your first Pascal procedures, there is a fine
point that is obvious but could be easily overlooked. We
mentioned the unbroken rule of Pascal in an earlier chapter
and it must be followed here too. "Nothing can be used in
Pascal until it has been defined". The procedures must all
be defined ahead of any calls to them, once again emphasizing
the fact that they are part of the Declaration Part of the
program, not the Statement Part.

Compile and run PROCED1.PAS to verify that it does what you
expect it to do.


MORE PROCEDURE CALLS
____________________________________________________________

Assuming you have run PROCED1.PAS successfully and understand
its output, let's go on to PROCED2.PAS and examine it. In
this program we will see how to call a procedure and take

Page 5-3

Procedures and Functions

along some data for use within the =================
procedure. To begin with, notice that PROCED2.PAS
there are three procedure calls in the =================
Statement Part of the program and each has
an additional term not contained in the
calls in the last program, namely the variable name Index
within brackets. This is Pascal's way of taking a variable
parameter to the procedure when it is called.

You will notice that the variable Index is defined as an
integer type variable in the very top of the Declaration Part.
Since we are taking an integer type variable along when we
visit the procedure Print_Data_Out, it had better be expecting
an integer variable as input or we will have a type mismatch.
In fact, observing the procedure heading itself in line 7,
indicates that it is indeed expecting an integer variable but
it prefers to call the variable Puppy inside of the procedure.
Calling it something different poses no problem as long as the
main program doesn't try to call its variable Puppy, and the
procedure doesn't try to use the name Index. Both are
actually referring to the same piece of data but they simply
wish to refer to it by different names.


FORMAL AND ACTUAL PARAMETERS
____________________________________________________________

The parameters listed within the parentheses of the procedure
header are called the formal parameters, whereas the
parameters listed within the parentheses of the procedure call
are referred to as the actual parameters. Observe that the
next procedure is called with Index as the actual parameter
and the procedure prefers to use the name Cat as the formal
parameter name. In both cases, the procedures simply print
out the parameter passed to it, and each then try to modify
the value passed to it before passing it back. We will see
that one will be successful and the other will not.

We are in a loop in which Count is incremented from 1 to 3 and
Pascal does not allow us to modify the loop variable so we
make a copy of the value in line 21 and call it Index. We can
then modify Index in the main program if we desire.


CALL BY VALUE
____________________________________________________________

In line 7, the procedure heading does not contain the reserved
word var in front of the passed parameter and therefore the
parameter passing is only one way because of the way Pascal
is defined. Without the reserved word var in front of the
variable Puppy, the system makes a copy of Index, and passes
the copy to the procedure which can do anything with it, using
its new name, Puppy, but when control returns to the main

Page 5-4

Procedures and Functions

program, the original value of Index is still there. The copy
of Index named Puppy is modified in the procedure, but the
original variable named Index remains unchanged. You can
think of the passed parameter without the var as one way
parameter passing. This is a "call by value" because only the
value of the actual variable is passed to the procedure.


CALL BY REFERENCE
____________________________________________________________

In line 13, the second procedure has the reserved word var in
front of its desired name for the variable, namely Cat, so it
can not only receive the variable, it can modify it, and
return the modified value to the main program. A copy is not
made, but the original variable named Index is actually passed
to this procedure and the procedure can modify it, therefore
communicating with the main program. The formal parameter
name, Cat in the procedure, is actually another name for the
actual variable named Index in the main program. A passed
parameter with a var in front of it is therefore a two way
situation. This is a "call by reference" since the reference
to the original variable is passed to the procedure.


SOME NEW TERMINOLOGY
____________________________________________________________

To restate some of the new terminology in the last few
paragraphs, the parameter name in the calling program is
referred to as the actual parameter, and the parameter name
in the procedure is referred to as the formal parameter. In
the last example then, the actual parameter is named Index and
the formal parameter in the procedure is named Cat. It should
be pointed out that it is called a formal parameter whether
it is a "call by reference" or a "call by value". This
terminology is used in many other programming languages, not
only in Pascal.

When you run this program, you will find that the first
procedure is unable to return the value of 12 back to the main
program, but the second procedure does in fact succeed in
returning its value of 35 to the main program. Spend as much
time as you like studying this program until you fully
understand it. It should be noted that as many parameters as
desired can be passed to and from a procedure by simply making
a list separated by commas in the calls, and separated by
semicolons in the procedure. This will be illustrated in the
next example program.

Compile and run PROCED2.PAS and study the output. You should
be able to comprehend all of the output. If it is not clear,
reread the last few paragraphs.


Page 5-5

Procedures and Functions

To add to your knowledge of Pascal, =================
examine the program PROCED3.PAS for an PROCED3.PAS
example of a procedure call with more than =================
one variable in the call. Normally, you
would group the three input values
together to make the program more readable, but for purposes
of illustration, they are separated. Observe that the
variable Fruit is a two way variable because it is the 3rd
variable in the actual parameter list and corresponds to the
3rd formal parameter in the procedure header. Compile and run
PROCED3.PAS to see that it does what you expect it to do based
on the above explanation.



"CALL BY REFERENCE" OR "CALL BY VALUE"?
____________________________________________________________

It may seem to you that it would be a good idea to simply put
the word var in front of every formal parameter in every
procedure header to gain maximum flexibility, but using all
"call by references" could actually limit your flexibility.
There are two reasons to use "call by value" variables when
you can. The first is simply to shield some data from being
corrupted by the procedure. This is becoming a very important
topic in Software Engineering known as "information hiding"
and is the primary basis behind Object Oriented Programming
which will be discussed in chapters 15 and 16 of this
tutorial.

Secondly is the ability to use a constant in the procedure
call. Modify line 17 of PROCED3.PAS as follows;

Add_The_Fruit(12,Orange,Fruit,Pear);

and compile and run the program. Since Value1 is a "call by
value", the constant 12 can be used and the program will
compile and run. However, if you change line 17 to;

Add_The_Fruit(Apple,Orange,32,Pear);

you will find that it will not compile because Total is a
"call by reference" and the system must be able to return a
value for the formal parameter Total. It cannot do this
because 32 is a constant, not a variable. Even if no value
would be returned, the call by reference must have a variable
for the actual parameter. As a programming exercise, make
Value1 a call by reference by adding the word var in front of
it in line 6, and you will find that the compiler will not
allow you to replace the variable Apple with the constant 12
as was suggested earlier in this section.

The prior discussion should indicate to you that both "call
by value" and "call by reference" have a useful place in

Page 5-6

Procedures and Functions

Pascal programming and it is up to you to decide which you
should use.

When you are satisfied with the present illustration and you
have compiled and executed PROCED3.PAS several times to study
the results of the suggested changes, we will go on to study
the scope of variables using PROCED4.PAS.


A MULTIPLY DEFINED VARIABLE
____________________________________________________________

If you will examine PROCED4.PAS, you will =================
notice that the variable Count is defined PROCED4.PAS
twice, once in the main program var block =================
and once in the var block contained within
the procedure named Print_Some_Data. This
is perfectly legal and is within the Pascal definition.

The variable Index is defined only in the main program var
block and is valid anywhere within the entire Pascal program,
including the procedures and is said to be a global variable.
The variable Count is also defined in the main program var
block and is valid anywhere within the entire Pascal program,
except within the procedure where another variable is defined
with the same name Count. The two variables with the same
name are in fact, two completely different variables, one
being available only outside of the procedure and the other
being available only within the procedure. The variable
More_Stuff is defined within the procedure, so it is invisible
to the main program, since it is defined at a lower level than
that of the main program. It is only available for use within
the procedure in which it is defined.

Any variable is available at any point in the program
following its definition but only at the level of definition
or below. This means that any procedure in the Declaration
Part of a program can use any variable defined in the
Declaration Part of the program provided that the definition
occurs prior to the procedure. Any variable defined within
a procedure cannot be used by the main program since the
definition is at a lower level than the main program.

Be sure to compile and run PROCED4.PAS before continuing on
to the next example program.


PROCEDURES CALLING OTHER PROCEDURES
____________________________________________________________

Load and examine PROCED5.PAS to see an example of procedures
that call other procedures. Keep in mind that, "Nothing can
be used in Pascal until it has been previously defined", and
the order of procedures will be clear in this example. Note

Page 5-7

Procedures and Functions

that procedure Three calls procedure Two
which in turn calls procedure One. =================
PROCED5.PAS
Compile and run PROCED5.PAS and study the =================
output until you understand why it outputs
each line in the order that it does.

Now that you have a good working knowledge of procedures, we
need to make another important point. Remember that any
Pascal program is made up of three parts, the Program Heading,
the Declaration Part, and the Statement Part. The Declaration
Part is composed of five unique components, four of which we
will discuss in detail in the next chapter, and the last
component, which is composed of some number of procedures and
functions. We will cover functions in the next example, so
for now simply accept the fact that it is like a procedure.
A procedure is also composed of three parts, a Procedure
Heading, a Declaration Part, and a Statement Part. A
procedure, by definition, is therefore nothing more or less
than another complete Pascal program embedded within the main
program, and any number of procedures can be located in the
Declaration Part of the main program. These procedures are
all in a line, one right after another.

Since a procedure is defined like the main program, it would
seem to be possible to embed another procedure within the
Declaration Part of any procedure. This is perfectly valid
and is often done, but remember that the embedded procedure
can only be called by the procedure in which it is embedded,
not by the main program. This is a form of information hiding
which is becoming popular in modern software engineering.

The previous paragraph is probably a bit difficult to grasp.
Don't worry about it too much now, as you become proficient
as a Pascal programmer, you will very clearly see how embedded
procedures are used.


NOW LET'S LOOK AT A FUNCTION
____________________________________________________________

Now to keep a promise, let's examine the ================
program named FUNCTION.PAS to see what a FUNCTION.PAS
function is and how to use it. In this ================
very simple program, we have a function
that simply multiplies the sum of two
variables by 4 and returns the result. The major difference
between a function and a procedure is that the function
returns a single value and is called from within a
mathematical expression, a Writeln command, or anywhere that
it is valid to use a variable, since it is really a variable
itself. Observing the Function Heading of the function, in
line 6, you will notice that a function begins with the
reserved word function. Further observation reveals the two

Page 5-8

Procedures and Functions

input variables inside the parenthesis pair being defined as
integer variables, and following the parenthesis is a colon
and another integer. The last integer is used to define the
type of the variable being returned to the main program.

Any call to this function is actually replaced by an integer
value upon completion of the call. Therefore in line 14, the
function is evaluated and the value returned is used in place
of the function call. The result of the function is therefore
assigned to the variable named Feet.

Note that a function always returns a value and it may return
additional values if some of its formal parameters are defined
as "call by reference". Be sure to compile and run this
program.


NOW FOR THE MYSTERY OF RECURSION
____________________________________________________________

One of the great mysteries of Pascal and ================
several other popular programming RECURSON.PAS
languages, is the recursion of procedure ================
calls. Simply defined, recursion is the
ability of a procedure to call itself.
Examine the Pascal example file RECURSON.PAS for an example
of recursion. The main program is very simple, it sets the
variable named Count to the value 7 and calls the procedure
Print_And_Decrement. The procedure prefers to refer to the
variable by the name Index but that poses no problem for us
because we understand that the name of the formal parameter
can be any legal identifier. The procedure writes a line to
the video display with the value of Index written within the
line, and decrements the variable.

The if statement introduces the interesting part of this
program. If the variable is greater than zero, and it is now
6, then the procedure Print_And_Decrement is called once
again. This might seem to create a problem except for the
fact that this is perfectly legal in Pascal. Upon entering
the procedure the second time, the value of Index is printed
as 6, and it is once again decremented. Since it is now 5,
the same procedure will be called again, and it will continue
until the value of Index is reduced to zero when each
procedure call will be completed one at a time and control
will return to the main program.


ABOUT RECURSIVE PROCEDURES
____________________________________________________________

This is really a stupid way to implement this particular
program, but it is the simplest recursive program that can be
written and therefore the easiest to understand. You will

Page 5-9

Procedures and Functions

have occasional use for recursive procedures, so don't be
afraid to try them. Remember that the recursive procedure
must have some variable converging to something, or you will
have an infinite loop. Compile and run this program and
observe the value decrementing as the recursion takes place.


THE FORWARD REFERENCE
____________________________________________________________

Occasionally you will have a need to refer =================
to a procedure before you can define it. FORWARD.PAS
In that case you will need a forward =================
reference. The program FORWARD.PAS has an
example of a forward reference in it. In
this program, each one of the procedures calls the other, a
form of recursion. This program, like the last, is a very
stupid way to count from 7 to 0, but it is the simplest
program possible with the forward reference.

The first procedure, Write_A_Line, has its header defined in
exactly the same manner as any other procedure but instead of
the normal procedure body, only the reserved word forward is
given. This tells the compiler that the procedure will be
defined later. The next procedure is defined as usual, then
the body of Write_A_Line is given with only the reserved word
procedure and the procedure name. The variable reference has
been defined earlier. In this way, each of the procedure
names are defined before they are called.

It would be possible, by using the forward reference in great
numbers, to move the main program ahead of all procedure
definitions and have the program structured like some other
languages. This style of programming would be perfectly legal
as far as the compiler is concerned, but the resulting program
would be very nonstandard and confusing. You would do well
to stick with conventional Pascal formatting techniques and
use the forward reference sparingly. Be sure you compile and
run this program.


THE PROCEDURE TYPE IN TURBO PASCAL 5.X
____________________________________________________________

Examine the program named PROCTYPE.PAS ================
which can only be compiled and run if you PROCTYPE.PAS
are using TURBO Pascal version 5.x since ================
this is a new extension to the Pascal
language by Borland. In this program, the
procedure Do_Math is defined as a procedure type in line 12,
and three regular procedures are defined each of which have
the same structure of formal parameters. In the program,
since Do_Math is a procedure type that is compatible with each
of the defined procedures, it can be assigned one of the other

Page 5-10

Procedures and Functions

procedures, and a call to Do_Math is identical to a call to
that procedure to which it is currently assigned. The program
should be self explanatory with those few comments so you will
be left to study the details on your own.

Note the comments in lines 4 and 5 of the program. When using
a procedure type or a function type, which is the topic of the
next example program, TURBO Pascal requires that you use the
compiler directive F+, which forces the system to use far
calls for all procedure calls.

Examine the program named FUNCTYPE.PAS for ================
an example of a program using some of the FUNCTYPE.PAS
same techniques as the last program but ================
instead uses a function type for the
subprogram variable. This program should
be simple for you to study on your own concerning the details
of operation. The only rule concerning the procedure and
function types which must be stated, is that a subprogram type
variable can only be assigned subprogram names if the list of
actual parameters are identical for the type and the
subprogram. This includes the type of the return value for
a function. Since this is a new extension to the TURBO Pascal
languages, it has not been used much, so don't worry about it
too much. You should know that it can be done, because
someday you will find a piece of Pascal code with this
construct used. Of course, you will someday find a good use
for it yourself.


PROGRAMMING EXERCISES
____________________________________________________________

1. Write a program to write your name, address, and phone
number with each Writeln in a different procedure.

2. Add a statement to the procedure in RECURSON.PAS to
display the value of Index after the call to itself so
you can see the value increasing as the recurring calls
are returned to the next higher level.

3. Rewrite TEMPCONV.PAS putting the centigrade to fahrenheit
formulas in a function call.












Page 5-11


  3 Responses to “Category : Pascal Source Code
Archive   : PASTUT.ZIP
Filename : CHAP05.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/