












                          TURBO-LESSONS

                     A TURBO Pascal Tutorial
                          Version 1.01


                    Set # 2 - Lessons 11 - 17






                        by Lyle M. Faurot
                          June 27, 1985



























    Copyright (C), 1985 by Lyle Faurot.  All rights reserved.

          TURBO is a trademark of Borland International.

                  INTRODUCTION TO TURBO-LESSONS 

    When Borland International ran their first ads for TURBO 
PASCAL my reaction was "You gotta be kidding - they can't do 
that".  But, it seems they did!  I've been enjoying this 
programming system ever since.  Apparently a great many other 
programmers are either programming in TURBO or would like to 
learn how.  TURBO-LESSONS were designed to meet that need.  

    Each TURBO-LESSON is a bite-size tutorial which introduces 
one or more new concepts.  Each of the lessons are presented in 
the same format which includes the OBJECTIVES of the lesson, and 
the TUTORIAL portion of the lesson.  Most lessons direct you to 
work with a sample program which is provided with these lessons.  

    To begin, you should print the TURBO-LESSONS before loading 
TURBO.   



             ****************************************
             D I S T R I B U T I O N      N O T I C E 
             ****************************************


TURBO-LESSONS are being distributed as USER-SUPPORTED software. 

Suggested donation, $5.00, for this second set, lessons 11-17, 
may be sent to: 

Lyle Faurot
Box 494
Moorhead, MN   56560


COPYING BY ORGANIZATIONS

Clubs and other non-profit organizations may copy these lessons 
for their members, with the following conditions:

1.  No charge is made for TURBO-LESSONS.  A distribution charge 
may be made to cover the price of the diskette.

2.  Club members are informed that TURBO-LESSONS are distributed 
as user-supported software.

