2013-07-05 3 views
2

Для этого задания мы должны сделать класс в 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 
+1

Я не могу воспроизвести это. Я ввел '75.3'' 76.3' и '77.3', и я получил среднее значение' C'. покажите ваш пример вход пожалуйста. –

+0

Вы получаете сообщение об ошибке или пропущены утверждения 'if-elif'? (Что кажется невозможным) –

+1

Что делать, если среднее значение составляет, например, 89,0 и 90,0? – chepner

ответ

1

Ваши 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") 
+0

Но не было бы необходимости, потому что это в основном говорит, что оно меньше или больше или равно числу. – ChrisD93

+0

Нет, потому что если первый 'if' терпит неудачу, то он будет' '' быть уже менее 90.0, так что условие в первом '' elif' -запросе не нужно. То же самое касается каждого последующего оператора 'elif' (вы уже устранили случай' <= 'в предыдущем' elif'. (См. Редактирование на мой ответ) – bogatron

0

Вы пропускаете некоторые граничные случаи, для например 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 

Update:

уборщик решение здесь будет 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])) 
+0

Поэтому я должен заменить цифры, такие как 79,89 и т. Д. С 80, 90? Потому что я просто положил то, что сказал в рубрику – ChrisD93

+0

@ThatOneDude да. –

+0

Спасибо, что это сработало :) – ChrisD93

3

Проблема в ваших if s. У вас нет случая, когда среднее значение между 89 и 90, 79 и 80 и так далее. Кроме того, вам не нужен ни один из and s за пределами первого, потому что каждый предыдущий чек подтвердит то, что снова проверяют and. Вы можете сократить большую часть своих 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'? 

и просто потому, что я хороший парень,)

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() 
Смежные вопросы