Python 我的项目赢了';I don’我不放分数

Python 我的项目赢了';I don’我不放分数,python,python-3.x,Python,Python 3.x,对于这项作业,我们应该用Python制作一个类,我们在其中输入3个分数,并找出学生的平均值和分数。它可以工作,但我有一个错误。当我输入三次整数(例如73)时,它将显示字母等级。但是当我输入一个十进制数(例如83.7)三次时,它不会显示字母等级,而这正是我们需要的数字。当我用小数点输入数字时,有没有办法让它显示分数?为什么它只适用于整数 class grades: def __init__(self,name,test1,test2,test3,avg): self

对于这项作业,我们应该用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")

您的
if elif
语句没有涵盖所有可能的值。例如,如果平均值为89.5,则所有块都不会捕捉到它。解决此问题的最简单方法是,如果elif语句没有覆盖所有可能的值,只需删除
您的
。例如,如果平均值为89.5,则所有块都不会捕捉到它。解决这一问题的最简单方法是删除缺少某些边界情况的
,例如
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
这里更干净的解决方案是
对分
模块:

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

您缺少一些边界情况,例如
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
这里更干净的解决方案是
对分
模块:

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

问题出在您的
if
s中。当平均值介于
89
90
之间、
79
80
之间时,您没有理由这样做。此外,您不需要第一个之外的任何
s,因为之前的每次检查都将确认
s再次检查的内容。您可以将大部分
if
s缩短为单个条件

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'?
如果平均值>100或平均值<0:
#首先检查超出范围的等级
打印('等级超出范围')
elif平均值>=90.0:
打印(姓名+“,成绩为:\t A”)
#如果达到elif,我们已经知道分数低于90,因为
#如果,如果>=90,它将由前一个处理
elif平均值>=80.0:
打印(名称+“,成绩为:\t B”)
elif avg>=70.0:#从其他方面看,上一次检查会发现它
打印(姓名+“,成绩为:\t C”)
elif平均值>=60.0:
打印(名称+““的等级为:\t D”)
elif平均值>=0.0:
print(name+“”的成绩是:\t E”)#这应该是“F”而不是“E”吗?
因为我是个好人;)

等级:
定义初始化(self、name、*测试):
self.name=名称
self.tests=列表(测试)
@财产
def平均值(自身):
返回和(自测试)/长度(自测试)
@财产
def字母_平均值(自身):
平均值=self.avg
如果平均值>100或平均值<0:
提升值错误('等级超出范围')
elif平均值>=90.0:
返回“A”
elif平均值>=80.0:
返回“B”
elif平均值>=70.0:
返回“B”
elif平均值>=60.0:
返回'D'
elif平均值>=0.0:
返回“F”
定义(自我):
返回iter(自测试)
def _ugetattr _;(self,attr):
“”“允许访问,如'grades.test1'”
如果属性开始使用(“测试”):
尝试:
num=int(attr[4:])-1
返回self.tests[num]
除了(ValueError,Indexer):
raise AttributeError('无效测试编号')
其他:
提高属性错误(
“Grades对象没有属性{0}”。格式(attr))
def main():
name=输入(“输入学生姓名:”)
test1=float(输入(“输入第一个分数:”))
test2=浮动(输入(“输入第二个分数:”))
test3=浮点(输入(“输入第三个分数:”)
等级1=等级(名称、测试1、测试2、测试3)
打印(“学生姓名:”,年级1。姓名)
打印(grades1.name+“”的考试分数为:”)
打印(“-------------------------------:”)
对于索引,在枚举中进行测试(等级1):
打印('TEST{0}:\t\t\t{1}'。格式(索引,TEST))
打印(“{0}的平均值为{1}”。格式(grades1.name,grades1.avg))
打印(“{0}的平均值为\t{1}”。格式(grades1.name,grades1.letter_avg))
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()

问题在于您的
if
s。当平均值介于
89
90
之间、
79
80
之间时,您没有理由这样做。此外,您不需要第一个之外的任何
s,因为之前的每次检查都将确认
s再次检查的内容。您可以将大部分
if
s缩短为单个条件

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'?
如果平均值>100或平均值<0:
#首先检查超出范围的等级
打印('等级超出范围')
elif平均值>=90.0:
打印(姓名+“,成绩为:\t A”)
#如果达到elif,我们已经知道分数低于90,因为
#如果,如果>=90,它将由前一个处理
elif平均值>=80.0:
打印(名称+“,成绩为:\t B”)
elif avg>=70.0:#从其他方面看,上一次检查会发现它
打印(姓名+“,成绩为:\t C”)
elif平均值>=60.0:
打印(名称+““的等级为:\t D”)
elif平均值>=0.0:
print(name+“”的成绩是:\t E”)#这应该是“F”而不是“E”吗?
因为我是个好人;)

等级:
定义初始化(self、name、*测试):
self.name=名称
self.tests=列表(测试)
@财产
def平均值(自身):
返回和(自测试)/长度(自测试)
@财产
def字母_平均值(自身):
平均值=self.avg
如果平均值>100或平均值<0:
提升值错误('等级超出范围')
elif平均值>=90.0:
返回“A”
elif平均值>=80.0:
返回“B”