Python Forum
How to Stop Sentinel Value from Entering Final Output - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: How to Stop Sentinel Value from Entering Final Output (/thread-22370.html)



How to Stop Sentinel Value from Entering Final Output - ZQ12 - Nov-10-2019

I am writing a program using while loop to determine the highest and lowest of a user's inputted numbers, allowing the user to enter as many numbers as they wish, before using the sentinel value of -1 to exit. Then, the program should print the lowest and the highest inputted values. My problem is, the sentinel value keeps entering the loop as an input value and is being considered part of the range. If the user does not enter a number below my sentinel value of -1, then the sentinel value is what appears as the lowest. I've spent time trying to fix it but without success. Does anyone have any ideas as to why this is happening and what should be done to mend it? Here is my code:

minimum = int()
highest = int()
while(True):
    num = int(input("Enter a Number (Use -1 to Stop): " ))  
    if highest < num:
        highest = num
    if minimum > num:
        minimum = num  
    if(num == -1):
        break      
   
print("The interval is",minimum,"-", highest)



RE: How to Stop Sentinel Value from Entering Final Output - jefsummers - Nov-10-2019

Move lines 9 and 10 above line 5.


RE: How to Stop Sentinel Value from Entering Final Output - DeaD_EyE - Nov-10-2019

If you enter not a number, it will raise a ValueError.
If you enter for example abc, int can't convert this to an integer.
Catch the ValueError
Ask the user to use q or Q to quit the program.


# usually it's not good to
# set a name to None
# and afterwards to an integer
minimum = None # not set yet
maximum = None # not set yet
# if you forget this, you'll run
# into a TypeError, happens for example with comparison < or >


while True: # <- no parenthesis needed
    user_input = input("Enter a Number (q|Q to quit): ")
    if user_input.lower() == 'q':
        break
    try:
        num = int(user_input)
    except ValueError:
        print(user_input, 'is not a valid integer')
        # ask again for user input
        continue
    if minimum is None:
        # the first time minimum and maximum
        # is None
        # Just setting minimum
        # and maximum to the first user input
        # this this will never again executed
        minimum = num
        maximum = num
        # the code afterwards will be executed
        # but does no change to the value
    if maximum < num:
        maximum = num
    if minimum > num:
        minimum = num
    # fancy format string: Python 3.6+
    # first minimum and maximum is equal
    print(f"The interval is {minimum} -> {maximum}")


print('Program ends here')



RE: How to Stop Sentinel Value from Entering Final Output - perfringo - Nov-11-2019

Another approach would be use list and built-in min(), max() functions. With Python 3.8 walrus operator one can write:

answers = []

while (answer := input('Enter a number (q|Q) to quit): ').lower()) != 'q':
    try:
        answers.append(int(answer))
    except ValueError:
        print(f'Expected integer but got {answer!r}')

if answers:
    print(f'Mininum value {min(answers)} and maximum value {max(answers)}')
else:
    print('No integers entered!')