In [48]:
class Student:

    def __init__(self,n,m):
        self.name = n
        self.major = m
        self.courses = []

    def add_course(self,co,g):
        self.courses.append((co,g))

    def gpa(self):
        gc = {'A': 4, 'B': 3, 'C': 2, 'D': 1, 'F': 0}
        points = 0
        credits = 0
        for c in self.courses:
            #credits += c.credits
            cr = c[0].get_credits()
            credits += cr
            points += gc[c[1]] * cr
        if credits > 0:
            return points/credits
        else:
            return None
        
    def __str__(self):
        return self.name
In [49]:
class Course:

    def __init__(self,co,cr,t):
        self.cno = co
        self.credits = cr
        self.title = t
        self.students = []

    def get_credits(self):
        return self.credits

    def add_student(self,s):
        self.students.append(s)

    def __str__(self):
        return self.cno
In [50]:
s1 = Student("Alice","CSC")
s2 = Student("Bob","MATH")
s3 = Student("Charlie","CSC")

c1 = Course("CSC1301",4,"Intro to CS I",)
c2 = Course("CSC1302",4,"Intro to CS II")
In [51]:
s1.add_course(c1,"A")
c1.add_student(s1)
s3.add_course(c1,"B")
c1.add_student(s3)
s1.add_course(c2,"A")
c2.add_student(s1)
In [52]:
print(s1.gpa())
4.0
In [53]:
print(s3.gpa())
3.0
In [54]:
print(s2.gpa())
None