2017-02-23 7 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計算機では、2つのリスト(list2 [0] * list3 [0] ...)の一致する要素を移動して乗算する必要があります入力が何であれ。コードは、すべてが同じ長さであることを確認するために既にチェックしています。実行されると、エラー 'リストの範囲外のインデックス'が表示されます。予期しないエラー 'リストの範囲外のリスト'

私が聞いたことは、変数が範囲を超えて拡張されたときですが、 'y'がlist1の長さを超えてはいけないことがわかります(これはリスト2の長さ3つ)。私はwhile文でも '<'だけを使ってみました。

サイドノート:私はすでにこのプログラムが完全にフォーマットされていないことを知っていますが、私はクラス7週目にしかいません。

他のサイドノート:私は私のコンパイラ

+0

スタックトレースをもう一度見てください。どのコード行でエラーが発生するかを示します。 – DyZ

+0

それを私のポストに含めるのを忘れてしまった!これは具体的には でした。 weight = float(list3 [y] * list2 [y]) –

+0

補足として、 'list1 [i] .upper()not in'は、_first_グレードが無効であるかどうかをチェックします'list2 [a] .isdigit()== False'は最初の数字だけをチェックします。おそらくあなたが望むものではありません。 – DyZ

答えて

1

最初の問題のためにスパイダー3 IDEを使用していますと、あなたは上位方法上位プロパティ代わりに使用してきたということです。

リスト2が整数ではなく文字のリストであるという問題が発生します。これを試してみてください:

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

これらは、次のカップルの悩みを解決するはずです。

+0

かなりの数の問題を修正しました!しかし、 'weight = float(list3 [y] * list2 [y])'行の同じ 'IndexError:list index out of range'メッセージを返す。 –

+0

私は、問題がまだ** y <= len(list2)**をループコントロールとして使用します。 ** y Prune

+0

はい、このコードには複数の問題があります。この時点でのyの値は?死ぬ前に何回ループを通過しましたか?どのような値を操作しますか:すべての数字(文字列)を整数に正しく変換しましたか? 別問題がある場合は、新しい質問を投稿する必要があります。同じ問題がある場合は、コードの現在の状態を反映するためにこの質問を更新する必要があります。 – Prune

1
while y<len(list1): 

代わりの

while y<=len(list1): 

インデックスは、ほとんどの言語で、ゼロベースされているので、これはあなたが通常何をしたいです。

+0

私が掲示したコードには '='が含まれていました。私がトラブルシューティングをしている間、私は問題がなかったことを確かめるために、テストをしなかった。 –

関連する問題