简体   繁体   中英

Counting consecutive number of times in C++?

I am learning C++ to write a program to count how many consecutive times each distinct value appears in the input.

The code is

#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;
}

But it won't count the last set of numbers. For example: If I have input 5 5 5 3 3 4 4 4 4, the output is:

5 occurs 5 times. 3 occurs 2 times.

The last set result which is "4 occurs 4 times." does not show up.

I wonder what is wrong with the code.

Please help.

Thanks.

hc.

You seem to generate output only when (val == currVal) is false. What makes you think this will happen after the last 4 is read from input?

Your program is correct. Your while loop will exit when the condition is false

while (std::cin >> val)

The stream input will return false when you reach end of file (EOF), which from a terminal you can enter with Ctrl-D.

Try placing your input in a file, and your program will work. I've used the cat command to copy from the terminal's standard input and redirected to a file called input . You need to press Ctrd-D to tell cat that you are done. You could also create the input file using your favorite editor.

$ cat > input
5 5 5 3 3 4 4 4 4
<press Ctrl-D here>

Now invoke the program and redirect input from the file

$ ./test < input

Output is

5 occurs 3 times
3 occurs 2 times
4 occurs 4 times

See this related question on SO

the question on while (cin >> )

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM