Adeel Malik
Adeel Malik

Reputation: 29

Incorrect sum when adding up numbers

Ok, here's the code to add indefinite numbers and present the sum in c++. But error is that addition taking place is of first number and the last digits of all the other numbers. For example if i want to add 30 + 40 + 55 + 70, my program counts 30 + 0 + 0 + 5 + 0 = 35. What am I doing wrong?

#include <iostream>

using namespace std;

int main()
{
    int num = 0;
    int sum = 0;

    cout << "Please enter numbers you want to add and end with N or n: ";

    for (;;)
    {
        cin >> num;
        sum += num;
        cout << endl;

        char indicator ('q');

        cin >> indicator;
        if (( indicator == 'n') || (indicator == 'N'))
            break;

    }
    cout << "The sum is: " << sum << " ";

    return 0;
}

Upvotes: 2

Views: 1756

Answers (3)

I'm not sure I fully understand what you are trying to do, but if you want to add a list of integers terminated by an N (or n) character, then you should read each entity as a string, see if it's the terminating character, and if it's not, then convert it to an integer:

int sum = 0;

while (true) {
    std::string s;
    std::cin >> s;

    if (tolower(s[0]) == 'n')
        break;

    sum += std::stoi(s);
}

Of course, the above code is only a skeleton -- in production code, you should always check if I/O operations succeeded and sanitize your input. A more complete example would be:

std::string s;
while (std::cin >> s) {
    int ch = s[0];

    if (ch > 0 && tolower(ch) == 'n')
        break;

    try {
        sum += std::stoi(s);
    } catch (const std::invalid_argument &e) {
        // handle conversion error
        break;
    } catch (const std::out_of_range &e) {
        // handle out-of-range error
        break;
    }
}

Upvotes: 4

James Kanze
James Kanze

Reputation: 153909

When you read the indicator, you extract the next non-blank character from the input stream; if the user has entered a number, this is the first digit. There are several ways of working around this.

The simplest is simply to loop on:

while ( std::cin >> num ) {
    sum += num;
}

The input will fail if the next input doesn't have the form of a number (without extracting it). (This also has the advantage that you don't use the input if it fails for some reason.) This is more or less the standard idiom.

If you really do want to check for the 'n', you can use std::cin.peek() to look ahead one character, without extracting it. This doesn't skip white space, however, so you might want to do std::cin >> std::ws first. In this case, you'd probably want to wrap it in a function:

bool
terminationRequested( std::istream& source )
{
    source >> std::ws;
    return source.peek() == 'n' || source.peek() == 'N';
}

and then

while ( ! terminationRequested( std::cin ) ) {
    int num;
    std::cin >> num;
    if ( ! std::cin ) {
        //  error...
    }
    sum += num;
}

You still have to check for a possible error after std::cin >> num. Otherwise, if the user enters "a", you'll end up in an endless loop, adding an undefined value to sum.

Alternatively, another frequent idiom is too use putback to return the indicator to the stream:

while ( std::cin >> indicator && indicator != 'n' && indicator != 'N' ) {
    std::cin.putback( indicator );
    std::cin >> num;
    if ( ! std::cin ) {
        //  error...
    }
    sum += num;
}

Again, you'll have to handle the errors somehow. Using num if std::cin >> num fails is undefined behavior.

Upvotes: 3

martin
martin

Reputation: 3239

It's because you read the indicator character which will remove and ignore the next input digit by the user from the input stream.

Upvotes: 2

Related Questions