Lecture Notes - Chapter 9, Iteration
Download
Report
Transcript Lecture Notes - Chapter 9, Iteration
Chapter 9
Iteration: Beyond the Basic
PERFORM
9-1
Simple PERFORM
Format
PERFORM [paragraph-name-1]
•
•
Executes all instructions in named
paragraph
Then transfers control to instruction
following PERFORM
9-2
Simple PERFORM
• Use to execute a paragraph from
different points in a program
• Use to modularize program
– Write each set of related instructions as
separate module or paragraph
– Use PERFORM paragraph-name to
execute each module as needed
9-3
0000-MAIN-MODULE. all first modules should start with 000-something.
PERFORM 1000-INITIALIZATION
PERFORM 2000-PROCESS-RENTALS
UNTIL F-MORE-RECORDS = "N"
PERFORM 3000-TERMINATION
STOP RUN.
*****************************************************************
* FUNCTION: OPENS FILES, PRINTS HEADINGS, DOES PRIMING READ OF
*
CUSTOMER FILE
* CALLS:
100-GET-DATE-AND-TIME
*
1200-PRINT-HEADINGS
* CALLED BY: N/A
*****************************************************************
1000-INITIALIZATION.
OPEN INPUT CUSTOMER-FILE
OUTPUT PRINT-FILE
PERFORM 1100-GET-DATE-AND-TIME
PERFORM 1200-PRINT-HEADINGS
READ CUSTOMER-FILE
AT END
MOVE "N" TO F-MORE-RECORDS
NOT AT END
ADD 1 TO A-TOTAL-RECORDS-READ
END-READ.
9-4
In-Line PERFORM
Format
PERFORM
.
.
.
Statements to
be executed
END-PERFORM
• Use when only a few statements are to
be executed
• Modularize with PERFORM paragraphname when many statements required
9-5
Nested PERFORM
• PERFORM may be one of instructions
in range of another PERFORM
…
Perform 200-Paragraph
….
.
.
200-Paragraph.
…
Perform 500-Paragraph
Nested
PERFORM
9-6
0000-MAIN-MODULE. all first modules should start with 000-something.
PERFORM 1000-INITIALIZATION
PERFORM 2000-PROCESS-RENTALS
UNTIL F-MORE-RECORDS = "N"
PERFORM 3000-TERMINATION
STOP RUN.
*****************************************************************
* FUNCTION: OPENS FILES, PRINTS HEADINGS, DOES PRIMING READ OF
*
CUSTOMER FILE
* CALLS:
100-GET-DATE-AND-TIME
*
1200-PRINT-HEADINGS
* CALLED BY: N/A
*****************************************************************
1000-INITIALIZATION.
OPEN INPUT CUSTOMER-FILE
OUTPUT PRINT-FILE
PERFORM 1100-GET-DATE-AND-TIME
PERFORM 1200-PRINT-HEADINGS
Nested performs
READ CUSTOMER-FILE
AT END
MOVE "N" TO F-MORE-RECORDS
NOT AT END
ADD 1 TO A-TOTAL-RECORDS-READ
END-READ.
9-7
Nested In-Line PERFORM
• In-line PERFORMs can include nested in-line
PERFORMs or PERFORMs with paragraph-name
Perform
. . .
Perform
. . .
End-Perform
. . .
End-Perform
Big thing to remember:
CAREFULLY indent (always!!!)
Always use scope terminators!!!
9-8
Executing Group of Paragraphs
Format
PERFORM paragraph-name-1
THROUGH
paragraph-name-2
THRU
• Use expanded format to execute all
statements, including other paragraphs, from
paragraph-name-1 through paragraph-name-2
9-9
GO TO Statement
Format
GO TO paragraph-name-1
• Does not return control to following
statement like PERFORM
• Transfers control permanently to
another paragraph
9-10
PERFORM … THRU, GO TO,
AND EXIT STATEMENTS
• Both still permitted but not used a lot in
new COBOL programs
• Provide less control, greater risk of logic
errors than using PERFORMs
• EXIT statement used with these as end
point in PERFORM …THRU paragraph
also should be avoided
9-11
The old way: but such code still clearly lives and breathes!!!
Perform 400-do-it thru 499-do-it-exit.
….
….
400-do-it.
….
perform 800-who-cares.
….
if a > b
Go to 420-do-more
else
move c to d.
420-do-more.
if some-condition
go to 499-do-it-exit.
430-do-still-more.
….
499-do-it-exit.
exit.
Notice the performs;
Note also the falling
into paragraphs;
potential bouncing
around within a
performed group,
etc….
Note: this code still
works. Handle with
care!!!
9-12
PERFORM UNTIL (traditional)
Format
PERFORM [paragraph-name-1]
UNTIL condition-1
• Repeats statements in paragraph until
condition is true
• Called iteration or loop
9-13
In-Line PERFORM UNTIL
• No paragraph name follows PERFORM
• Instead statements to be repeated
placed between PERFORM UNTIL …
END-PERFORM
9-14
PERFORM para UNTIL
(traditional PERFORM)
• A paragraph name is included in the
PERFORM
• Instead statements to be repeatedly
executed in the PERFORMed
paragraph until some condition
becomes true.
• a MainStay of modern structured
programming.
9-15
0000-MAIN-MODULE..
PERFORM 1000-INITIALIZATION
PERFORM 2000-PROCESS-RENTALS
UNTIL F-MORE-RECORDS = “N”
PERFORM 3000-TERMINATION
9-16
Looping Principles
Coding a Loop with PERFORM
• Often want to perform some action a
certain number of times
• Use a field as a counter to count
number of times action is repeated
• Set field to zero initially, then increment
it by 1 each time action repeated
• When field equals number of times
action is to be repeated, condition is
met and loop ends
9-17
ALL LOOPS MUST:
• Have their loop control variable / condition
initialized prior to entering loop or as part of
the loop control itself.
• Controlling variable’s value / values must be
altered in each iteration of the loop
• There must be a test to determine when to
exit the loop.
• Most loops have a single pre-test and
multiple post-tests.
– Implies one may never enter the loop, but once in,
control will be checked EACH iteration looking to
terminate the loop.
9-18
Loop Example
• Display the message 'Hello' 3 times
Move Zeros To Count
Perform Until Count = 3
Display 'Hello'
Add 1 To Count
End-Perform
Note: initialization outslide of loop, pre-test,
body of loop, adjusting control variable,
post-test…
9-19
Loop Example
• Count initialized to zero so not equal to 3
when condition checked first time (pre-test)
• Hello displayed on screen and Count
incremented to 1 (variable adjusted)
Move Zeros To Count
Perform Until Count = 3
Display 'Hello'
Add 1 To Count
End-Perform
Repeated post-tests, increments, and executions.
9-20
Loop Example
• Condition checked again and still not
met (1 not equal to 3) so in-line
statements repeated again
• ‘Hello’ displayed second time and Count
incremented to 2
Move Zeros To Count
Perform Until Count = 3
Display 'Hello'
Add 1 To Count
End-Perform
9-21
Loop Example
• Count not equal to 3 so ‘Hello’ displayed
third time and Count incremented to 3
• Condition met when checked again so
loop ends
Move Zeros To Count
Perform Until Count = 3
Display 'Hello'
Add 1 To Count
End-Perform
9-22
Coding a Loop
• Precede loop by instruction to initialize
field to be tested
• Include PERFORM UNTIL …that
repeats until field tested reaches
desired value
• Include instruction in loop to change
value of field tested so that condition is
eventually met
9-23
Condition Tested First
• Condition tested before paragraph or inline statements executed even once
• If condition met on first test, paragraph
or statements executed zero times
Example
Move 6 To X
Perform 300-Process-Rtn
Until X > 5
Paragraph
executed 0 times
Showing pre-test.
9-24
Ending PERFORM UNTIL
• Loop stops when condition is true
• One of instructions in loop should
change identifier used in condition
Move 0 To Y
Example
Perform Until Y > 10
. . .
Add 1 To Y
Changes Y so condition
End-Perform
eventually met
In-line PERFORM MUST have scope
terminator!
9-25
Avoid Loop Errors (infinite loop)
• Consider this loop
Move Zeros To Count
Perform Until Count = 5
Display Out-Message
End-Perform
• Error occurs because no instruction
included to change Count from zero
• DISPLAY executed over and over again
because condition never met
9-26
Avoid Loop Errors
• Loop that executes repeatedly without
end called infinite loop
• On mainframe program automatically
terminated after fixed period of time
• On PCs press interrupt keys (e.g.,
Escape key, Ctrl + Break keys) to
terminate program
• May see program freeze or scroll
‘forever…’
9-27
Alternative Loop
Move 1 To Count
Perform Until Count > 3
Display 'Hello'
Add 1 To Count
End-Perform
• Initialization value for Count now 1
• Condition uses '>' instead of '='
9-28
Alternative Loop
• Loop still displays Hello 3 times when
Count = 1, 2 and 3
• When Count = 4, loop condition met
• Testing for '>' or '>=' less prone to
infinite loops than testing for '='
• If value of Count exceeds 3 but is never
exactly equal to 3, loop will still
terminate
9-29
PERFORM … TIMES
• Executes a sequence of steps a fixed
number of times
• No counter needed
• Loop below executes paragraph 300Print-Rtn 5 times
Perform 300-Print-Rtn 5 Times
9-30
PERFORM … TIMES
• May use field whose value represents
number of times to repeat loop
• Field must be numeric, containing only
positive integers or 0
• Loop below performs 300-Print-Rtn ten
times
Move 10 To How-Many
Perform 300-Print-Rtn (perform para)
How-Many Times
9-31
PERFORM … TIMES
• Also used with in-line loop
• Loop below executes MULTIPLY
statement 3 times
Move 2 To Num
Perform 3 Times (in-line perform)
Multiply 2 By Num
End-Perform
• Num equals 16 when loop ends
9-32
Loop Example
Sum even integers from 2 through 10
• Initialize a field to first number to be
added (2)
• Increment field by 2 so it equals even
numbers (2, 4, 6, 8, 10)
• Use this field's value to
– Test in condition
– Add to a total field to find sum
9-33
Code for Loop Example
• Sum even integers from 2 through 10
Move 0 To Total
Move 2 To Count
Perform Until Count > 10
Add Count To Total
Add 2 To Count
End-Perform
Display 'Total=', Total
Initialize field to be tested
Test field until it
reaches desired value
Change field tested so
condition eventually met
Result: Total = 30
How many times does loop iterate? What is value of Count9-34
when loop terminates??? (test questions.)
Nested PERFORMs
• One of statements in PERFORM loop
may be another PERFORM loop
• A loop within another loop is called a
nested loop
9-35
Nested PERFORM Example
• Assume 50 records will be read in as 5
groups of 10 records
• Amount fields of each group are to be
added and a total printed
• Five totals, one for each group of 10
records will be printed
9-36
Nested PERFORM Pseudocode
Perform 5 Times
Outer loop
Perform 10 Times
Inner loop
Read record from file and
add its amount to group total
End-Read
End-Perform
Perform Print-Group-Total
End-Perform
Used a lot for ‘control breaks’ (chapter 10).
9-37
Nested PERFORM Example
• Outer loop repeats these steps 5 times
– Performs inner loop to read in 10 records
– Prints group total
• Inner loop repeated 50 Times or 10 times
each time outer loop is repeated
• Notice that step to print group total is not
part or inner loop
– Executed only 5 times or once each time outer
loop executed
9-38
TIMES vs UNTIL
• Use PERFORM … TIMES if you know in
advance the number of times loop statements
are to be executed
• Use PERFORM … UNTIL if number of times
loop repeated is needed for output or
calculations
• Very VERY oftentimes, you do NOT know the
number of times you will need to loop,
though…
9-39
PERFORM VARYING
Format
PERFORM VARYING identifier-1
identifier-2
identifier-3
FROM
BY
integer-1
integer-2
UNTIL condition-1
statement-1 …
END-PERFORM
This guy does it all! (super for array
processing!)
9-40
PERFORM VARYING
• Repeatedly executes statements in loop while
varying value of a field
• First identifier-1 is given FROM value
– That is, initialization!
• Condition then tested (pre-test first time)
• Executes statements in loop if condition not
met
• Then adds BY value to identifier-1 (that is,
increments/adjusts control variable) and
repeats condition test (post test – may be
executed many times.)
9-41
PERFORM VARYING Example
Perform Varying Ctr From 1 By 1
Until Ctr > 5
Display 'Ctr = ', Ctr
End-Perform
• Sets Ctr to 1, since Ctr > 5 not true, executes
DISPLAY statement
• Increments Ctr by 1, tests condition again
• How many times does loop iterate? Value of
9-42
Ctr when loop terminates?
PERFORM VARYING Execution
CTR
1
2
3
4
5
6
Condition
1 > 5 false
2 > 5 false
3 > 5 false
4 > 5 false
5 > 5 false
6 > 5 true
Output
Ctr = 1
Ctr = 2
Ctr = 3
Ctr = 4
Ctr = 5
(loop ends)
9-43
PERFORM VARYING Examples
• Finds sum of odd numbers from 1 to 25
Move 0 To Total
Perform Varying Ctr From 1 By 2
Until Ctr > 25
Add Ctr To Total
End-Perform
Output:
Display 'Total = ', Total
Total = 169
Value of control variable at end? Number of iterations?
9-44
PERFORM VARYING Examples
• Statements to be repeated may also be
in separate paragraph
Perform 300-Process-Rtn
Varying Ctr From 1 By 1
Until Ctr > 20
• Executes 300-Process-Rtn 20 Times
9-45
Nested PERFORM VARYING
• May include a PERFORM VARYING loop as
one of statements in another PERFORM
VARYING loop
• Each time outer loop is repeated, inner loop
is executed until its condition is met
• Following example prints the times tables for
numbers 1 to 9
• Nested performs and perform…varyings
are used extensively in array processing.
9-46
Print Times Tables
Perform Varying N1 From 1 By 1
Outer loop
Until N1 > 9
Perform Varying N2 From 1 By 1Inner loop
Until N2 > 9
Compute Product = N1 * N2
Display N, ' * ' M ' = ', Product
End-Perform
End-Perform
Notice indentation and alignment!
9-47
Print Times Tables Execution
N1
1
1
...
1
2
2
...
2
N2
1
2
...
9
1
2
...
9
Output
1*1=1
1*2=2
...
1*9=9
2*1=2
2*2=4
...
2 * 9 = 18
Outer loop
time
first
Inner loop
repeats 9 times
Outer loop
second time
Inner loop
repeats 9 times
9-48
Print Times Tables Execution
• Outer loop repeated seven more times
• Each time, statements in inner loop are
repeated 9 times
– N2 initialized to 1 and incremented by 1
each time through inner loop until N2 > 9
• Outer loop ends after printing 9's table
9-49
PERFORM UNTIL loop
• Condition tested before statements in
loop executed first time
• If condition met on first test, statements
not executed at all
• Can specify that condition be tested
after instructions executed first time
• Then instructions always executed at
least once
9-50
PERFORM WITH TEST AFTER
Format
PERFORM [paragraph-name-1]
BEFORE
[WITH TEST
]
AFTER
UNTIL condition-1
Same as accustomed Perform, but with
no pre-test!
9-51
TEST AFTER Example
Example
Perform With Test After
Until Opt-Num >=1 And <= 5
Display 'Select option (1-5)'
Accept Opt-Num
End-Perform
See where this might be used?
9-52
TEST AFTER Example
• Condition is not checked before loop
begins
• DISPLAY and ACCEPT for user to enter
Opt-Num always executed at least once
• Checks Opt-Num after user types in
value for first time
• If Opt-Num not a value from 1 to 5, loop
is repeated
9-53
Chapter Summary
• Formats of PERFORM Statement
– Simple PERFORM
• In-Line PERFORM
PERFORM … END-PERFORM
• PERFORM paragraph-name-1
[THRU paragraph-name-2]
• Causes execution of instructions in named
paragraph(s)
• After paragraph executed, control returned to
statement after PERFORM
9-54
Chapter Summary
• Formats of PERFORM Statement
– PERFORM UNTIL repeats instructions until
a condition is met
• Condition may be tested before or after
instructions are executed
– PERFORM … TIMES
• Use when you know exact number of times
loop statements are to be executed
9-55
Chapter Summary
• Formats of PERFORM Statement
– PERFORM VARYING
• Automatically initializes and changes value of
loop counter
• Nested PERFORMS (PERFORM
statements within PERFORM
statements) allowed
9-56
Chapter Summary
• In-line PERFORMs permitted with all
PERFORM options
– Code does not need to be in separate
paragraph
– Terminated with END-PERFORM
9-57
Copyright © 2003 John Wiley & Sons, Inc. All rights reserved.
Reproduction or translation of this work beyond that permitted in Section
117 of the 1976 United States Copyright Act without the express written
permission of the copyright owner is unlawful. Request for further
information should be addressed to the Permissions Department, John
Wiley & Sons, Inc. The purchaser may make back-up copies for his/her
own use only and not for distribution or resale. The Publisher assumes no
responsibility for errors, omissions, or damages, caused by the use of these
programs or from the use of the information contained herein.
9-58