home *** CD-ROM | disk | FTP | other *** search
-
-
-
- Chapter 5
- CONTROL STRUCTURES
-
-
-
- THE SIMPLEST LOOP IN ADA
- _________________________________________________________________
-
- We will start with the simplest loop in Ada, the ================
- infinite loop which is illustrated in lines 13 LOOPDEMO.ADA
- through 19 of the program named LOOPDEMO.ADA. ================
- The variable named Index is initialized to the
- value of 1 prior to entering the loop, and the
- loop itself is given in lines 14 through 19. The loop begins with
- the reserved word loop and ends with the two reserved words end
- loop. Any number of executable statements are placed between these
- two delimiters and the loop is repeated continuously until
- something causes the program to jump out of the loop. In this
- case, the variable Index is incremented each time through the loop,
- and when it reaches a value of 5, the exit statement is executed
- which causes control to jump out of the loop and begin executing
- instructions immediately following the end of the loop. The words
- exit and when are two more reserved words.
-
- The expression following the exit when reserved words must evaluate
- to a BOOLEAN result and when the result is TRUE, the loop is
- exited, but as long as the result is FALSE, the loop execution will
- continue. Note that the exit statement can be placed anywhere in
- the loop and as many conditional exits as needed can be placed
- within the loop.
-
- The statements illustrated in lines 21 through 27 are an
- alternative form of loop exit which uses the if statement which we
- have not yet studied. The if form of exit is such a common form
- of usage that it had to be included here as one of the simplest
- types of loops. Note that the if exit can be placed anywhere in
- the loop and as many as needed can be used within the loop. The
- if statement will be fully explained later in this chapter.
-
-
-
- THE exit STATEMENT
- _________________________________________________________________
-
- There is a subtle difference between the exit in line 18 and the
- exit in line 26. The exit in line 18 is conditional because it is
- only executed if the condition evaluates to TRUE. The exit in line
- 26 however, is unconditional since the exit will be taken anytime
- control reaches the word exit. Keep in mind that an exit is used
- only to exit a loop, it is not used for any other construct in Ada.
-
-
-
-
- Page 5-1
-
- Chapter 5 - Control Structures
-
- THE while LOOP
- _________________________________________________________________
-
- The while loop is identical to the simple loop except for the
- addition of a test prior to the reserved word loop. The test is
- done at the beginning of the loop so it is slightly less general
- than the simple loop, but it also requires a BOOLEAN expression as
- part of the construct. This loop is illustrated in lines 30 to 34
- of the present program. In line 30, "while Count < 5" is called
- the iteration clause.
-
-
- THE for LOOP
- _________________________________________________________________
-
- The loops studied so far in this example program use an
- indeterminate number of passes since they calculate their own
- limits as they progress through the loop. It is important to point
- out that the BOOLEAN expressions are evaluated on every pass
- through the loop. The for loop, however, has its limits evaluated
- one time and the number of passes through the loop is completely
- defined before the first pass through the loop is begun.
-
- The for loop is illustrated in lines 36 to 39 where the control
- consists of a few words prior to the reserved word loop. In this
- case the loop control is the variable Index and the range of the
- variable is 1 through 4. The loop will be executed four times,
- each time with a larger number for the variable Index, since the
- loop index is always incremented by one. There is no provision
- for an increment of any other value in Ada. The reserved words for
- and in are used in the manner shown for all for loops. They serve
- to bracket the loop index, in this case named Index, and the range
- of the index, in this case 1 through 4 inclusive.
-
- Because the type INTEGER is so commonly used for the loop index,
- if the type is not specifically stated, it will be defaulted to the
- type INTEGER. This is to make it easier to code the majority of
- loops.
-
- Note that the loop parameters do not need to be of type INTEGER,
- but the loop index and both range limits must be of the same type.
- Note also that the value of the loop iterator is not available
- after loop termination. The loop iterator ceases to exist
- completely when the loop is completed. (There is good reason for
- this as we will see when we complete our study of the next example
- program.)
-
-
- THE BACKWARDS for LOOP
- _________________________________________________________________
-
- There is a slight variation to the for loop as illustrated in lines
- 41 through 44, where the loop index is decremented on each pass
- through the logic. The word reverse is another reserved word and
-
- Page 5-2
-
- Chapter 5 - Control Structures
-
- serves to indicate the backward counting nature of this loop. Note
- that the range is expressed in ascending order, but the actual
- execution begins at 8 and decrements by 1 on each pass until it
- reaches 5, where it quits after the pass through the loop with
- Count set to 5.
-
-
- THE EMPTY LOOP
- _________________________________________________________________
-
- Continuing in the program named LOOPDEMO.ADA, the loop in lines 46
- to 48 is given to illustrate that it is possible to write a loop
- that does absolutely nothing. It may seem like a silly thing to
- do, but there are cases, when using tasking, that it is necessary
- to do nothing in a loop. It is of more importance at this point
- to illustrate that Ada is so picky, you are not allowed to write
- an empty loop, but are required to inform the compiler that you
- really did mean for the loop to be empty by including the reserved
- word null within the loop.
-
- One other point must be made before we leave this program.
- Everything from line 14 through line 19 comprises a single Ada
- statement, by definition. It is definitely a complex statement,
- but for purposes of discussion, it is one Ada statement. Likewise,
- lines 22 through 27 constitute a single Ada statement, as do lines
- 30 through 34. This is an important concept to understand because
- of the block nature of Ada and we will have more to say about it
- later.
-
- Be sure to compile and execute this program and be sure you
- understand exactly what each loop does.
-
-
- SLIGHTLY MORE COMPLEX for STATEMENTS
- _________________________________________________________________
-
- Examine the program named MORELOOP.ADA for a ================
- few examples of more complex but much more MORELOOP.ADA
- versatile for loops. The loops illustrate a few ================
- of the flexibilities designed into Ada to allow
- for more efficient programming. The first
- example has two new concepts, the first being that the loop
- variable, Index, is not declared in the definition part of the
- program, and secondly the range is defined by a type rather than
- variable or constant limits.
-
- Considering the first point, the loop index in a for loop does not
- require explicit declaration, but will be implicitly declared by
- the program, used during the duration of the loop, and discarded
- when the loop terminates. The final value of the loop index is not
- available for use after the loop terminates, and this is true
- regardless of whether the index is explicitly or implicitly
- declared. (We will see shortly that it is always implicitly
- declared by the Ada system.) The Ada language designers gave
-
- Page 5-3
-
- Chapter 5 - Control Structures
-
- compiler writers freedom on how and when the loop index is
- incremented rather than dictating what the final value would be.
- It is a simple rule to remember that you can not depend on having
- the final value of the loop index when you terminate the loop. If
- you need the final value, you must copy it into some other
- variable.
-
-
-
- THE LOOP INDEX AND LIMITS MUST AGREE IN TYPE
- _________________________________________________________________
-
- The second point brought out above is the fact that the loop range
- is given as a type. The type given, MY_TYPE, has a defined range
- of 10..13, so it should be no real problem seeing what the loop
- index range is. Moreover, since the type of the individual values
- of MY_TYPE are of the type universal_integer, the implicit loop
- index, named Index, will also be of type universal_integer. Ada
- will pick the correct types for you.
-
- A final point about the first loop in this program must be made.
- The loop index in this for loop, as well as in any for loop, will
- be treated as a constant within the loop, so you cannot assign a
- new value to it. The looping mechanism itself will be the only way
- that the loop index can be changed in value.
-
-
-
- OUR FIRST ATTRIBUTES IN USE
- _________________________________________________________________
-
- In chapter 3, we took a brief look at attributes, but didn't really
- look at uses for them. In the loop in lines 30 through 34, we have
- the range once again defined as the limits of the type named
- MY_TYPE but this time we explicitly name the first and last values
- of the type by using the attributes. The method depicted in line
- 24 is more concise, but both methods lead to the same result. If
- you wanted to loop from the first element to some midpoint, for
- example, the second method gives you a way to use one of the
- endpoints of the range.
-
- A point that should be mentioned again is the fact that the
- contents of lines 24 through 28 constitute a single Ada statement,
- as do the contents of lines 30 through 34 inclusive.
-
-
-
- CALCULATED LOOP RANGE LIMITS
- _________________________________________________________________
-
- The loop in lines 36 through 40 has range limits that are not
- static but that are calculated when the loop is entered. In this
- case, the calculations are all based on constants, but they could
- be based on variables of any arbitrary degree of complexity. If
-
- Page 5-4
-
- Chapter 5 - Control Structures
-
- they are based on one or more variables, there is a subtle point
- that you must understand. If one or more of the variables are
- changed within the loop, the range does not change accordingly,
- because the loop range limits are calculated only once, and it
- occurs when the loop is entered.
-
- It should be clear that the loop range is 2 through 5 for this
- particular loop.
-
-
- A DOUBLY NESTED for LOOP
- _________________________________________________________________
-
- Lines 42 through 52 contain two nested for loops with an addition
- to the outer loop. The identifier Named_Loop is a loop name which
- applies to the outer loop. Notice that the name also follows the
- corresponding end loop for that loop, resulting in a named loop.
- In lines 45 and 46 we have a conditional statement that says if the
- product of the Height and the Width are equal to 12, we are to exit
- the loop that is named Named_Loop. Without the name given we would
- only exit the loop currently in effect, the inner one defined by
- the loop index Width, but since we mention the name, we exit the
- loop with the given name, and exit both loops. By adding a name
- to a loop, you can exit out of as many nested levels as you desire
- with a single exit statement.
-
- Once again, according to the definition of Ada, lines 42 through
- 52 constitute a single statement, and lines 44 through 51 also
- constitute a single Ada statement, although it is embedded within
- the outer statement. To continue, each of lines 48, 49, and 50
- constitute a single Ada statement, and each of these are embedded
- within both of the outer statements. Recall that each Ada
- statement is supposed to terminate with a semicolon, then go back
- and reread this paragraph with that in mind.
-
-
- A CLOSE LOOK AT THE LOOP INDEX
- _________________________________________________________________
-
- In line 54, we assign the value of 157 to the variable named
- Special_Index and use that variable name for the loop index for the
- following loop. After the loop is terminated, we display the value
- of the variable to see what the final value is, and when we run the
- program we find that the value did not change from that assigned,
- namely 157. This would suggest that even if we think we are
- explicitly defining the loop index variable, the system is actually
- making up an entirely new variable, using it, and throwing it away
- after the loop is terminated. Ada defines a loop variable as an
- automatic variable which is generated when needed and discarded
- when it is no longer needed. More will be said about automatic
- variables later. The important point to grasp from this is that
- Ada actually implicitly declares all loop variables for us.
-
-
-
- Page 5-5
-
- Chapter 5 - Control Structures
-
- LOOPS ARE IMPORTANT
- _________________________________________________________________
-
- You will have many opportunities to use all three forms of the
- loops discussed here, so it would pay you to study these loops
- until you are sure of what they are doing.
-
- Note the similarity of the three loops, and the fact that each is
- a complete Ada statement terminated with a semicolon. When we
- study the next two controls, you will see that they are very
- similar, and fit the same pattern.
-
- loop <...> end loop;
- while <BOOLEAN expression> loop <...> end loop;
- for <loop index> in <range> loop <...> end loop;
-
- Compile and execute this program taking care to observe the value
- of the variable named Special_Index when the loop is complete.
-
-
-
- NOW FOR CONDITIONAL STATEMENTS
- _________________________________________________________________
-
- We will spend some time now examining the ================
- program named IFDEMO.ADA and studying the IFDEMO.ADA
- conditional statements. Notice here, that we ================
- don't even try to define any variables, but we
- will let the system generate them for us as
- implicit loop indices. The Ada statement contained in lines 11
- through 21 is a for loop which we are now familiar with so we will
- use it to study how the if statement works. Notice that we display
- the value of Index, then use it in the first if statement in lines
- 14 through 16. This statement says that if the value stored in
- Index is less than 4, then execute the statements between the
- reserved words then and end if. In this case, we display the
- message in line 15 on the monitor. If the value stored in Index
- is not less than 4, we ignore the statement between the reserved
- words and go directly to line 17, where we encounter another if
- statement. This one displays a different line on the monitor if
- the value stored in Index is greater than 5. This is the simplest
- kind of if statement, and you will find it to be extremely useful,
- in fact, you used it in the previous two example programs.
-
- Moving ahead to the next loop, the one in lines 24 through 32, we
- find a more elaborate conditional, the if then else statement. In
- this case, if the value of Index is less than 15, one message is
- displayed and if not, a different message is displayed. In the
- prior loop, we used an if statement where a message may or may not
- have been displayed, but in this one, we use an if statement where
- one of the messages will be displayed every time. This, of course,
- is very similar to other programming languages.
-
-
-
- Page 5-6
-
- Chapter 5 - Control Structures
-
- NOW FOR THE MULTIWAY if STATEMENT
- _________________________________________________________________
-
- The loop in the statement contained in lines 35 through 47 is a bit
- more involved since there are several possibilities for selection
- of the line to be displayed. The word elsif is another reserved
- word. In this case, one and only one of the statements will be
- executed during each pass through the loop. The reserved word else
- is optional, and if it were not there, it would be possible that
- none of the conditions would be met and therefore none of the
- messages would be output. As many statements as desired can be
- placed between each of the reserved words such that a selection
- could cause a large number of statements to be executed
- sequentially.
-
- The last statement, given in lines 54 through 70, gives an
- illustration of nesting of loop and if statements. It should cause
- you no difficulty to understand the nesting and when you compile
- and run this program, you should have a good understanding of the
- output.
-
-
- THE MULTIWAY CONDITIONAL CONSTRUCT
- _________________________________________________________________
-
- Examine the program named CASEDEMO.ADA for an ================
- example of a program with a case statement, the CASEDEMO.ADA
- multiway conditional statement in Ada. Lines 11 ================
- through 23 comprise a loop with a case statement
- contained in it. Lines 15 through 21 contain
- the actual case statement. The variable How_Many is the case
- selector variable and each time we pass through the loop, we enter
- the case statement with a different value stored in the variable
- How_Many. When How_Many has the value of 4 through 6, we select
- the first path, and that path only, when it has the value of 7 or
- 9, we select the second path, etc. The vertical bar is the or
- operator here, and means if we have either of these cases, do this
- list of statements. The case statement is composed of the reserved
- words case, is, when, and end case in the manner shown. All cases
- must be accounted for in some way since it is an error to enter the
- case with a value of the case selector variable for which there is
- not something defined for it to do.
-
-
-
- WHAT IS THE => OPERATOR?
- _________________________________________________________________
-
- The "=>" operator is used in many places in an Ada program which
- we will see as we progress through this tutorial. It can be
- loosely defined as a "do this" operator, because in most places it
- can be read as "do this". For example in line 16, the line can be
- read "when How_Many is 4 through 6 do this Put statement".
-
-
- Page 5-7
-
- Chapter 5 - Control Structures
-
- A special case is provided which is the others case. It is
- optional, but if it is included, it must be the last one listed.
- This is illustrated in the other example in this program, the
- example in lines 30 through 40. This program is an illustration
- of more complex operations in each of the case branches, and it is
- expected that you should have no difficulty discerning the
- operation of each of the cases. This is one of the places where
- a null statement can be very useful as in line 38 where we really
- want to do nothing and can explicitly tell the compiler so. Be
- sure to compile and execute this program after you are sure you
- understand it. The case statement occurs rather infrequently in
- programming, but you will use it, so you should understand it
- thoroughly.
-
- This would be a good time to repeat a list which was given earlier
- in this chapter with the if and case statements added to illustrate
- the symmetry of the control structures and how well thought out
- they really are.
-
- loop <...> end loop;
- while <BOOLEAN expression> loop <...> end loop;
- for <loop index> in <range> loop <...> end loop;
- if <condition> then <...> end if;
- case <selector> is <...> end case;
-
-
-
- THE EVIL GOTO STATEMENT
- _________________________________________________________________
-
- The program named GOTODEMO.ADA illustrates use ================
- of the goto statement, a statement that has GOTODEMO.ADA
- fallen into ill repute among software engineers ================
- in recent years. This is because the goto can
- be used very abusively, leading to nearly
- unreadable spaghetti code. There may be instances when use of the
- goto statement will result in very clear code, and when those cases
- arise, it should be used. It has been proven that it is possible
- to write any logic without resorting to the goto statement by using
- only iteration (looping), conditional branching, and sequential
- statements and every effort should be made to rely on only these
- three elements.
-
- When Ada was being developed, the developers considered leaving the
- goto statement completely out of the language, but it was included
- for a very nebulous reason. It was felt that after Ada became a
- popular language, there would be a need to translate existing
- programs from older languages, such as FORTRAN, into Ada using
- automatic translators. Such a job would be impossible without the
- goto statement, so it was included in the Ada language. Modula-2
- is an example of a language structured very much like Ada, but
- without a goto statement defined as part of the language.
-
-
-
- Page 5-8
-
- Chapter 5 - Control Structures
-
- The goto is available as a part of the Ada language and is
- illustrated in the present example program. It should be no
- surprise to you that goto is another reserved word. The rather
- messy looking double "<<" and ">>" enclose the label to which you
- wish to jump and the rest should be easy for you to discern. Be
- sure to compile and run this program.
-
-
-
- FINALLY, A USEFUL PROGRAM
- _________________________________________________________________
-
- Examine the program named TEMPCONV.ADA for an ================
- example of a program that really does do TEMPCONV.ADA
- something useful, it generates a table of ================
- Centigrade to Fahrenheit temperature
- conversions, and it outputs a special message at
- the freezing point of water and another at the boiling point of
- water. Notice the program definition in the header that defines
- exactly what it does. You should have no trouble understanding
- every detail of this program, except of course for the rather
- cryptic code in lines 8, 9, 13, and 14. Although we have had a
- brief introduction to these, we will cover the details of them
- later in this tutorial.
-
-
-
- POOR CHOICE OF VARIABLE NAMES
- _________________________________________________________________
-
- Compile and run TEMPCONV.ADA, then examine the ================
- program named DUMBCONV.ADA for an example that DUMBCONV.ADA
- uses some poor choices of variable names and ================
- omits the comments. This program is the same
- program that you just studied because it does
- exactly the same thing, but I am sure you will find it a little
- harder to follow since the names are not very useful in helping
- you understand what it is doing. In the beginning of this
- tutorial, we studied a program named UGLYFORM.ADA which was
- absolutely ridiculous in style. No serious programmer would write
- such a program as that, but many programmers seem to be happy using
- a style similar to the present example.
-
- You should begin, even at this early point in your Ada programming
- development, to develop good formatting skills. Remember that Ada
- was designed to be written once and read many times, so the extra
- time spent keying in long, meaningful identifiers will be worth it
- to your colleagues when they find a need to study your code.
-
-
-
-
-
-
-
- Page 5-9
-
- Chapter 5 - Control Structures
-
- PROGRAMMING EXERCISES
- _________________________________________________________________
-
- 1. Write a program with looping and conditional statements that
- will output the year and your age during each year from the
- time you were born until you were 21. Include a special note
- the year you started school and another note the year you
- graduated from High School. Example output follows;
-
- In 1938, I was 0 years old.
- In 1939, I was 1 years old.
- ...
- ...
- In 1943, I was 5 years old, and started School.
- ...
- etc.
-
- 2. Rewrite exercise 1 using a case statement.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 5-10