We have time this semester for one more exposure to classes. Today is mainly a case study on writing a student grade tracker. We will not just define a Student class, but show how classes can hold complex data, and how they make programming easier.
For a review of classes you can re-read Chapter 14.
The grades.txt input file goes with this:
class Student:
def __init__(self, name, co, a):
self.name = name
self.company = co
self.alpha = a
self.grades = dict()
def add_grade(self, assignment, grade):
self.grades[assignment] = grade
def get_grade(self, assignment):
return self.grades[assignment]
def get_all_grades(self):
""" Return all grades sorted alphabetically by assignment """
allgrades = list()
for key in sorted(self.grades.keys()):
allgrades.append(self.grades[key])
return allgrades
def get_all_assignments(self):
""" Return all grades sorted alphabetically by assignment """
return sorted(self.grades.keys())
def print(self):
outstr = self.name + '\t'
if len(self.name) < 8:
outstr += '\t'
print(outstr + self.alpha + '\t' + self.company, end='\t')
print(self.get_all_grades())
def read_file(filename):
""" Create a List of students from a file of grades. """
students = list()
fh = open(filename)
for line in fh:
parts = line.split()
student = Student(parts[0], parts[1], parts[2])
for i in range(3,len(parts)):
student.add_grade('hw'+str(i-2), int(parts[i]))
students.append(student)
return students
# Read a file of student grades into a List of Student objects.
students = read_file('grades.txt')
for st in students:
st.print()
# USER INTERACTION
q = input('Query: ')
while q != 'quit':
# 'add brown hw5 98'
if q.startswith('add'):
add,name,assign,grade = q.split()
# Find the student and update grade!
for s in students:
if s.name.lower() == name.lower():
s.add_grade(assign, int(grade))
# 'get brown hw5'
elif q.startswith('get'):
get,name,assign = q.split()
# Find the student and update grade!
for s in students:
if s.name.lower() == name.lower():
print(s.get_grade(assign))
elif q == 'quit':
break
# 'brown' -- just a student's name
else:
name = q
# Find the student and print!
for s in students:
if s.name.lower() == name.lower():
s.print()
q = input('Query: ')