



                                                   Chapter 10
                                        STANDARD INPUT/OUTPUT


WE'VE USED THIS ALREADY
____________________________________________________________

During the course of this tutorial we have been using the
Write and Writeln procedures to display data, and it is now
time to discuss them fully.  Actually there is little to be
said about them that has not already been said, but in order
to get all of the data in one place, they will be redefined
here.

As mentioned earlier, Write and Writeln      ================
are not actually reserved words but are        WRITELNX.PAS
procedure calls.  They are therefore         ================
merely identifiers that could be changed,
but there should never be a reason to do
so.  Let's get on to our first example program WRITELNX.PAS
which has lots of output.



MANY OUTPUT STATEMENTS
____________________________________________________________

Pascal has two output statements with only slight differences
in the way they work.  The Writeln statement outputs all of
the data specified within it, then returns the cursor to the
beginning of the next line.  The Write statement outputs all
of the data specified within it, then leaves the cursor at the
next character where additional data can be output.  The Write
statement can therefore be used to output a line in bits and
pieces if desired for programming convenience.  The first
example program for this chapter, WRITELNX.PAS, has many
output statements for your observation.  All outputs are
repeated so you can observe where the present field ends and
the next starts.

Observe the two integer output statements in lines 13 and 14. 
The first simply directs the system to output Index twice, and
it outputs the value with no separating blanks.  The second
statement says to output Index twice also, but it instructs
the system to put each output in a field 15 characters wide
with the data right justified in the field.  This makes the
output look much better.  This illustrates that you have
complete control over the appearance of your output data.

The real output statements in lines 19 and 20 are similar to
the integer except that when the data is put into a field 15
characters wide, it is still displayed in scientific format. 
Adding a second field descriptor as illustrated in lines 21

                                                    Page 10-1

                                        Standard Input/Output

through 23, tells the system how many digits you want
displayed after the decimal point.

The boolean, char, and string examples should be self
explanatory.  Notice that when the string is output, even
though the string has been defined as a maximum of 10
characters, it has been assigned a string of only 8
characters, so only 8 characters are output.  Compile and run
this program and observe the results.

If you are using TURBO Pascal version 4.0 or 5.0, the added
data types described in chapter 3 of this tutorial are output
in the same manner as those illustrated in the program
WRITELNX.PAS.



NOW FOR SOME INPUT FROM THE KEYBOARD
____________________________________________________________

The example file READINT.PAS will           =================
illustrate reading some integer data from      READINT.PAS
the keyboard.  A message is output in line  =================
8 with an interesting fact that should be
pointed out.  Anyplace where Pascal uses a
string variable or constant, it uses the apostrophe for a
delimiter.  Therefore, anyplace where an apostrophe is used
in a string, it will end the string.  Two apostrophes in a row
will be construed as a single apostrophe within the string and
will not terminate the string.  The term 'Read' within the
string will therefore be displayed as shown earlier in this
sentence.

The variable Index is used to loop five times through a
sequence of statements with one Read statement in it.  The
three integer values are read in and stored in their
respective variables with the one statement.  If less than
three are entered at the keyboard, only as many as are read
in will be defined, the rest will be unchanged.  Following
completion of the first loop, there is a second loop in lines
19 through 25 that will be executed 5 times with only one
minor change, the Read statement is replaced by the Readln
statement.  At this point it would be best run this program
trying several variations with input data.

When you run READINT.PAS, it will request three integers. 
Reply with three small integers of your choice with as many
blank spaces between each as you desire, followed by a
carriage return.  The system will echo your three numbers back
out, and request three more.  Respond with only one number
this time, different from each of the first three, and a
carriage return.  You will get your new number followed by
your previous second and third number indicating that you did
not re-enter the last two integer variables.  Enter three more

                                                    Page 10-2

                                        Standard Input/Output

numbers, this time including a negative number and observe the
echo once again.

Continue entering numbers until the system outputs the message
indicating that it will now be using the Readln for reading
data.  At this point enter the same numbers that you did in
the previous section and notice the difference, which is only
very slight.  Each time you hit the enter key to cause the
computer to process the data you have just given it, it will
echo the carriage return to the display, and the "Thank you"
message will be on a new line.  When entering data from the
keyboard, the only difference in Read and Readln is whether
or not the carriage return is echoed to the display following
the data read operation.

It should not be a surprise to you that after you enter the
data, the data is stored within the program and can be used
anywhere that integer data is legal for use.  Thus, you could
read in an integer, and use the integer to control the number
of times through a loop, as a case selector, etc.



TIME TO CRASH THE COMPUTER
____________________________________________________________

