`while`

and `for`

loops.Ask the user to input 3 positive integers and print the largest of them.

```
#include <iostream>
using namespace std;
int main() {
int x1 = 0, x2 = 0, x3 = 0;
cout << "Enter a positive integer: ";
cin >> x1;
cout << "Enter a positive integer: ";
cin >> x2;
cout << "Enter a positive integer: ";
cin >> x3;
int ans = x1;
// Can you prove that the following conditions are correct?
if ((x1 >= x2) && (x1 >= x3)) {
ans = x1;
}
else if (x2 >= x3) {
ans = x2;
}
else {
ans = x3;
}
cout << "The largest is " << ans << endl;
}
```

```
Enter a positive integer: 5
Enter a positive integer: 3
Enter a positive integer: 4
The largest is 5
```

`while`

loopAs an introduction to the `while`

loop, let’s write a program that that
prints out the integers from 10 to 1.

```
#include <iostream>
using namespace std;
int main() {
int n = 10;
// count down from 10 to 1
while (n > 0) {
cout << "n = " << n << endl;
n--;
}
return 0;
}
```

```
n = 10
n = 9
n = 8
n = 7
n = 6
n = 5
n = 4
n = 3
n = 2
n = 1
```

Now, let’s get back to the previous problem.
We want to write a program that asks for 3 positive integers and outputs the largest of them.
However, this time we are going to use the `while`

loop.

```
#include <iostream>
using namespace std;
int main() {
int n = 3;
int x = 0;
int largest = 0;
// n = how many integers the user has to enter
// we end the loop when n is zero
while (n > 0) {
cout << "Enter a positive integer: ";
cin >> x;
if (x > largest) { largest = x; }
n--;
}
cout << "The largest is " << largest << endl;
return 0;
}
```

```
Enter a positive integer: 4
Enter a positive integer: 6
Enter a positive integer: 3
The largest is 6
```

The problem with the program is that it does not check whether or not the input integers are positive! Can we fix that?

```
#include <iostream>
using namespace std;
int main() {
int n = 3;
int x = 0;
int largest = 0;
// n = how many integers the user has to enter
// we end the loop when n is zero
while (n > 0) {
cout << "Enter a positive integer: ";
cin >> x;
// we add an extra condition here:
// we want to compare this new integer x with the largest int so far
// only if the input integer was positive.
if (x > 0) {
if (x > largest) { largest = x; }
n--; // we can decrement n
}
else {
// otherwise we just print an error message:
cout << "It's not positive." << endl;
}
}
cout << "The largest is " << largest << endl;
return 0;
}
```

```
Enter a positive integer: 5
Enter a positive integer: 0
It's not positive.
Enter a positive integer: -2
It's not positive.
Enter a positive integer: 15
Enter a positive integer: 12
The largest is 15
```

`do while`

loop. “Please answer [y/n]?!”Write a program that asks the user to answer `y`

or `n`

.
If the input is something else, it should ask again, and keep asking until it gets a valid answer.

```
#include <iostream>
using namespace std;
int main (){
char ans; // this initial value of `ans` is irrelevant.
// To emphasize this fact, we don't initialize
// this variable here, although this is generally
// a bad idea, always initialize your variables.
do {
cout << "Please answer [y/n]?! ";
cin >> ans;
} while ( !(ans == 'y' || ans == 'n') );
// the condition (ans != 'y' && ans != 'n')
// would also work (De Morgan's Law)
cout << "Great!" << endl;
return 0;
}
```

```
Please answer [y/n]?! 1
Please answer [y/n]?! 5
Please answer [y/n]?! Q
Please answer [y/n]?! =
Please answer [y/n]?! Y
Please answer [y/n]?! N
Please answer [y/n]?! n
Great!
```

Observe that `do while`

loop is slightly different from the `while`

loop:
it checks the condition after executing the block, so the body
is guaranteed to be executed at least once.

Write a program that asks the user to input a non-negative integer, and then computes the sum of the digits of that number.

```
#include <iostream>
using namespace std;
int main (){
int n = 0; // this initial value for n is irrelevant
do {
cout << "Please enter a non-negative integer: ";
cin >> n;
} while (n < 0);
int sum = 0;
do {
sum += n % 10;
n = n / 10;
} while (n > 0);
cout << "The sum of digits is " << sum << endl;
return 0;
}
```

```
Please enter a non-negative integer: 99
The sum of digits is 18
```

`for`

loopThe `while`

and `do while`

loops are particularly useful when the number of iterations is not known in advance.
However most of the time, you need a loop to simply iterate through a certain range of values, say from 0 to 100.
For such regular tasks, `for`

loops may be more suitable.

**The for statement is ideal when we know exactly how many times we need to iterate the body of the loop.**

Consider an example:

```
#include <iostream>
using namespace std;
int main() {
int n = 5;
// print all integers from 0 to n-1:
for (int i = 0; i < n; ++i) {
cout << i << ' ';
}
cout << endl << endl;
// print a triangle
for (int i = 0; i < n; ++i) {
for (int j = 0; j <= i; ++j) {
cout << '*';
}
cout << endl;
}
return 0;
}
```

```
0 1 2 3 4
*
**
***
****
*****
```

`break`

and `continue`

Write a program that computes the first integer greater than 1000000 that is divisible by 51 and 117:

```
#include <iostream>
using namespace std;
int main() {
int i = 1000000;
while (true) {
i++;
if ((i % 51 == 0) && (i % 117 == 0))
break; // we break the loop when the condition is satisfied
}
cout << i << endl;
return 0;
}
```

```
1000467
```

Suggested reading: Why numbering should start at zero by E. W. Dijkstra.

This topic is quite subjective and there are many exceptions, but it’s worth mentioning:
If you need to run a loop for `n`

times, usually it’s better to do it as follows:

```
for(int i = 0; i < n; n++) {
...
}
```

rather than

```
for(int i = 1; i <= n; n++) {
...
}
```

Notice the difference in the bounds between the two cases.

The second variant often leads to unnecessary `+1`

or `-1`

terms in expressions, and in general
the code tends to be a bit messier. This is why it’s also easier to get off-by-one errors.

So, if you have a choice, I would suggest using the first method of iteration rather than the second. It also works well with C and C++ arrays, in which the index of the first element is always 0.

Another reference: the article in Wikipedia.