1.分析和阅读P84图8-1所示的IntSet类,对IntSet类进行修改和扩充,要求:
(1)集合内的元素个数是有限的;
(2)实现集合的交,并,差操作。
class IntSet:
def __init__(self,n=0):
self.vals=[]
self.n=n
def __insert__(self,e):
if len(self.vals)<self.n:
if e not in self. vals:
self.vals.append(e)
else:
print("集合已满")
def __member__(self, e):
return e in self.vals
def __remove__(self, e):
try:
self.vals.remove(e)
except ValueError:
return str(e) + ' not found'
def __getMembers__(self):
return self.vals[:]
def __Union__(self,v):
result=IntSet()
result.vals= self.vals[:]
for e in v.vals:
if e not in self.vals:
result.vals += [e]
return result
def __intersect__(self,v):
result = IntSet()
for e in self.vals:
if e in v.vals:
result.vals += [e]
return result
def __except__(self,v):
result =IntSet()
for e in self.vals:
if e in v.vals:
result.vals += [e]
re =IntSet()
for s in self.vals:
if s not in result.vals:
re.vals += [s]
return re
def __str__(self):
self.vals.sort()
result = ''
for e in self.vals:
result = result + str(e) + ','
return '{'+ result[:-1] + '}'
a=IntSet(4)
a.__insert__(2)
a.__insert__(3)
a.__insert__(4)
a.__insert__(6)
print('整数集合a:{}'.format(a))
a.__insert__(7)
print('判断5是否在整数集合a中:{}'.format(a.__member__(5)))
print('删除5:{}'.format(a.__remove__(5)))
print('a转化为列表:{}'.format(a.__getMembers__()))
b=IntSet(5)
b.__insert__(3)
b.__insert__(4)
b.__insert__(7)
b.__insert__(8)
b.__insert__(9)
print('整数集合b:{}'.format(b))
print('b转化为列表:{}'.format(b.__getMembers__()))
print('整数集合a和整数集合b的并集为:{}'.format(a.__Union__(b)))
print('整数集合a和整数集合b的交集为:{}'.format(a.__intersect__(b)))
print('整数集合a和整数集合b的差集为:{}'.format(a.__except__(b)))
2.阅读P90图8-3所示的MITPerson类,P92图8-4所示的学生类和P94图8-5所示的Grades类,设计一个学生类Student和一个成绩类Grade,其中,Student类要求如下:
(1)包含姓名和学号两个属性;
(2)学号从10000起编号;
Grade类要求如下:
(1)使用列表记录学生信息;
(2)使用字典将学生的学号映射到成绩列表;
(3)添加学生
(4)添加成绩;
(5)查询学生的成绩
(6)计算所有学生的最高分,最低分和平均分
(7)打印排序后的成绩。
import math
class Student:
nextid=10000
def __init__(self,name):
self.name=name
self.id=Student.nextid
Student.nextid+=1
def __getid__(self):
return self.id
def __lt__(self,others):
return self.id<others.id
def __str__(self):
return 'id:{},name:{}'.format(self.id, self.name)
class Grades:
def __init__(self):
self.students = []
self.grades = {}
self.isSorted = True
def __addStudent__(self, student):
if student in self.students:
raise ValueError('Duplicate student')
self.students.append(student)
self.grades[student.__getid__()] = []
self.isSorted = False
def __addGrade__(self, student, grade):
try:
self.grades[student.__getid__()]. append(grade)
except ValueError:
return 'Student not in mapping'
def __getGrades__(self, student):
try:
return self. grades[student.__getid__()][:]
except ValueError:
return 'Student not in mapping'
def __getStudents__(self):
return self. students[:]#返回一个学生列表的副本
def __sortedStudents__(self):
if not self. isSorted:
self.students. sort()
self.isSorted = True
return self.students[:]
def gradeReport(course):
report =''
maxG=0
minG =0
tot=0.0
numGrades = 0
L=[]
for s in course.__sortedStudents__():
numGrades += 1
for g in course.__getGrades__(s):
L.append(g)
maxG=max(L)
minG=min(L)
tot += g
average =round(tot / numGrades,2)
report = 'max grade is '+str(maxG)+ '\n' +'min grade is '+str(minG)+ '\n'+'mean grade is ' + str(average)+report
return report
def sortGrade(course):
sortedgrade = dict(sorted(course.grades.items(), key=lambda item: item[1]))
return sortedgrade
a=Student("张三")
b=Student("李四")
c=Student("王五")
g=Grades()
g.__addStudent__(a)
g.__addStudent__(b)
g.__addStudent__(c)
g.__addGrade__(a,80)
g.__addGrade__(b,92)
g.__addGrade__(c,90)
print('同学a的成绩为{}'.format(g.__getGrades__(a)))
print(g.gradeReport())
print(g.grades)
t=sortGrade(g)
print(t)