if
StatementLike most languages, C++ provides an if
statement that supports conditional execution. We can use an if
to write a program to count how many consecutive times each distinct value appears in the input:
#include <iostream>
int main()
{
// currVal is the number we're counting; we'll read new values into val
int currVal = 0, val = 0;
// read first number and ensure that we have data to process
if (std::cin >> currVal) {
int cnt = 1; // store the count for the current value we're processing
while (std::cin >> val) { // read the remaining numbers
if (val == currVal) // if the values are the same
++cnt; // add 1 to cnt
else { // otherwise, print the count for the previous value
std::cout << currVal << " occurs "
<< cnt << " times" << std::endl;
currVal = val; // remember the new value
cnt = 1; // reset the counter
}
} // while loop ends here
// remember to print the count for the last value in the file
std::cout << currVal << " occurs "
<< cnt << " times" << std::endl;
} // outermost if statement ends here
return 0;
}
If we give this program the following input:
42 42 42 42 42 55 55 62 100 100 100
then the output should be
42 occurs 5 times
55 occurs 2 times
62 occurs 1 times
100 occurs 3 times
Much of the code in this program should be familiar from our earlier programs. We start by defining val
and currVal
: currVal
will keep track of which number we are counting; val
will hold each number as we read it from the input. What’s new are the two if
statements. The first if
if (std::cin >> currVal) {
// ...
} // outermost if statement ends here
ensures that the input is not empty. Like a while
, an if
evaluates a condition. The condition in the first if
reads a value into currVal
. If the read succeeds, then the condition is true and we execute the block that starts with the open curly following the condition. That block ends with the close curly just before the return
statement.
Once we know there are numbers to count, we define cnt
, which will count how often each distinct number occurs. We use a while
loop similar to the one in the previous section to (repeatedly) read numbers from the standard input.
The body of the while
is a block that contains the second if
statement:
if (val == currVal) // if the values are the same
++cnt; // add 1 to cnt
else { // otherwise, print the count for the previous value
std::cout << currVal << " occurs "
<< cnt << " times" << std::endl;
currVal = val; // remember the new value
cnt = 1; // reset the counter
}
The condition in this if
uses the equality operator (the ==
operator) to test whether val
is equal to currVal
. If so, we execute the statement that immediately follows the condition. That statement increments cnt
, indicating that we have seen currVal
once more.
If the condition is false—that is, if val
is not equal to currVal
—then we execute the statement following the else
. This statement is a block consisting of an output statement and two assignments. The output statement prints the count for the value we just finished processing. The assignments reset cnt
to 1
and currVal
to val
, which is the number we just read.
C++ uses =
for assignment and ==
for equality. Both operators can appear inside a condition. It is a common mistake to write =
when you mean ==
inside a condition.
Exercise 1.17: What happens in the program presented in this section if the input values are all equal? What if there are no duplicated values?
Exercise 1.18: Compile and run the program from this section giving it only equal values as input. Run it again giving it values in which no number is repeated.
Exercise 1.19: Revise the program you wrote for the exercises in § 1.4.1 (p. 13) that printed a range of numbers so that it handles input in which the first number is smaller than the second.