2017-02-23 9 views
0
""" 
calcGPA 
@author: nick young 
""" 
# GPA Calculator. Weights letter grade and credit hours and divides to return final GPA value 

def calcGPA(): 
    error=('Improper Input, asshole. GPA is -1.') #Snarky error message 
    i=0 #tally numbers to count from 
    a=0 
    x=0 
    y=0 
    list1=list(input("Enter your letter grades earned on an A-F scale:")) 
    list2=list(input('Enter the credit hours earned for each course in the same order as your first input \nNo spaces:')) 
    list3=[] #empty list to append weighted values to 

    if len(list1)!=len(list2) or len(list1)+len(list2)<=0:  #verifies lists are same length and not empty 
     print(error) 
    elif list1[i].upper() not in ['A','B','C','D','F']:   
     print(error) 
     i=i+1 
    elif list2[a].isdigit()==False:        
     a=a+1 
     print(error) 

    for letter in list1:   #loop determines letter grade and returns numeric value per element in list1 
     if letter.upper=='A': #runs through until each element in list1 has been converted into a numeric value to be weighted 
      list3.append(4*list2[x]) 
      x=x+1 
     elif letter.upper=='B': 
      list3.append(3*list2[x]) 
      x=x+1 
     elif letter.upper=='C': 
      list3.append(2*list2[x]) 
      x=x+1  
     elif letter.upper=='D': 
      list3.append(1*list2[x]) 
      x=x+1 
     elif letter.upper=='F': 
      list3.append(0) 
      x=x+1 

     y=0 
    while y<=len(list1): #loop gathers the collective weight of each class to be divided 

     weight=float(0)  
     weight=float(list3[y]*list2[y]) 
     y=y+1 

    gpa=float(weight/sum(list2))  
    print(gpa)  

calcGPA() 

Для этого калькулятора GPA мне нужно переместить и умножить соответствующие элементы в двух списках (list2 [0] * list3 [0] ...) для длины независимо от ввода. Код уже проверяет, что все имеет одинаковую длину. Когда он запускается, появляется индекс списка ошибок за пределами диапазона.Неопределенная ошибка «индекс индекса за пределами диапазона»

После некоторого поиска в Google, я слышу, что это означает, что переменная выходит за пределы диапазона, который должен быть, но из того, что я вижу 'y', не должно выходить за пределы длины списка1 (что также было бы длиной списка 2 и три). Я попытался использовать только «<» в инструкции while.

Замечание: Я знаю, что эта программа, вероятно, не отформатирована отлично, но я только на седьмой неделе моего класса.

Другая сторона Примечание: Я использую Spyder 3 IDE для моего компилятора

+0

Посмотрите еще раз на трассировку стека. Он сообщает, какая строка кода вызывает ошибку. – DyZ

+0

Забыл включить это в мой пост! Он специально сделал это для weight = float (list3 [y] * list2 [y]) –

+0

В качестве примечания стороны 'list1 [i] .upper() not in ...' проверяется, только если оценка _first_ недействительна , а 'list2 [a] .isdigit() == False' проверяет только первое число. Наверное, не то, что вы хотели. – DyZ

ответ

1

Первоначальная проблема заключается в том, что вы использовали верхнийсвойство вместо методаверхней. Вам нужно это:

for letter in list1: 
    if letter.upper()=='A': 
     list3.append(4*list2[x]) 

Затем вы попадете в проблему, когда list2 представляет собой список символов, а не целых чисел. Попробуйте следующее:

 list3.append(4*int(list2[x])) 

Те, кто доставит вас на следующую пару горбов.

+0

Исправлено приличное количество проблем! Тем не менее, все еще вернул то же самое сообщение IndexError: list index out of range для строки 'weight = float (list3 [y] * list2 [y])' –

+0

Я подозреваю, что проблема в том, что у вас все еще есть ** y <= len (list2) ** в качестве управления контуром. Вам нужно ** y Prune

+0

Да, у вас есть несколько проблем в этом коде. Каково значение y на данный момент? Сколько раз вы делали это через цикл до его смерти? На каких значениях он работает: правильно ли вы преобразовали все цифры (строки) в целые числа? Если у вас есть отдельная проблема, нам нужно, чтобы вы опубликовали новый вопрос. Если у вас такая же проблема, нам нужно, чтобы вы обновили этот вопрос, чтобы отразить текущее состояние вашего кода. – Prune

1
while y<len(list1): 

вместо

while y<=len(list1): 

Индексы с нуля в большинстве языков, так это то, что вы обычно хотите сделать.

+0

Код, который я написал, включает в себя '='. В то время как я был устранением неполадок, я пробовал без него, просто чтобы быть уверенным, что это не проблема. –