15-100 Lecture 11 (Friday, September 23, 2005)

Quick Quiz

  /* Please do not write a class specification or any method specification.
   * Instead, please write only a code segment. 
   * the code segment should print the numbers 1, 2, 3, .., 10
   */
   int number=1;
   while (number <=10) {

     System.out.println (number);
     
     number++
   }
  

The for loop

Let's consider the example of the quiz one more time. Take another look at it. Notice that there are really four parts:

This idiom is extremely common in programming. As a result, Java has a special loop construct to support it, the "for loop". The for loop is no more or less powerful than the while loop. In the mathematical sense, it is completely equivalent. But, as a matter of practice, choosing the right loop can make our code much more readable.

Let me introduce the for loop by way of example. Consider the following rewritten version of the loop above:

  for (int number=0; number <= 10; number++) {
    System.out.println (number);
  }
  

Do you see the relationship between the elements of the for loop and those of the while loop? Below is the general form of the for loop:

  for (initialization; predicate; increment) {
    body
  }
  

It is perfectly legal for any or all of the initialization, predicate, or increment to be empty. For example, consider the following example of a degenerate form of the for loop, which is exactly equivalent to the while loop:

  int number = 10;
  for (  ; number <= 10; ) {
    System.out.println (number);

    number++;
  }
  

Choosing the Right Loop

By selecting a for loop, when appropriate, we can make immediately clear to the reader:

By choosing a while loop, where appropriate, we can make immediately clear to the reader that:

break

What happens if we want to end a loop "early", without returning to the predicate? A "break" statement exists for this purpose. If a "break" occurs within a loop, the loop immediately ends. The code within the loop, after the break, does not get executed. And, the loop doesn't start over. It just ends. The flow of control picks up right after the loop.

Please consider the following typical example:

  String userInput;

  while (true) {
    System.out.println ("Enter the next number, or a blank line to quit.");
    userInput = br.readLine();

    if (userInput.equals(""))
      break;

    System.out.println ("You entered: " + userInput);
  }

  System.out.println ("Thanks for playing!");
  

Notice how the break allowed us to test a condition within the loop. It can also be combined with a predicate:

  System.out.println ("Please enter up to 10 numbers or a blank line to quit");
 
  for (int number=0; number <=10; number++) {
    System.out.print ("Enter number" + number + ": ");

    String userInput = br.readLine();

    if (userInput.equals(""))
      break;

    System.out.println ("For number" + number + ", you entered: " + userInput);
  }

  System.out.println ("Thanks for playing!");
  

continue

The break statement, as described above, immediately takes the flow of control out of a loop. By contrast, the continue statement causes the flow of control to go immediately back to the "top" of the loop, where the predicate is evaluated. If a continue is reached, the subsequent code is not executed, the increment of a for loop doesn't occur. Instead, "without passing go or collecting $500", control returns immediately to the top of the loop.

Please consider the example below:

  System.out.println ("Please enter five numbers between 1 and 10...");

  for (int count=0; count <= 5; count++) {
    System.out.print ("Please enter number " + count + ": ");
   
    int number = Integer.parseInt (br.readLine());

    // Note: This may be the first time you've seen ||
    // it means logical OR, in other words either-or, or at least one
    if ( (number < 1) || (number > 10) ) {
      System.out.println ("" + number + " isn't between 1 and 10, inclusive.");
      continue; // Back to the top, the "count" control variable will be unchanged
    }

    System.out.println ("Number " + count + " is " + number + ".");

    
  }