Conditional loops

There are two types of conditional loops: DO WHILE and DO UNTIL. One or more expressions control both types of loops. However, DO WHILE loops test the expression before the loop executes the first time and repeat only when the expression is true. DO UNTIL loops test the expression after the loop executes at least once and repeat only when the expression is false.

DO WHILE loops

DO WHILE loops in a flowchart appear as follows:
This flowchart illustrates DO WHILE loops.
As REXX instructions, the flowchart example looks like:
DO WHILE expression /* expression must be true */
   instruction(s)
END

Use a DO WHILE loop when you want to execute the loop while a condition is true. DO WHILE tests the condition at the top of the loop. If the condition is initially false, the language processor never executes the loop.

You can use a DO WHILE loop instead of the DO FOREVER loop in the example of using the LEAVE instruction in Repetitive loops. However, you need to initialize the loop with a first case so the condition can be tested before you get into the loop. Notice the first case initialization in the first PULL of the following example.
Figure 1. Example Using DO WHILE
/******************************** REXX *******************************/
/* This progra uses a DO WHILE loop to send a string to a            */
/* user-written function for processing.                             */
/*********************************************************************/
PULL string                         /* Gets string from input stream */
DO WHILE string \= 'QUIT'
      result = process(string)      /* Calls a user-written function */
                                    /* to do processing on string.   */
      IF result = 0 THEN SAY "Processing complete for string:" string
      ELSE SAY "Processing failed for string:" string
      PULL string
END
SAY 'Program run complete.'

Exercise: using a DO WHILE loop

Write a program with a DO WHILE loop that uses as input a list of responses about whether passengers on a commuter airline want a window seat. The flight has 8 passengers and 4 window seats. Discontinue the loop when all the window seats are taken. After the loop ends, produce the number of window seats taken and the number of responses processed.

ANSWER
Figure 2. Possible solution
/******************************** REXX *******************************/
/* This program uses a DO WHILE loop to keep track of window seats   */
/* in an 8-seat commuter airline.                                    */
/*********************************************************************/

window_seats = 0          /* Initialize window seats to 0 */
passenger = 0             /* Initialize passengers to 0 */

DO WHILE (passenger < 8) & (window_seats \= 4)

/******************************************************************/
/* Continue while the program has not yet read the responses of   */
/* all 8 passengers and while all the window seats are not taken. */
/******************************************************************/

PULL window                  /* Gets "Y" or "N" from input stream */
passenger = passenger + 1   /* Increase number of passengers by 1 */
IF window = 'Y' THEN
   window_seats = window_seats + 1 /* Increase window seats by 1 */
ELSE NOP
END

SAY window_seats 'window seats were assigned.'
SAY passenger 'passengers were questioned.'

DO UNTIL loops

DO UNTIL loops in a flowchart appear as follows:
This flowchart illustrates DO UNTIL loops.
As REXX instructions, the flowchart example looks like:
DO UNTIL expression /* expression must be false */
   instruction(s)
END
Use DO UNTIL loops when a condition is not true and you want to execute the loop until the condition is true. The DO UNTIL loop tests the condition at the end of the loop and repeats only when the condition is false. Otherwise, the loop executes once and ends. For example:
Figure 3. Example using DO UNTIL
/******************************** REXX ******************************/
/* This program uses a DO UNTIL loop to ask for a password. If the  */
/* password is incorrect three times, the loop ends.                */
/********************************************************************/
password = 'abracadabra'
time = 0
DO UNTIL (answer = password) | (time = 3) 
   PULL answer                     /* Gets ANSWER from input stream */
   time = time + 1
END

Exercise: using a DO UNTIL loop

Change the program in the previous exercise from a DO WHILE to a DO UNTIL loop and achieve the same results. Remember that DO WHILE loops check for true expressions and DO UNTIL loops check for false expressions, which means their logical operators are often reversed.

ANSWER
Figure 4. Possible solution
/******************************** REXX *******************************/
/* This program uses a DO UNTIL loop to keep track of window seats   */
/* in an 8-seat commuter airline.                                    */
/*********************************************************************/

window_seats = 0 /* Initialize window seats to 0 */
passenger = 0 /* Initialize passengers to 0 */

DO UNTIL (passenger >= 8) | (window_seats = 4)

   /******************************************************************/
   /* Continue while the program has not yet read the responses of   */
   /* all 8 passengers and while all the window seats are not taken. */
   /******************************************************************/

   PULL window                /* Gets "Y" or "N" from input stream */
   passenger = passenger + 1 /* Increase number of passengers by 1 */
   IF window = 'Y' THEN
      window_seats = window_seats + 1 /* Increase window seats by 1 */
   ELSE NOP
END
SAY window_seats 'window seats were assigned.'
SAY passenger 'passengers were questioned.'