Crashing the computer will not hurt a thing.  Rerun the above
program and instead of entering integer data, enter some real
data with decimal points, or even some character data.  The
computer should display some kind of message indicating that
you have caused an I/O error (Input/Output), and TURBO Pascal
will abort operation (that simply means to stop the program
and return control to the operating system).  No harm has been
done, simply start it again to enter more numbers or errors.



READING REAL NUMBERS
____________________________________________________________

The example program READREAL.PAS will        ================
illustrate how to read real numbers into       READREAL.PAS
the computer.  It will read an integer and   ================
three real numbers each time through the
loop.  It is perfectly fine to give the
system a number without a decimal point for a real number. 
The computer will simply read it as a decimal number with
zeros after the decimal point and consider it as a real number
internally. As you found out in the last example program,
however, it is not permissible to include a decimal point in
the data if the computer is looking for an integer variable. 
Include some character data for a real number and crash the
system in this program too.


                                                    Page 10-3

                                        Standard Input/Output

READING CHARACTER DATA
____________________________________________________________

The next example program, READCHAR.PAS,      ================
will read in one character each time           READCHAR.PAS
through the loop and display it for you.     ================
Try entering more than one character and
you will see that the extra characters
will simply be ignored.  It is not possible to crash this
program because any character you enter will be valid.

The next example, READARRY.PAS, will read    ================
in a string of characters and display them     READARRY.PAS
for you if you are using TURBO Pascal 3.0.   ================
Neither TURBO Pascal 4.0 nor 5.x permits
reading into an array but does allow
reading into the individual elements of the array one element
at a time.  This program does not work with TURBO Pascal 4.0
or 5.x so you should go directly to the next program,
READSTRG.PAS, if you are using either of the two newer
versions. 

Continuing our discussion of READARRY.PAS, up to 10 characters
will be read, and if less than 10 are read, the rest will be
blank filled.  Try entering 10 characters, then 4, to see that
the residual 6 characters are blanked out before storing and
printing.  Since the array is fixed at ten characters, ten
characters are always printed out, including trailing blanks.

Finally, READSTRG.PAS will also read up to   ================
10 characters, but since a string is a         READSTRG.PAS
dynamic length variable, it will only        ================
print out the characters you input each
time, up to the maximum of 10 as defined
in the var declaration.  It will display trailing blanks if
you type them in because blanks are valid characters.


BULLET PROOF PROGRAMMING
____________________________________________________________

It can be frustrating to be running a program and have it
declare an I/O error and terminate operation simply because
you have entered an incorrect character.  The integer and real
data inputs defined earlier in this chapter are fine for quick
little programs to do specific calculations, but if you are
writing a large applications program it is better to use
another technique.  Since the character and string inputs
cannot abort operation of the program, it is best to use them
to input the variable data and check the data internally under
your own program control.  An error message can then be given
to the operator and another opportunity granted to input the
correct data.  All well written large application programs use
this technique.

                                                    Page 10-4

                                        Standard Input/Output


HOW DO I PRINT SOMETHING ON THE PRINTER
____________________________________________________________

With all of the Pascal knowledge you now     ================
have, it is the simplest thing in the          PRINTOUT.PAS
world to get data to the printer.  The       ================
example file PRINTOUT.PAS will show you
graphically how to do it.  Every Write or
Writeln statement is required to have a device identifier
prior to the first output field.  If there is none, it is
automatically defaulted to the standard output device, the
display monitor.  The example program has a few outputs to the
monitor in lines 9 and 10 with the device identifier included,
namely Output.  This is only done to show you the general form
of the Write statements, but if you desire, you can add the
standard device identifier to every monitor output.

There are many statements in this program with the device
identifier Lst, which is the standard name for the list device
or the printer.  It should be obvious to you that the first
field is the device selector which is used to direct the
output to the desired device.

Compile and run this program with your printer turned on for
some printer output.  If you are using TURBO Pascal 3.0, you
will have to comment out line 4 since it will not be
understood by your compiler.  It is required with version 4.0
or 5.x to tell the system where to find the definition of the
output device named Lst.

Just to supply you with a bit more information, every Read and
Readln statement is also required to have a device identifier
prior to the first input field.  As you may suspect, it is
also defaulted to Input if none is specified, and the standard
input device is the keyboard.


PROGRAMMING EXERCISE
____________________________________________________________

1.   Write a program containing a loop to read in a character
     string up to 60 characters long, then print the string
     on your printer. When you run the program, you will have
     the simplest word processing program in the world. Be
     sure to include a test to end the loop, such as when
     "END" is typed in.








                                                    Page 10-5
