1

Can anyone tell me why when I input 1, 2, 3, and 4 into this code, my output is 6, 2, 3.00? I thought that every time my while loop evaluated to true it would increment the count by one, but the output is not making sense. It's taking the total of 3 of the numbers, but only 2 for the count? I'm probably just overlooking something so an extra pair of eyes would be awesome.

def calcAverage(total, count):
    average = float(total)/float(count)
    return format(average, ',.2f')


def inputPositiveInteger():
    str_in = input("Please enter a positive integer, anything else to quit: ")
    if not str_in.isdigit():
        return -1
    else:
        try:
            pos_int = int(str_in)
            return pos_int
        except:
            return -1


def main():
    total = 0
    count = 0
    while inputPositiveInteger() != -1:
        total += inputPositiveInteger()
        count += 1
    else:
        if count != 0:
            print(total)
            print(count)
            print(calcAverage(total, count))


main()
1
  • You call inputPositiveInteger(), checking it for being equal to -1 but otherwise ignoring its value, and then make another call to inputPositiveInteger(), and add that to your total and count (even if it's -1). Commented Oct 4, 2018 at 2:31

1 Answer 1

1

The error with your code is that on this piece of code...

while inputPositiveInteger() != -1:
        total += inputPositiveInteger()

You first call inputPositiveInteger and throw out the result in your condition. You need to store the result, otherwise one input out of two is ignored and the other is added even if it is -1.

num = inputPositiveInteger()
while num != -1:
        total += num 
        count += 1
        num = inputPositiveInteger()

Improvements

Although, note that your code can be significantly improved. See the comments in the following improved version of your code.

def calcAverage(total, count):
    # In Python3, / is a float division you do not need a float cast
    average = total / count 
    return format(average, ',.2f')


def inputPositiveInteger():
    str_int = input("Please enter a positive integer, anything else to quit: ")

    # If str_int.isdigit() returns True you can safely assume the int cast will work
    return int(str_int) if str_int.isdigit() else -1


# In Python, we usually rely on this format to run the main script
if __name__ == '__main__':
    # Using the second form of iter is a neat way to loop over user inputs
    nums = iter(inputPositiveInteger, -1)
    sum_ = sum(nums)

    print(sum_)
    print(len(nums))
    print(calcAverage(sum_, len(nums)))

One detail worth reading about in the above code is the second form of iter.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.