[英]My program won't put the grade
对于本次作业,我们应该在Python中上一堂课,我们给它打3分,并且必须找到学生的平均分数和分数。 它可以工作,但是出现错误。 当我输入整数(例如73)三次时,它将显示字母等级。 但是,当我输入一个带有小数的数字(例如83.7)三次时,它没有显示字母等级,这是我们需要的数字。 当我输入带小数的数字时,是否有办法让它显示成绩? 为什么只对整数有效?
class grades:
def __init__(self,name,test1,test2,test3,avg):
self.name = name
self.test1 = test1
self.test2 = test2
self.test3 = test3
self.avg = avg
def getName(self):
return self.name
def getTest1(self):
return self.test1
def getTest2(self):
return self.test2
def getTest3(self):
return self.test3
def getAvg(self):
return self.avg
#main:
name = input("Enter the students name: ")
test1 = float(input("Enter the first score: "))
test2 = float(input("Enter the second score: "))
test3 = float(input("Enter the third score: "))
avg = float(test1 + test2 + test3) /3.0
grades1 = grades(name,test1,test2,test3,avg)
grades1.name
grades1.test1
grades1.test2
grades1.test3
grades1.avg
print("The student's name is:" ,grades1.name)
print(grades1.name +"'s test scores are:")
print("---------------------------:")
print("TEST1: \t\t\t",grades1.test1)
print("TEST2: \t\t\t",grades1.test2)
print("TEST3: \t\t\t",grades1.test3)
print(grades1.name +"'s average is: \t",grades1.avg)
##if avg <= 100.0 and avg >= 90.0:
## print(name +"'s grade is: \t A")
##elif avg <= 89.0 and avg >= 80.0:
## print(name +"'s grade is: \t B")
##elif avg <= 79.0 and avg >= 70.0:
## print(name +"'s grade is: \t C")
##elif avg <= 69.0 and avg >= 60.0:
## print(name +"'s grade is: \t D")
##elif avg <= 59.0 and avg >= 0.0:
## print(name +"'s grade is: \t E")
if avg >= 90.0 and avg <= 100.0:
print(name +"'s grade is: \t A")
elif avg >= 80.0 and avg <= 89.0:
print(name +"'s grade is: \t B")
elif avg >= 70.0 and avg <= 79.0:
print(name +"'s grade is: \t C")
elif avg >= 60.0 and avg <= 69.0:
print(name +"'s grade is: \t D")
elif avg >= 0.0 and avg <= 59.0:
print(name +"'s grade is: \t E")
之所以评论第一年级的原因是因为我尝试了两种方法都没有运气。
这是我尝试过的,但小数点后没有运气
Enter the students name: k
Enter the first score: 89.9
Enter the second score: 89.9
Enter the third score: 89.9
The student's name is: k
k's test scores are:
---------------------------:
TEST1: 89.9
TEST2: 89.9
TEST3: 89.9
k's average is: 89.90000000000002
问题出在您的if
s中。 您没有理由要求平均值在89
到90
之间, 79
到80
,以此类推。 另外,你不需要任何的and
S中的第一个外,因为每个先前的检查将证实什么and
s的再次检查。 您可以将大多数if
缩短为一个条件。
if avg > 100 or avg < 0:
#check for out of range grades first
print('Grade out of range')
elif avg >= 90.0:
print(name +"'s grade is: \t A")
# if the elif is reached, we already know that the grade is below 90, because
# it would have been handled by the previous if, if it were >=90
elif avg >= 80.0:
print(name +"'s grade is: \t B")
elif avg >= 70.0: # other wise the previous check will have caught it
print(name +"'s grade is: \t C")
elif avg >= 60.0:
print(name +"'s grade is: \t D")
elif avg >= 0.0:
print(name +"'s grade is: \t E") # should this be 'F' instead of 'E'?
只是因为我是一个好人;)
class Grades:
def __init__(self, name, *tests):
self.name = name
self.tests = list(tests)
@property
def avg(self):
return sum(self.tests)/len(self.tests)
@property
def letter_avg(self):
avg = self.avg
if avg > 100 or avg < 0:
raise ValueError('Grade out of range')
elif avg >= 90.0:
return 'A'
elif avg >= 80.0:
return 'B'
elif avg >= 70.0:
return 'B'
elif avg >= 60.0:
return 'D'
elif avg >= 0.0:
return 'F'
def __iter__(self):
return iter(self.tests)
def __getattr__(self, attr):
"""Allows access such as 'grades.test1' """
if attr.startswith('test'):
try:
num = int(attr[4:])-1
return self.tests[num]
except (ValueError, IndexError):
raise AttributeError('Invalid test number')
else:
raise AttributeError(
'Grades object has no attribute {0}'.format(attr))
def main():
name = input("Enter the students name: ")
test1 = float(input("Enter the first score: "))
test2 = float(input("Enter the second score: "))
test3 = float(input("Enter the third score: "))
grades1 = Grades(name, test1, test2, test3)
print("The student's name is:" , grades1.name)
print(grades1.name +"'s test scores are:")
print("---------------------------:")
for index, test in enumerate(grades1):
print('TEST{0}: \t\t\t{1}'.format(index, test))
print("{0}'s average is {1}".format(grades1.name, grades1.avg))
print("{0}'s average is \t {1}".format(grades1.name, grades1.letter_avg))
if __name__ == '__main__':
main()
您的if-elif
语句未涵盖所有可能的值。 例如,如果平均值为89.5,则没有任何块会捕获它。 解决此问题的最简单方法是从if-elif
语句中删除<=
子句,因为它们是不必要的。
if avg >= 90.0:
print(name +"'s grade is: \t A")
elif avg >= 80.0:
print(name +"'s grade is: \t B")
elif avg >= 70.0:
print(name +"'s grade is: \t C")
elif avg >= 60.0:
print(name +"'s grade is: \t D")
else:
print(name +"'s grade is: \t E")
你错过了一些边界情况下,如89.9
, 79.7
,像这样的平均数都不会打印任何级别在你的程序。
您需要这样的东西:
if avg >= 90.0 and avg <= 100.0:
print(name +"'s grade is: \t A")
elif avg >= 80.0 and avg < 90.0: #should be <90 not 89.0
print(name +"'s grade is: \t B")
elif avg >= 70.0 and avg < 80.0: #should be <80 not 79.0
print(name +"'s grade is: \t C")
elif avg >= 60.0 and avg < 70.0: #should be <70 not 69.0
print(name +"'s grade is: \t D")
elif avg >= 0.0 and avg < 60.0: #should be <60 not 59.0
print(name +"'s grade is: \t E")
演示:
The student's name is: dfgd
dfgd's test scores are:
---------------------------:
TEST1: 89.9
TEST2: 89.9
TEST3: 89.9
dfgd's average is: 89.90000000000002
dfgd's grade is: B
更新:
这里更干净的解决方案将是bisect
模块:
import bisect
lis = [0,60,70,80,90,100]
grades = list('EDCBA')
ind = bisect.bisect_right(lis,avg) -1
print(name +"'s grade is: \t {}".format(grades[ind]))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.