2012-04-26 52 views
1

我真的难住了。我正在为我的老师编写一个程序(使用Python 3 btw),这样他就可以将这段代码给学生计算他们的成绩,而不是等待他们的成绩单。我只是一个初学者所以尽量保持答案简单请:dPython - 计算冲突。需要某种范围变量

好了这里的问题。我拥有代码所需的所有输入。输入是这样工作的。 A = 5 B = 4 C = 3 D = 2 E = 1.如果你得到了直线A,你会得到50分,等等,但如果结果是35分,所有等级计算器都会崩溃。因为如果它> 30它的一个B,但如果它> 20它的一个C,但> 20和> 30同时打印。因为他们都执行如果结果大于30,我不知道如何让这个将打印说,“B”,如果它是31到40

这是代码

a = eval(input()) 
b = eval(input()) 
c = eval(input()) 
d = eval(input()) 
e = eval(input()) 
f = eval(input()) 
g = eval(input()) 
h = eval(input()) 
i = eval(input()) 
j = eval(input()) 

average = a + b + c + d + e + f + g + h + i + j 
print(average) 

if average >41: 
    print(" Grade A ") 

if average >31: 
    print(" Grade B") 

if average >21: 
    print(" Grade C") 

if average >11 : 
    print(" Grade D") 

if average >0 
    print(" Grade E") 

任何帮助将大大赏识!谢谢。

+0

怎么样的'如果-elif'构建? – bezmax 2012-04-26 08:24:59

+0

''eval(input())''是一个非常糟糕的做法。为什么不使用''int(input)''? – 2012-04-26 15:03:09

回答

5

做你想要什么,最好的方法是定义一组数据。 if/elif块工作,但笨拙,并且需要很多额外的打字:

import sys 

mark_boundaries = [("A", 41), ("B", 31), ("C", 21), ("D", 11), ("C", 0)] 

try: 
    marks = [] 
    for i in range(10): 
     marks.append(int(input())) 
except ValueError: 
    print("You entered an invalid mark, it must be a number.") 
    sys.exit(1) 

average = sum(marks) #I'd just like to note the misleading variable name here. 
#average = sum(marks)/len(marks) #This would be the actual average mark. 
print(average) 

for mark, boundary in mark_boundaries: 
    if average >= boundary: 
     print("Grade "+mark) 
     break #We only want to print out the best grade they got. 

下面我们用一个元组列表来定义我们的边界。我们检查从最高到最低,如果我们匹配,就会突然出现(所以它不会'落到'低分)。

同样,你可以看到,我使用了一个循环来收集在标记的数据。一个好的迹象表明,在编程时你正在以低效率的方式做某件事,就是你复制并粘贴(或一次又一次地输出)一些代码。这通常意味着你需要把它放在一个循环中,或者使它成为一个函数。我也使用int(input())而不是eval(input()),这是一个更安全的选择,因为它不允许执行用户想要的任何东西。如果用户输入的不是数字,它也可以很好地捕捉到ValueError异常。

注意,一个积极进取的人可能看对元组的列表,并认为dict将是一个不错的替代品。虽然在大多数情况下都是这样,在这种情况下,我们需要订购是正确的 - 在一个dict顺序是任意的,并可能导致我们先检查得分较低,给他们一个更低的分数比他们应得的。

正如一个音符,这是完全可以做到

if 31 < average < 41: #Equivalent to `if 31 < average and average < 41:` 
    print("Grade B") 

Python编写的。也就是说,对于这种用法,这意味着比使用列表和循环或if/elif更多的输入。

+0

感谢您的答复!不过,对我来说这太复杂了。下面的答案帮助我最多。林肯定当我进一步进入蟒蛇我会明白你在暗示什么 – 2012-04-27 00:25:40

+0

@约瑟夫史密斯你不明白的是什么? – 2012-04-27 00:27:35

+0

许多命令(语句,函数..)无论你怎么称呼它们。我从未见过。你显然知道很多关于编程的知识,但是我只是真的开始了。无论如何感谢您的答案:D当我有点更有经验时,一定会回来! – 2012-04-27 06:10:41

3

基本上,这是你想要什么:

if average >41: 
    print(" Grade A ") 
elif average >31: 
    print(" Grade B") 
elif average >21: 
    print(" Grade C") 
elif average >11 : 
    print(" Grade D") 
elif average >0 
    print(" Grade E") 
else 
    print("You broke the system") 

elif是短期的else if,因此,如果没有执行以前if/elif块只执行。

+0

Max,我以前试过Elif解决方案,但是你做了一个不同的方法,我会给它一个去。 – 2012-04-26 23:03:51