【问题标题】:My program won't put the grade我的程序不会放成绩
【发布时间】:2013-07-06 04:59:36
【问题描述】:

对于这个作业,我们应该在 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

【问题讨论】:

  • 我无法重现这个。我输入了75.376.377.3,我得到了C 的平均值。请显示您的示例输入。
  • 您是否收到错误或if-elif 语句被跳过? (这似乎是不可能的)
  • 如果平均值介于(例如)89.0 和 90.0 之间怎么办?
  • @RyanHaining 这是我做的,但没用 输入学生姓名:k 输入第一个分数:89.9 输入第二个分数:89.9 输入第三个分数:89.9 学生姓名是: k k 的考试成绩是: ---------------: TEST1: 89.9 TEST2: 89.9 TEST3: 89.9 k的平均成绩是: 89.90000000000002
  • 这个脚本适合我。我输入了三个十进制值,它给了我一个字母等级。您能否显示有关该错误的更多信息? -- 向北

标签: python python-3.x


【解决方案1】:

问题在于您的ifs。当平均值介于 89907980 等之间时,你没有理由。此外,除了第一个之外,您不需要任何 ands,因为之前的每次检查都将确认 ands 再次检查的内容。您可以将大部分ifs 缩短为一个条件。

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

【讨论】:

    【解决方案2】:

    您的if-elif 语句并未涵盖所有可能的值。例如,如果平均值为 89.5,则没有一个块会捕捉到它。解决此问题的最简单方法是从您的 if-elif 语句中删除 &lt;= 子句,因为它们是不必要的。

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

    【讨论】:

    • 但是 = 不是必需的,因为它基本上是说它小于/大于或等于这个数字。
    • 不,因为如果第一个if失败,那么have已经小于90.0,所以第一个elif语句中的条件是不必要的。每个连续的elif 语句也是如此(您已经消除了之前elif 中的&lt;= 情况。(请参阅我的答案的编辑)
    【解决方案3】:

    您遗漏了一些边界情况,例如89.979.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]))
    

    【讨论】:

    • 所以我应该用 80,90 替换 79,89 等数字吗?因为我只是把标题所说的放了
    • 80.0 的值呢,它满足两个条件,你应该删除=,为了更清楚,我猜。 :)
    • @SukritKalra avg = 80.0 打印 B,我猜这是正确的。
    • 是的,因为它遇到了第一个elif,但我只是在谈论清晰度。 :)
    • @ThatOneDude 很高兴有帮助。 :) 如果对您有用,请随时 accept the answer
    猜你喜欢
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多