home *** CD-ROM | disk | FTP | other *** search
- CHAPTER 5 - The Pascal procedures and functions
-
-
- In order to define the procedures and functions we will
- need to lay some groundwork in the form of a few
- definitions. These are important concepts, so pay close
- attention.
-
- 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 than it has been up to this point 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 the
- procedures and functions are the fifth part. We
- will cover the others 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.
-
- 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, lets go on to our first
- Pascal program with a procedure in it, in fact, it will have
- three procedures.
-
- THE FIRST PROCEDURES
-
- Load PROCED1 as your first working file and edit it.
- You will notice that it doesn't look like anything you have
- seen up to this point because it has PROCEDUREs 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 and continues
- down through and including all three procedures. The last
- five lines constitute the Statement Part. It may seem
- strange that what appears to be executable Pascal
- statements, and indeed they are executable, 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 the procedures and
- functions.
-
-
- Page 20
-
-
-
-
-
-
-
-
-
- CHAPTER 5 - The Pascal procedures and functions
-
-
-
- Continuing to examine PROCED1, we will make note of the
- program itself, which is the Statement Part. The program,
- due to the nature of Pascal, clearly tells us what it will
- do, namely 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 three procedures which will completely define
- what is to be done in the main program, or the Statement
- Part. Hopefully you can begin to see why the procedures are
- included in the Declaration Part of the Pascal program.
-
- Now to examine one procedure in detail, namely the
- first. The first statement we come to in the main program
- is the one that says simply, "write_a_header" followed with
- the usual end of statement, the semicolon. This is a simple
- procedure call. When the compiler finds this it goes
- looking for a predefined procedure which it can execute at
- this point. 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 actually system defined
- procedures, and you have already been using them quite a
- bit, so procedures are not completely new to you. If it
- doesn't find the procedure defined in either place, it will
- generate an error message.
-
- HOW TO 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 these last two paragraphs until it is.
-
-
-
-
- Page 21
-
-
-
-
-
-
-
-
-
- CHAPTER 5 - The Pascal procedures and functions
-
-
- The next line will cause the procedure named
- "write_a_message" to be called 8 times, each time writing a
- line of output. Suffice it to say at this time that the
- value of "count", as defined here, is available "globally",
- meaning anywhere in the entire Pascal program. We will
- define the variable availability shortly. Finally, the last
- procedure call is made, causing the ending message to be
- displayed, and the program execution is complete. 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.
-
- MORE PROCEDURE CALLS
-
- Assuming you have run PROCED1 successfully and
- understand its output, lets go on to PROCED2 and examine it.
- To begin with, notice that 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 word "index" within brackets. This is
- Pascals 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 variable in the very top of
- the Declaration Part. Therefore the procedure
- "print_data_out" had better be expecting an integer variable
- or we will have a type mismatch. In fact, observing the
- procedure itself, indicates that it is indeed expecting an
- integer variable but it prefers to call the variable
- "puppy". 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.
- Notice that the next procedure is called with index as a
- parameter and it prefers to call it by the name "cat".
- Notice that 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 we are not allowed to modify the loop variable so
- we make a copy of the value and call it "index". We can
- then modify "index" if we desire. The first procedure does
- not contain a VAR in front of the passed parameter and
- therefore the parameter passing is only one way. The system
-
-
- Page 22
-
-
-
-
-
-
-
-
-
- CHAPTER 5 - The Pascal procedures and functions
-
-
- makes a copy of "index", and passes the copy to the
- procedure which can do anything with it, of course using its
- new name, "puppy", but when control returns to the main
- program, the original value of "index" is still there. So
- 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 variable is passed to the procedure.
-
- 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. The original variable named "index" is actually
- passed to this procedure and it can modify it, therefore
- communicating to 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.
-
- When you run this program, you will find that the first
- procedure is unable to get 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.
-
- For your own enlightenment, examine PROCED3 for an
- example of a procedure call with more than one variable in
- the call. Normally, you would group the three input values
- together, but for purposes of illustration, they are
- separated. Observe that the variable "fruit" is a two way
- variable. When you are satisfied with the present
- illustration, we will go on to study the scope of variables
- using PROCED4.
-
- A MULTIPLY DEFINED VARIABLE
-
- If you will examine PROCED4, you will notice that the
- variable "count" is defined 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 in the main program VAR
- block and is valid anywhere within the entire Pascal
- program, including the procedures. The variable "count" is
- also defined in the main program VAR block and is also valid
- anywhere within the entire Pascal program, except within the
-
-
- Page 23
-
-
-
-
-
-
-
-
-
- CHAPTER 5 - The Pascal procedures and functions
-
-
- 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. If a third
- variable was defined within the procedure, it would be
- invisible to the main program, since it was defined at a
- lower level than that of the main program. Any variable
- defined in the main program or in any procedure is available
- in any procedure that is within the scope of the defining
- procedure. That last sentence seems confusing, but thinking
- about it will clear it up. This is a difficult concept to
- grasp but is very important.
-
-
- PROCEDURES CALLING OTHER PROCEDURES
-
- Load and examine PROCED5 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.
-
- Now that you have a good grasp 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
- Program Heading (which says "PROCEDURE"), 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. That 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 that is used.
-
-
-
-
-
-
- Page 24
-
-
-
-
-
-
-
-
-
- CHAPTER 5 - The Pascal procedures and functions
-
-
- NOW LET'S LOOK AT A FUNCTION
-
- Now to keep a promise, lets examine FUNCTION to see what
- a 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 put any variable, since it is really a
- variable itself. Observing the Program Heading of the
- function reveals the two 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. Since any call to this
- function is actually replaced by an integer upon completion
- of the call, it can be used anywhere in a program where an
- integer variable can be used.
-
- NOW FOR THE MYSTERY OF RECURSION
-
- One of the great mysteries of Pascal to many people, is
- the recursion of procedure calls. Simply defined, recursion
- is the ability of a procedure to call itself. Examine the
- Pascal example file RECURSON for an example of recursion.
- The main program is very simple, it sets the variable
- "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.
- 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
-
-
- Page 25
-
-
-
-
-
-
-
-
-
- CHAPTER 5 - The Pascal procedures and functions
-
-
- will 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.
-
- THE FORWARD REFERENCE
-
- Occasionally you will have a need to refer to a
- procedure before you can define it. In that case you will
- need a FORWARD reference. The program FORWARD 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.
-
- 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 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 putting the centigrade to fahrenheit
- formulas in a function call.
-
-
-
-
- Page 26