3.  TURBO-LESSONS are distributed unmodified.

              T A B L E     O F     C O N T E N T S 
                   (Set # 2,  Lessons 11 - 17)

                                                         Page

Introduction
Distribution Notice

TURBO-LESSON 11: INTRODUCTION TO FUNCTIONS 
     Pascal subprograms  . . . . . . . . . . . . . . . . . 50 *
     FUNCTION declaration  . . . . . . . . . . . . . . . . 50
     User-defined function . . . . . . . . . . . . . . . . 51

TURBO-LESSON 12: FUNCTION APPLICATION - ERROR DETECTION
     Error detection . . . . . . . . . . . . . . . . . . . 55
     Using a predefined function . . . . . . . . . . . . . 56
     Writing your own function . . . . . . . . . . . . . . 58

TURBO-LESSON 13: STRINGS 
     Strings . . . . . . . . . . . . . . . . . . . . . . . 60
     String replacement statement  . . . . . . . . . . . . 60
     Predefined string function, LENGTH  . . . . . . . . . 63

TURBO-LESSON 14: INTRODUCTION TO PROCEDURES
     PROCEDURE declaration . . . . . . . . . . . . . . . . 65
     Using a procedure . . . . . . . . . . . . . . . . . . 66
     Using parameters  . . . . . . . . . . . . . . . . . . 67
     A counter with error checking . . . . . . . . . . . . 68

TURBO-LESSON 15: INTERACTIVE SCREEN HANDLING
     Setting up a data entry screen  . . . . . . . . . . . 70
     Being nice to users - ClrScr  . . . . . . . . . . . . 71
     Getting around the screen - GotoXY  . . . . . . . . . 72
     Screen messages and accepting user input  . . . . . . 73

TURBO-LESSON 16: REAL NUMBERS
     Range of real numbers . . . . . . . . . . . . . . . . 74
     Input/Output of real numbers  . . . . . . . . . . . . 75
     Calculations with real numbers  . . . . . . . . . . . 76
     Calculations with integers and real numbers . . . . . 78

TURBO-LESSON 17: A TIMING FUNCTION
     Include files       . . . . . . . . . . . . . . . . . 79
     A timing function . . . . . . . . . . . . . . . . . . 80
     Improving timing accuracy . . . . . . . . . . . . . . 81
     Sources of errors in timing . . . . . . . . . . . . . 82



* (Note - page 42 was the last page of lesson 10.  Some page 
   numbers were left unused to make it easier to incorporate 
   the changes you suggest.) 

TURBO-LESSONS - A Pascal Tutorial        Version 1.01    Page 50


TURBO-LESSON 11:   INTRODUCTION TO FUNCTIONS

OBJECTIVES - In this lesson, you will learn about:

1,  Pascal Subprograms
2.  FUNCTION declaration
3.  User-defined function


1.  Pascal Subprograms.

The example programs in earlier lessons have been rather small.  
As programs grow in size and complexity, it is essential that you 
utilize the appropriate tools to simplify the programming effort.

The subprogram is one of the most powerful tools for simplifying 
a complex program.  Subprograms may be viewed as "building 
blocks" for constructing programs.  

As you learn to write Pascal programs, you will find Pascal 
subprograms rather easy to write - they are almost identical to 
programs!

There are two types of subprograms in Pascal: FUNCTIONS and 
PROCEDURES.   Both types may be either user-defined (written by 
you) or pre-defined as a part of Pascal.  

In this lesson you will work with a user-defined FUNCTION.  

Most of what you learn about FUNCTIONS also applies to 
PROCEDURES.  


2.  FUNCTION declaration.

Below is a simplified structure of a Program, Function, and 
Procedure:

PROGRAM         FUNCTION       PROCEDURE
LABEL           LABEL          LABEL
CONST           CONST          CONST
TYPE            TYPE           TYPE
VAR             VAR            VAR

FUNCTION(s)     FUNCTION(s)    FUNCTION(s)  (0 or more FUNCTIONS)
PROCEDURE(s)    PROCEDURE(s)   PROCEDURE(s) (   and PROCEDURES  )
                         
BEGIN           BEGIN          BEGIN
(processing     (processing    (processing
 statements)     statements)    statements)
END.            END;           END;

Notice that they look very similar.    

TURBO-LESSONS - A Pascal Tutorial        Version 1.01    Page 51

 
One difference, visible here, is the END of the processing block: 
A period follows the END of a PROGRAM block, but a semi-colon 
follows the END of a FUNCTION or PROCEDURE block.  


3.  User-defined function.

##### DO:

Examine FUNCTION Cube in PROG11 using the editor.

FUNCTION Cube(Number:Integer) : Integer;

The FUNCTION declaration above means:

FUNCTION         Type of subprogram, a FUNCTION, not a PROCEDURE.

Cube             The name of the FUNCTION.  

                 Cube must be assigned a value by one of the 
                 statements in the FUNCTION BEGIN END block.
                 
(Number:Integer) An integer "parameter" called Number is used 
                 within the FUNCTION.

                 This is the number to be cubed.

: Integer;       Type of value to be assigned to Cube.

##### DO:

Study the connection between the following two statements:

In FUNCTION Cube:

FUNCTION Cube(Number:Integer) : Integer;

In PROG11:

WriteLn('The cube is: ', Cube(No) );

Cube(No) in the statement above invokes (calls) the FUNCTION Cube 
to operate on the number called No.

PROG11,  No ----->  Number, in FUNCTION Cube.

The value of the variable called No in PROG11 is provided to the 
FUNCTION to use as a value of its variable called Number.

TURBO-LESSONS - A Pascal Tutorial        Version 1.01    Page 52


##### DO:

Determine how Cube obtains its value in the FUNCTION.

Cube := Number * Number * Number;

This statement cubes the value in the variable Number (which 
Number received from the variable, No, in the main program) and 
assigns the result to the FUNCTION name, Cube.  

The WriteLn statement prints this resulting value in the position 
indicated by the reference to Cube(No) in the WriteLn list.

##### DO:

Run PROG11 several times using the following values for input:

3,  -3,  0

31   (cube should be 29791)

32   (cube should be 32768)  Is it?  Remember this problem from 
an earlier lesson?  You will explore some techniques for 
detecting this problem in the next lesson.

Now, let's see what happens if you change some of the things in 
the FUNCTION and the reference to it.

What would happen if you used a constant instead of No in the 
reference, Cube(No)?

##### DO:

Change the WriteLn statement to:

WriteLn('The cube is: ', Cube(3) );

Run the program several times with different input values.

Do you get the same result no matter what you input?

Notice that the variable, No, which you input, is no longer used 
in the FUNCTION reference, Cube(3).  

What about expressions in the reference to the function?

TURBO-LESSONS - A Pascal Tutorial        Version 1.01    Page 53


##### DO:

Change the FUNCTION reference to Cube(No - 2).

Run the program several times with input values: 

5     (No - 2) is 3, so cube should be 27.

1     (No - 2) is -1, so cube should be -1.

-1    (No - 2) is -3, so cube should be -27.

Do integer expressions work o.k?

What if you tried to use a non-integer value in the Cube(No) 
reference?

##### DO:

Modify the WriteLn statement to:

WriteLn('The cube is: ', Cube('This is a string') )

Run the program.  

Did the compiler complain?

Error 44: Type mismatch.

When you press ESC, the cursor stops at the offending reference.

The problem: 'This is a string' was given to the function to use 
as an integer value,  but it is a string, not an integer.


A good way to learn to recognize errors, is to introduce one 
error at a time and check the results.  

Let's look at some errors which you might make in setting up the 
FUNCTION itself.  

TURBO-LESSONS - A Pascal Tutorial        Version 1.01    Page 54


##### DO:

Change the type of Number to Char.  The FUNCTION declaration 
should appear:

FUNCTION Cube(Number:Char) : Integer;

What happens when you attempt to run or compile the program?

Error 47: Operand type(s) does not match operator.

When you press ESC, the cursor stops, not at the line you 
modified, but at the line:

Cube := Number * Number * Number;

Why?

There is nothing wrong with the line you changed.  It may not do 
what you want it to, but to the computer, it is just an Integer 
FUNCTION with a character for input.  
 
The problem appears (to the compiler) when an attempt is made to 
multiply a character times a character in the line marked by the 
cursor.  At this point the compiler alerts you to the problem.

DEBUGGING NOTE: DON'T FORGET, THE CURSOR POINTS TO THE PLACE 
                WHERE THE ERROR WAS DETECTED BY THE COMPILER.  
                THE CAUSE OF THE ERROR MAY BE ELSEWHERE!  

What would happen if you inadvertently designated the function as 
something other than Integer?

##### DO:

Change the FUNCTION declaration to:

FUNCTION Cube(Number:Integer) : Char;

Run the program.    What results did you get?

Error 44 again - Type mismatch.  

Again, the cursor points to the calculation.  

This time though, the calculation itself is o.k.    The problem 
occurs when an attempt is made to assign the integer result to 
the Character FUNCTION, Cube.


