【问题标题】:How to store results from while loop and sentinel in python?如何在python中存储while循环和哨兵的结果?
【发布时间】:2018-03-29 21:17:34
【问题描述】:

已经为此工作了几个小时,以为我把它搞砸了,但事实证明我错了。

任务是

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

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

  • 测验分数的列表。每个分数都在 0-10 的范围内。用户输入标记值 –1 以结束输入。放弃最低的测验分数。*

  • 项目分数的列表。每个分数都在 0-10 的范围内。用户输入标记值 –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")

这是打印出来的样子

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

不幸的是,我没有想到这样一个事实,即他可能希望这一切都在一个循环中,没有五十个 if 语句,也没有指定每个测验,他希望它在输入哨兵之前计算多长时间。但我不知道该怎么做?如何每次通过循环存储信息,以便获得所需的输出?

所以是的,我有点迷路了,任何方向都非常有帮助,我正在努力。多谢你们。

【问题讨论】:

    标签: python while-loop store sentinel


    【解决方案1】:

    如果您将输入存储为整数,您可能需要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)
    

    您会检查是否每次都需要退出,并且您还会有一种相当直观的方式来访问数据。

    【讨论】:

    • 这就是问题所在,他希望它继续循环直到用户输入标记“-1”。因此,基本上如果用户想要进行 3 次测验,他们只需在第四次被提示时输入“-1”。或者,如果有那么多测验,他们可以在循环中第 35 次这样做。这有意义吗?
    • 啊,我明白了。我认为 dicts 是要走的路——有一刻我改变了答案
    • 我不确定 dict 是否可以作为“测验#1 -----”“测验#2 ------”等不是用户输入的,应该是迅速的。有没有办法做到这一点?我们没有涵盖字典或数组,所以它很可能在带有哨兵的 while 循环中。
    • 我不确定你所说的哨兵是什么意思。在任何情况下,您都可以以编程方式添加“------”,为每个名称输入它是没有意义的。此外,“我们还没有涵盖 ”是我最讨厌的问题之一,绝对没有任何理由应该意味着什么。
    • 对不起,我完全理解了,我真的很想理解 while 循环,因为它对考试很重要,哨兵基本上是停止 while 循环的东西。
    【解决方案2】:

    您不希望有固定数量的测验或项目。相反,为每种类型的分数使用一个循环,这样您就可以一直询问,直到他们的用户没有更多分数要输入。

    我不会为你写完整的东西,但这是处理测验的一种方法:

    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
    

    还有其他方法可以做到这一点。例如,您可以跟踪在循环中更新的运行总和,而不是构建分数列表。您还需要跟踪到目前为止您看到的最低分数,以便您可以从最后的总和中减去最低分数。

    【讨论】:

    • 这应该只能使用while循环来完成,这让我发疯,有没有办法编写一个循环,其中变量从“测验#1 ------”变为“测验#2 -----”同时仍然存储我每次通过循环输入的值??
    • 你能澄清一下你所说的“只有while循环”是什么意思吗?我的答案到底包含什么不应该包含的内容?没有理智的方法可以用q1q2 等大量变量来解决这个问题。任何时候你发现自己给你的变量编号(并且超过2)你几乎肯定做错了。请改用列表。如果由于某种原因不允许使用列表,那么您可能想要计算运行总和。
    • 好的,我想我明白你现在所说的了。但是,当我运行它时出现错误,它在“if score == -1:”处说语法错误:不确定那里发生了什么。我认为你对变量编号和超过 2 是完全正确的。这绝对感觉不对。关于错误的任何想法?
    • 啊,我在上一行缺少括号。我已经更新以修复它。
    • 好吧,到目前为止,这是最有意义的,有没有办法计算测验分数被输入了多少次?我可以将 quiz_total 除以计数器或其他东西以获得平均值吗?
    【解决方案3】:

    我使用了一些将来可能会派上用场的东西,如果你继续用 python 编程(比如 generatorslist comprehension map)
    您可以尝试这样的事情:(可以简化,但为了清楚起见..)

    #!/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 不会添加到列表中

    【讨论】:

    • 这是一个超级乐于助人的人。我在这里计算平均值时遇到了麻烦。我想应该是((测验总数最低)/多少测验*10)+(程序总数/多少程序*10)+考试平均值+最终。那么这一切都应该由加权平均数来计算吗?我真的不确定
    • 这是一个超级乐于助人的人。我在这里计算平均值时遇到了麻烦。我想应该是((测验总数最低)/多少测验*10)+(程序总数/多少程序*10)+考试平均值+最终。那么这一切都应该由加权平均数来计算吗?我不确定计数器在这些中是如何工作的。
    • 很高兴我能帮上忙。好吧,关于平均值,应该在作业中说明..只有一个通用公式 mean = sum(values)/number_of_values ..我只能质疑这里可能是什么...也许 ((quiz_mean + proj_mean) *10 + ex_mean + final) / 4?另外,如果它可以帮助您实现目标,请接受给定的答案。
    猜你喜欢
    • 2020-04-07
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    相关资源
    最近更新 更多