# student class
class Student:
    def __init__(self, name, exam_grade, height_in_cm):
        self.name = name
        self.grade = exam_grade
        self.height = height_in_cm
        
    def __str__(self):
        return "" + self.name + ", " + str(self.grade) + ", " + str(self.height) + ""
    
    def getName(self):
        return self.name
        
    def getGrade(self):
        return self.grade
        
    def getHeight(self):
        return self.height
    
    def isFailing(self):
        return self.grade < 65


# make a list of students
student_list = [Student("Alice", 92, 160), Student("Bob", 42, 165), Student("Chelsea", 76, 162)]

for i in range(0,len(student_list)):
    print(student_list[i]) # calls __str__ of Student class


# print students with failing grade
for i in range(0,len(student_list)):
    if( student_list[i].isFailing() ):
        print( student_list[i] )


# sort on "key"
def key_grade(student): 
    return student.getGrade()

student_list.sort(key=key_grade)
for i in range(0,len(student_list)):  
    print(student_list[i])


# DRILL: Course class
import random, string
from random import uniform
import matplotlib.pyplot as plt

class Course:
    def __init__(self, N):
        self.enrollment = N
        self.students = []
        for i in range(0,N):
            n = randomstring(10)
            g = round(uniform(0,100))
            a = round(uniform(150,200))
            self.students.append( Student(n,g,a) )
            
    def gradeHist(self):
        num_bins = 10
        grades = []
        for i in range(0,self.enrollment):
            grades.append( self.students[i].getGrade() )
            
        plt.hist(grades, num_bins, facecolor='blue', edgecolor='black')
        plt.xlabel( 'grade' )
        plt.ylabel( 'count' )
        plt.show()
        
    def __str__(self):
        for i in range(0,self.enrollment):
            print( self.students[i] )
        return "end of class"
        
def randomstring(length):
    return ''.join(random.choice(string.ascii_lowercase) for i in range(length))

C = Course(100)
print( C )
C.gradeHist()

