11.4. Counting¶
A good approach to problems like this is to think of simple functions that are easy to write, and that might turn out to be useful. Then you can combine them into a solution. This approach is sometimes called bottom-up design. Of course, it is not easy to know ahead of time which functions are likely to be useful, but as you gain experience you will have a better idea.
Also, it is not always obvious what sort of things are easy to write, but a good approach is to look for subproblems that fit a pattern you have seen before.
Back in Section [loopcount] we looked at a loop that traversed a string and counted the number of times a given letter appeared. You can think of this program as an example of a pattern called “traverse and count.” The elements of this pattern are:
A set or container that can be traversed, like a string or a vector.
A test that you can apply to each element in the container.
A counter that keeps track of how many elements pass the test.
In this case, I have a function in mind called how_many that counts
the number of elements in a vector that equal a given value. The
parameters are the vector and the integer value we are looking for. The
return value is the number of times the value appears.
std::size_t how_many (const std::vector<int>& data, int value) {
std::size_t count = 0;
for (const int& number: data) {
if (number == value) {
count++;
}
}
return count;
}
Take a look at the active code below which uses the how_many function. Run the
code to see how many times the target appears in the vector! Feel free to
modify the code and experiment around.
1#include <cstddef>
2#include <iostream>
3#include <random>
4#include <vector>
5
6// forward declarations
7std::size_t how_many (const vector<int>&, int);
8std::vector<int> make_vector (std::size_t, int);
9void print (const std::vector<int>&);
10
11int main() {
12 std::size_t num_values = 20;
13 int upper_bound = 9;
14 int target = 6;
15 std::vector<int> numbers = make_vector (num_values, upper_bound);
16 print (numbers);
17 cout << "\n_the number " << target << " appears "
18 << how_many(numbers,target) << " times in our vector!";
19}
Q1
Which of the following is the best definition of bottom-up design?
Q2
Construct a block of code that counts how many numbers are between lowerbound and upperbound inclusive.
-
} } return count; } -
if (vec[i] i >= lowerbound && vec[i] i <= upperbound) { count++; -
for (int i = 0; i < upperbound; i++) -
for (std::size_t i = 0; i < vec.size(); i++) { -
if (vec[i] i > lowerbound && vec[i] i < upperbound) { count++; -
std::size_t count = 0; -
std::size_t just_right (const vector<int>& vec, int lowerbound, int upperbound) {