user3317056
user3317056

Reputation: 37

GPA Calc Python

I keep getting an error for this GPA calculator that is supposed to calculate your GPA based on 4 grades. Also the program needs to be terminated whenever a letter not named A,B,C,D,F is entered which i'm not sure how to do.

def GetName():
    name = raw_input ("Enter the student's name  ")
    grade1 = raw_input ("Enter a grade:  ")
    grade2 = raw_input ("Enter a grade:  ")
    grade3 = raw_input ("Enter a grade:  ")
    grade4 = raw_input ("Enter a grade:  ")
    return name, grade1, grade2, grade3, grade4

def GetGrades(grade1, grade2, grade3, grade4):
        if [grade1, grade2, grade3, grade4] == 'A' or [grade1, grade2, grade3, grade4] == 'a':
                [g1, g2, g3, g4] =4
        elif [grade1, grade2, grade3, grade4] == 'B' or [grade1, grade2, grade3, grade4] ==  'b':
                [g1, g2, g3, g4] =3
        elif [grade1, grade2, grade3, grade4] == 'C' or [grade1, grade2, grade3, grade4] == 'd':
                [g1, g2, g3, g4] =2
        elif [grade1, grade2, grade3, grade4] == 'D' or [grade1, grade2, grade3, grade4] == 'd':
                [g1, g2, g3, g4] =1
        elif [grade1, grade2, grade3, grade4] == 'F' or [grade1, grade2, grade3, grade4] == 'f':
                [g1, g2, g3, g4] =0
        else:
                return 'invalid grade'
        return g1, g2, g3, g4

def CalcGPA(g1,g2,g3,g4):
    GPA = (g1,g2,g3,g4)/4
    return GPA


def main(name, GPA):
    print "The GPA for", name,"is",GPA
    return 0

GetName()=name,grade1,grade2,grade3,grade4
GetGrades(grade1,grade2,grade3,grade4)=g1,g2,g3,g4
CalcGPA(g1,g2,g3,g4)=GPA
main(name,GPA)=0

Upvotes: 2

Views: 9818

Answers (2)

Hotpepper
Hotpepper

Reputation: 266

It looks like there are a few errors, here are some hints.

First in GetGrades Your list [grade1, grade2, grade3, grade4] will never equal 'A' it will only be equal to a list, so you will have to rethink how you are testing the grades.

Second you need the sum of the grade values, and want to divide by a float or python will remove the decimals (unless the g1-4 are entered with decimals).

def CalcGPA(g1,g2,g3,g4):
    GPA = sum(g1,g2,g3,g4)/4.0
    return GPA

Third the error is coming from the syntax of how you are calling the functions should be:

name,grade1,grade2,grade3,grade4= GetName()
g1,g2,g3,g4=GetGrades(grade1,grade2,grade3,grade4)
GPA = CalcGPA(g1,g2,g3,g4)
0=main(name,GPA)

As for getting the program to end when an invalid grade is entered, you may consider putting in a while loop that ends when the grad is invalid.

Upvotes: 0

Stephen Diehl
Stephen Diehl

Reputation: 8419

Assignment in Python assigns the value on the right hand side of the equal sign to the reference on the left-hand side, so the tuples you're unpacking need to be on the left.

def GetName():
    name = raw_input("Enter the student's name  ")
    grade1 = raw_input("Enter a grade:  ")
    grade2 = raw_input("Enter a grade:  ")
    grade3 = raw_input("Enter a grade:  ")
    grade4 = raw_input("Enter a grade:  ")
    return name, grade1, grade2, grade3, grade4

grademap = { 'A': 4, 'B': 3, 'C': 2, 'D': 1 }

def grade2int(x):
    try:
        return grademap[x.upper()]
    except KeyError:
        raise Exception('invalid grade: ' + x)

def GetGrades(grades):
    return map(grade2int, grades)

def CalcGPA(grades):
    return sum(grades)/len(grades)

def main(name, GPA):
    print "The GPA for", name, "is", GPA
    return 0

if __name__ == '__main__':
    name, grade1, grade2, grade3, grade4 = GetName()
    grades = GetGrades([grade1, grade2, grade3, grade4])
    GPA = CalcGPA(grades)
    main(name, GPA)

Upvotes: 1

Related Questions