如何在python中存储while循环和sentinel的结果?

2024-10-01 13:32:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我花了好几个小时在这上面工作,以为我搞错了。在

任务是

编写一个计算你的学期平均成绩和字母成绩的程序

*******用户将输入这些数字:*****

  • 测验分数列表。每个分数在0-10之间。用户输入sentinel值-1结束输入。放弃最低测验分数。*

  • 项目得分列表。每个分数在0-10之间。用户输入senti-nel值-1结束输入。不要降低课程最低分数。*

  • 两个期中考试成绩。每个分数在0–100之间*

  • 期末考试成绩。每个分数在0到100之间。“

这是我的密码

    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")

以下是打印输出需要的外观

^{pr2}$

不幸的是,我没有考虑到这样一个事实:他可能希望在一个循环中,没有50个if语句,也没有指定每个测验,他希望它在哨兵进入之前一直计数。但我不知道怎么做?如何通过循环存储每次的信息,以便获得所需的输出?在

所以是的,我有点迷路了,任何方向都很有帮助,我在挣扎。谢谢各位。在


Tags: inputiffloatquiz分数totalprintbreak
3条回答

你不想有固定数量的测验或项目。相反,对每种类型的分数都使用循环,这样你就可以一直询问,直到用户没有更多的分数可以输入为止。在

我不打算把整件事都写给你,但有一种方法可以处理测验:

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

你还有其他方法可以做到。你可以保持一个循环,而不是更新一个循环的分数。你还需要记录到目前为止你看到的最小的分数,这样你就可以从最后的总和中减去最低的分数。在

如果将输入存储为整数,则可能需要一个dict。你应该这样做:

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)

每次你都会检查是否需要退出,而且你也会有一个相当直观的方式来访问数据。在

如果您继续用python编程(比如generatorslist comprehensionmap
你可以尝试这样的方法:(可以简化,但为了清晰起见…)

#!/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()


编辑:更改生成器,使-1不添加到列表中

相关问题 更多 >