How to store results from while loop and sentinel in python?

青春壹個敷衍的年華 提交于 2019-12-20 05:39:09

问题


been working on this for hours, thought i had it down but it turns out i have it all wrong.

The assignment is to

Write a program that computes your semester average and letter grade for the course

*******The user will enter these numbers:******

  • A list of quiz scores. Each score is in the range 0–10. The user enters the sentinel value –1 to end the input. Drop the lowest quiz score.*

  • A list of project scores. Each score is in the range 0–10. The user enters the senti- nel value –1 to end the input. Do not drop the lowest program score.*

  • Two midterm exam scores. Each score is in the range 0–100*

  • A final exam score. Each score is in the range 0–100."

And here is my code

    qsum = 0
    psum = 0
    count = 0

while True:
    q1 = float(input("Quiz #1 ----- "))
    if q1 < 0:
        break
    qsum = qsum + q1
    lowest = q1
    q2 = float(input("Quiz #2 ----- "))
    if q2 < 0:
        break
    qsum = qsum + q2
    if lowest > q2:
        lowest = q2
    q3 = float(input("Quiz #3 ----- "))
    if q3 < 0:
        break
    qsum = qsum + q3
    if lowest > q3:
        lowest = q3
    q4 = float(input("Quiz #4 ----- "))
    if q4 < 0:
        break
    qsum = qsum + q4
    if lowest > q4:
        lowest = q4
    q5 = float(input("Quiz #5 ----- "))
    if q5 < 0:
        break

print("Quiz #1 ----- ",q1)
print("Quiz #2 ----- ",q2)
print("Quiz #3 ----- ",q3)
print("Quiz #4 ----- ",q4)
print("Quiz #5 ----- ",q5)

while True:
        p1 = float(input("Program #1 -- "))
        if p1 < 0:
            break
        psum = psum + p1
        p2 = float(input("Program #2 -- "))
        if p2 < 0:
            break
        psum = psum + p2
        p3 = float(input("Program #3 -- "))
        if p3 < 0:
            break
    #and so on#

if 90 <= total <= 100:
    print("Grade ------ A")
if 80 <= total < 90:
    print("Grade ------ B")
if 70 <= total < 80:
    print("Grade ------ C")
if 60 <= total < 70:
    print("Grade ------ D")
if 0 <= total < 60:
    print("Grade ------ F")

Here is what the print out needs to look like

Quiz #1 ----- 10
Quiz #2 ----- 9.5
Quiz #3 ----- 8
Quiz #4 ----- 10
Quiz #5 –---- -1
Program #1 -- 9.5
Program #2 -- 10
Program #3 -- 9
Program #4 -- -1
Exam #1 ----- 85
Exam #2 ----- 92
Final Exam -- 81
Average ----- 89.4
Grade ------- B

Unfortunately i didnt think about the fact that he probably wants this all in one single loop without fifty if statements and without specifying each quiz, he wants it to count through however long until the sentinel is entered. But i cant figure out how to do that? How do i store the information each time through the loop so i can get the desired output?

So yeah im a little lost, any direction is very helpful, im struggling. Thanks guys.


回答1:


You don't want to have a fixed number of quizes or projects. Instead, use a loop for each of those types of scores, so you can keep asking until they user doesn't have any more scores to enter.

I'm not going to write the whole thing for you, but here's one way to handle the quizes:

quiz_scores = []

while True:
    score = int(input("Quiz #{} ----- ".format(len(quiz_scores)+1)))
    if score == -1:
        break
    quiz_scores.append(score)

quiz_total = sum(quiz_scores) - min(quiz_scores) # add up the scores, dropping the smallest

There are other ways you could do it. For instance, instead of building a list of scores, you could keep track of a running sum that you update in the loop. You'd also want to keep track of the smallest score you've seen so far, so that you could subtract the lowest score from the sum at the end.




回答2:


If you're storing the input as integers, you probably want a dict. You'd do something like this:

numberOfInputs = 10
names = ["Quiz 1", "Quiz 2", "Program 1", "Exam 1", "Final Exam"]
d = {}
for name in names:
    i = int(input(name.rjust(4)))
    if i < 0:
        quit()
    d[name] = i
# calculate the ave
for name in d:
    print(name)
print("Average: " + ave)

You'd check if you need to quit every time and you'd also have a fairly intuitive way of accessing the data.




回答3:


I used some things that might come in handy in the future, if you continue to program in python (like generators, list comprehension, map)
You can try something like this: (Can be simplified, but for clarity.. )

#!/bin/env python3

"""
Course grade computation
"""

# quiz.py

import sys


def take(name="", dtype='int', sentinel=-1):
    """:param dtype: string representing given input type"""
    counter = 0
    i = 0
    while True:
        i = eval(dtype)(input("{} #{}: ".format(name,counter)))  # We should use function map instead, but for simplicity...
        if i > 10 or i < -1:
            print("Invalid input: input must be in range(0,10) or -1", file=sys.stderr)
            continue
        if i == sentinel:  # <-- -1 will not be added to list
            break
        yield i
        counter += 1


def main():
    grades_map = dict([(100, 'A'), (90, 'B'), (80, 'C'), (70, 'D'), (60, 'F')])

    print("Input quiz scores")
    quizes = [i for i in take("Quiz", dtype='float')]
    quiz_sum = sum(quizes)
    quiz_lowest = min(quizes)

    print("Input project scores")
    projects = [i for i in take("Project", dtype='float')]
    proj_sum = sum(projects)

    print("Input exam scores")
    exam1, exam2, final = map(float, [input("Exam #1:"), input("Exam #2:"), input("Final:")])

    total = ...  # Didn't know what the total really is here
    average = ...  # And same here

    grade = grades_map[round(average, -1)]

    # Handle your prints as you wish


if __name__ == '__main__':
    main()


EDIT: Change in the generator so that -1 is not added to the list



来源:https://stackoverflow.com/questions/46802715/how-to-store-results-from-while-loop-and-sentinel-in-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!