A selection (if) statement will execute either the clause exactly once. Most useful operations require that an operation be performed numerous times. A while loop is similar to a if statement, however, the body of the loop is repeatedly executed until the condition evaluates to false.
Program 1 prompts the user to enter an integer and the while loop continues looping until the user enters a negative number. If the user enters a negative number, the test n >= 0 will fail (it will evaluate to false) and will therefore continue executing at the // end of the loop.
Program 1. Prompting the user for an integer until the user enters 0.
#include <iostream> using namespace std; int main() { int n = 0; while ( n >= 0 ) { cout << "Enter a negative number to quit: " << endl; cin >> n; } // end of loop cout << "You entered a negative number. Bye." << endl; return 0; } |
If we replaced the keyword while with if, the program would still execute, however, the body of the if statement would run at most once.
We will now look at a more fun example which uses a mathematical observation.
Given an integer n, we will calculate a new integer based on the following rules:
Thus, given an integer like 3, if we keep applying this rule, we get:
It has been proposed that no matter what integer you start with, it must ultimately end up in the repetitive sequence 4, 2, 1, 4, 2, 1, ... .
Program 2 prompts the user for an integer and then continues making this calculation until we get a value of 1. It introduces a new operator % which returns the remainder of an integer division. For example, calculating 8 % 3 returns 2.
Program 2. Continue looping until the value n is 1.
#include <iostream> using namespace std; int main() { int n = 0; cout << "Enter a positive number: "; cin >> n; cout << n; while ( n != 1 ) { if ( n % 2 == 0 ) { // if the remainder of n/2 is 0, // that is, if n is even n = n/2; } else { n = 3*n + 1; } // print a space followed by the new number cout << " " << n; } // print an end-of-line character cout << endl; return 0; } |
One formula the ancient Greeks were aware of was that if, given any real number x, if you calculate
you get a better approximation of √2. Program 3 starts with the value of 2.0 as an the approximation to √2 and continues iterating until no change occurs.
Program 3. Approximating √2.
#include <iostream> using namespace std; int main() { double sqrt2 = 2.0; // continue looping while the next approximation // is different from the current approximation while ( sqrt2 != ( sqrt2/2 + 1/sqrt2 ) ) { sqrt2 = sqrt2/2 + 1/sqrt2; } cout << "The square root of two is approximately " << sqrt2 << endl; return 0; } |
Another example, which will lead to the next topic, is that of calculating the factorial of an integer. Program 4 calculates the factorial of an integer.
Program 4. Calculating the factorial of an integer.
#include <iostream> using namespace std; int main() { int n; cout << "Enter a positive integer: "; cin >> n; int result = 1; int m = 1; while ( m <= n ) { result = result * m; m = m + 1; } cout << n << "! = " << result << endl; return 0; } |
Suppse that the user entered a value of 4. The variable m is initialized to 1 thus we loop:
If you try this with a number like 15, you get the correct value of 15!. If you try this with a number like 32, you end up with an incorrect answer. In reality,
however, this is too large for an int which can store numbers between -231 to 231 − 1. What happens here is wrapping: if the result of multiplying two integers is greater than 231 − 1, all bits higher the 32nd bit are ignored and the result is treated interpreted as a 32 bit integer.
A similar example is calculating a Taylor approximation of the exponential function. Program 5 calculates the first 21 terms of the Taylor approximation.
Program 5. Approximating the exponential function.
#include <iostream> using namespace std; int main() { double x; cout << "Enter a real number: "; cin >> x; // Approximate exp(x) using a 21-term Taylor series: // // 1 2 1 3 1 20 // 1 + x + -- x + -- x + ... + --- x // 2! 3! 20! double result = 1.0; double term = 1.0; int n = 1; while ( n <= 20 ) { term = term * x / static_cast<double>( n ); result = result + term; n = n + 1; } cout << "The approximation of exp(" << x << ") is " << result << endl; return 0; } |
1. Create the game of hi-lo. Store an integer and continue prompting the user to enter a guess. If the guess equals the integer stored, print "You're right." and stop looping, if the guess is greater than the stored number, print "High...", otherwise, print "Low...".
2. Write a program which converts a decimal integer into a hexadecimal integer by following the loop:
Note, this prints the hexadecimal number in reverse order: it prints the least-significant hexadecimal digit first. For example, 523 should be printed as B02 which represents the hexadecimal number 20B16.