- Relational Operators
- Loops
- Decisions
- Logical Operators
- Precedence Summary
- Other Control Statements
- Summary
- Questions
- Exercises
Other Control Statements
There are several other control statements in C++. We've already seen one, break, used in switch statements, but it can be used other places as well. Another statement, continue, is used only in loops, and a third, goto, should be avoided. Let's look at these statements in turn.
The break Statement
The break statement causes an exit from a loop, just as it does from a switch statement. The next statement after the break is executed is the statement following the loop. Figure 3.16 shows the operation of the break statement.
Figure 3.16 Operation of the break statement.
To demonstrate break, here's a program, showprim, that displays the distribution of prime numbers in graphical form:
// showprim.cpp // displays prime number distribution #include <iostream> using namespace std; #include <conio.h> //for getche() int main() { const unsigned char WHITE = 219; //solid color (primes) const unsigned char GRAY = 176; //gray (non primes) unsigned char ch; //for each screen position for(int count=0; count<80*25-1; count++) { ch = WHITE; //assume it's prime for(int j=2; j<count; j++) //divide by every integer from if(count%j == 0) //2 on up; if remainder is 0, { ch = GRAY; //it's not prime break; //break out of inner loop } cout << ch; //display the character } getch(); //freeze screen until keypress return 0; }
In effect every position on an 80-column by 25-line console screen is numbered, from 0 to 1999 (which is 80*251). If the number at a particular position is prime, the position is colored white; if it's not prime, it's colored gray.
Figure 3.17 shows the display. Strictly speaking, 0 and 1 are not considered prime, but they are shown as white to avoid complicating the program. Think of the columns across the top as being numbered from 0 to 79. Notice that no primes (except 2) appear in even-numbered columns, since they're all divisible by 2. Is there a pattern to the other numbers? The world of mathematics will be very excited if you find a pattern that allows you to predict whether any given number is prime.
Figure 3.17 Output of showprim program.
When the inner for loop determines that a number is not prime, it sets the character ch to GRAY, and then executes break to escape from the inner loop. (We don't want to exit from the entire program, as in the prime example, since we have a whole series of numbers to work on.)
Notice that break only takes you out of the innermost loop. This is true no matter what constructions are nested inside each other: break only takes you out of the construction in which it's embedded. If there were a switch within a loop, a break in the switch would only take you out of the switch, not out of the loop.
The last cout statement prints the graphics character, and then the loop continues, testing the next number for primeness.
ASCII Extended Character Set
This program uses two characters from the extended ASCII character set, the characters represented by the numbers from 128 to 255, as shown in Appendix A, "ASCII Table." The value 219 represents a solid-colored block (white on a black-and-white monitor), while 176 represents a gray block.
The showprim example uses getch() in the last line to keep the DOS prompt from scrolling the screen up when the program terminates. It freezes the screen until you press a key.
We use type unsigned char for the character variables in showprim, since it goes up to 255. Type char only goes up to 127.
The continue Statement
The break statement takes you out of the bottom of a loop. Sometimes, however, you want to go back to the top of the loop when something unexpected happens. Executing continue has this effect. (Strictly speaking, the continue takes you to the closing brace of the loop body, from which you may jump back to the top.) Figure 3.18 shows the operation of continue.
Here's a variation on the divdo example. This program, which we saw earlier in this chapter, does division, but it has a fatal flaw: If the user inputs 0 as the divisor, the program undergoes catastrophic failure and terminates with the runtime error message Divide Error. The revised version of the program, divdo2, deals with this situation more gracefully.
// divdo2.cpp // demonstrates CONTINUE statement #include <iostream> using namespace std; int main() { long dividend, divisor; char ch; do { cout << "Enter dividend: "; cin >> dividend; cout << "Enter divisor: "; cin >> divisor; if( divisor == 0 ) //if attempt to { //divide by 0, cout << "Illegal divisor\n"; //display message continue; //go to top of loop } cout << "Quotient is " << dividend / divisor; cout << ", remainder is " << dividend % divisor; cout << "\nDo another? (y/n): "; cin >> ch; } while( ch != 'n' ); return 0; }
Figure 3.18 Operation of the continue statement.
If the user inputs 0 for the divisor, the program prints an error message and, using continue, returns to the top of the loop to issue the prompts again. Here's some sample output:
Enter dividend: 10 Enter divisor: 0 Illegal divisor Enter dividend:
A break statement in this situation would cause an exit from the do loop and the program, an unnecessarily harsh response.
Notice that we've made the format of the do loop a little more compact. The do is on the same line as the opening brace, and the while is on the same line as the closing brace.
The goto Statement
We'll mention the goto statement here for the sake of completenessnot because it's a good idea to use it. If you've had any exposure to structured programming principles, you know that gotos can quickly lead to "spaghetti" code that is difficult to understand and debug. There is almost never any need to use goto, as is demonstrated by its absence from the program examples in this book.
With that lecture out of the way, here's the syntax. You insert a label in your code at the desired destination for the goto. The label is always terminated by a colon. The keyword goto, followed by this label name, then takes you to the label. The following code fragment demonstrates this approach.
goto SystemCrash; // other statements SystemCrash: // control will begin here following goto