Reversing the test and display.
004100 DISPLAY-THE-WORDS.
004200
004300 DISPLAY "The words sorted in ASCII order are:".
004400 IF WORD-1 <>
004500 DISPLAY WORD-1
004600 DISPLAY WORD-2.
004700 IF WORD-1 NOT <>
004800 DISPLAY WORD-2
004900 DISPLAY WORD-1.
You should also try a version of wrdsrt01.cbl that tests incorrectly in DISPLAY-THE-WORDS, This version tests for LESS THAN and GREATER THAN. Try coding this one as badsrt.cbl and satisfy yourself that the results are identical unless you enter the exact string for WORD-1 and WORD-2, such as ABC and ABC. Note that the test fails to display anything for this condition.
An incorrect version of the test.
004100 DISPLAY-THE-WORDS.
004200
004300 DISPLAY "The words sorted in ASCII order are:".
004400 IF WORD-1 <>
004500 DISPLAY WORD-1
004600 DISPLAY WORD-2.
004700 IF WORD-1 > WORD-2
004800 DISPLAY WORD-2
004900 DISPLAY WORD-1.
The indentation chosen for the IF is completely arbitrary. As long as the IF starts in and stays within Area B, the arrangement is up to you. Listing 4.8 and Listing 4.9 are equally valid, but in Listing 4.9 it is difficult to tell what is going on, and Listing 4.8 looks a bit sloppy.
DO/DON'T:
DO indent IF conditions carefully. An IF controls all statements up to the period at the end of the sentence.
DON'T use sloppy indenting on an IF. Correct indentation gives a good visual clue of which parts of the program are controlled by the IF.
Sloppy indenting of an IF.
004100 DISPLAY-THE-WORDS.
004200
004300 DISPLAY "The words sorted in ASCII order are:".
004400 IF WORD-1 <>
004500 DISPLAY WORD-1
004600 DISPLAY WORD-2.
004700 IF WORD-1 NOT <>
004800 DISPLAY WORD-2
004900 DISPLAY WORD-1.
Failing to indent an IF.
004100 DISPLAY-THE-WORDS.
004200
004300 DISPLAY "The words sorted in ASCII order are:".
004400 IF WORD-1 <>
004500 DISPLAY WORD-1
004600 DISPLAY WORD-2.
004700 IF WORD-1 NOT <>
004800 DISPLAY WORD-2
004900 DISPLAY WORD-1.
Testing Multiple Conditions
An IF test also can be used to test more than one condition. Conditions can be combined by using AND, OR, or combinations of both. Listing 4.10 is a short menu program. A menu program is designed to display a series of options on the screen and let the user pick one option to execute. In this menu program, the user has a choice of displaying one of three possible messages.
Combining tests using OR.
000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. MENU01.
000300*------------------------------------------------
000400* THIS PROGRAM DISPLAYS A THREE CHOICE MENU OF
000500* MESSAGES THAT CAN BE DISPLAYED.
000600* THE USER ENTERS THE CHOICE, 1, 2 OR 3, AND
000700* THE APPROPRIATE MESSAGE IS DISPLAYED.
000800* AN ERROR MESSAGE IS DISPLAYED IF AN INVALID
000900* CHOICE IS MADE.
001000*------------------------------------------------
001100 ENVIRONMENT DIVISION.
001200 DATA DIVISION.
001300 WORKING-STORAGE SECTION.
001400
001500 01 MENU-PICK PIC 9.
001600
001700 PROCEDURE DIVISION.
001800 PROGRAM-BEGIN.
001900
002000 PERFORM GET-THE-MENU-PICK.
002100
002200 PERFORM DO-THE-MENU-PICK.
002300
002400 PROGRAM-DONE.
002500 STOP RUN.
002600
002700* LEVEL 2 ROUTINES
002800 GET-THE-MENU-PICK.
002900
003000 PERFORM DISPLAY-THE-MENU.
003100 PERFORM GET-THE-PICK.
003200
003300 DO-THE-MENU-PICK.
003400 IF MENU-PICK <>
003500 MENU-PICK > 3
003600 DISPLAY "Invalid selection".
003700
003800 IF MENU-PICK = 1
003900 DISPLAY "One for the money.".
004000
004100 IF MENU-PICK = 2
004200 DISPLAY "Two for the show.".
004300
004400 IF MENU-PICK = 3
004500 DISPLAY "Three to get ready.".
004600
004700* LEVEL 3 ROUTINES
004800 DISPLAY-THE-MENU.
004900 DISPLAY "Please enter the number of the message".
005000 DISPLAY "that you wish to display.".
005100* Display a blank line
005200 DISPLAY " ".
005300 DISPLAY "1. First Message".
005400 DISPLAY "2. Second Message".
005500 DISPLAY "3. Third Message".
005600* Display a blank line
005700 DISPLAY " ".
005800 DISPLAY "Your selection (1-3)?".
005900
006000 GET-THE-PICK.
006100 ACCEPT MENU-PICK.
006200
Here are sample output results from menu01.cbl for a valid and an invalid response:
OUTPUT:
Please enter the number of the message
that you wish to display.
1. First Message
2. Second Message
3. Third Message
Your selection (1-3)?
2
Two for the show.
C>
C>
Please enter the number of the message
that you wish to display.
1. First Message
2. Second Message
3. Third Message
Your selection (1-3)?
5
Invalid selection
C>
C>
ANALYSIS: The valid menu selections are 1, 2, and 3. The test that the value entered is in a range at lines 003400 through 003500, ending with a display of an invalid entry message at line 003600. If the entered MENU-PICK is less than 1 or greater than 3, it is invalid. Note that the OR on line 003400 combines the two tests within one IF. An OR test is true if either of the tests is true.
Read the comments in the program, because they explain some of the options used to improve the look of the displayed menu. The levels in the comments relate to the level of PERFORM. Routines in level 2 are being performed from the top level of the program, PROGRAM-BEGIN. Routines in level 3 are performed from within routines at level 2.
An AND test is true only if both conditions being tested are true. Listing 4.11 asks the user to enter a number between 10 and 100, excluding 10 and 100. Therefore, the valid range of entries for this program is 011 through 099. Remember that ACUCOBOL will require that you enter the leading zero.