【Python】实验一 学生管理系统
作者:康慎吾
一、实验目的
- 熟悉X和Pycharm的运行环境
- 掌握函数、模块和面向对象编程思想。
二、实验环境
计算机及Python3.X和Pycharm软件。
三、实验内容与要求
1、创建4个.py模块,在一个包内,模块命名分别为main.py,ui.py,model.py,bll.py。
2、(1)实现学生管理系统在控制台的输出显示界面如图1所示。

图1 显示界面
(2)在model.py模块中建立学生类,其中包含的属性有name,age,score,id。
(3)在bll.py模块中建立学生管理业务逻辑类,即在此模块中实现增加、显示、删除、修改和成绩排序等功能。
(4)在ui.py模块中建立学生管理显示界面。
(5)在main.py模块中实现建立if __name__ == "__main__":
四、实验过程
分析
界面使用控制台输出显示。
识别对象:界面视图类、逻辑控制类、数据模型类
分配职责:
界面视图类:负责处理界面逻辑,比如显示菜单,获取输入,显示结果等。
逻辑控制类:负责存储学生信息,处理业务逻辑。比如添加、删除等
数据模型类:定义需要处理的数据类型。比如学生信息。
建立交互:
界面视图对象<---->数据模型对象<---->逻辑控制对象
设计
数据模型类:Student
数据:编号id,姓名 name,年龄 age,成绩 score
逻辑控制类:Stuceo
数据:学生列表studentlist
行为:显示学生lookstu,
添加学生addstu,
删除学生delstu,
修改学生renew,
查找学生find,
排序sort。
界面视图类:ui
入口逻辑main,
菜单标头title,
主菜单main_menu,
删除菜单del_menu,
修改菜单re_menu,
查找菜单find_menu,
排序菜单sort_menu。
测试过程
主菜单如图1-1。

图1-1
初始时显示列表无人,如图1-2。

图1-2
添加功能:然后我添加了三组数据,并让其显示,如图集1-3。

图集1-3
删除功能:接着我要删除某个人,我设置了两种方式:按姓名、按序号,如图集1-4。

图集1-4
修改功能:然后测试修改,先找出在修改,我设置两种方式:按姓名、按序号,如图集1-5。

图集1-5
查找功能:然后测试查找功能,我设置了两种方式:按姓名、按序号,如图集1-6。

图集1-6
排序:由于前几个功能的测试,只剩下一组数据,故又添加了四组数据,如图1-7。然后我们进行排序,我设置了四种方式:按序号(升序)、按序号(降序)、按成绩(升序)、按成绩(降序),如图集1-8。

图1-7

图集1-8
以上是常规数据操作的测试过程,下面来测试几种特殊情况:
前提:每次操作前均已录入四个相同名字的学生,还有一位名字不同的学生,如图2-1。

图2-1
(1A)当有多个学生姓名相同时,按名字删除操作的测试结果:
如图2-2。

图2-2
(1B)当名字或者序号不存在时,按名字删除操作的测试结果:
这里就用(1A)测试完后的数据继续进行,名字不存在时,如图2-3;序号不存在时,如图2-4。

图2-3

图2-4
(2A)当有多个学生姓名相同时,按名字修改操作的测试结果:
如图集2-5。

图集2-5
(2B)当名字或者序号不存在时,按名字修改操作的测试结果:
接着(2A)操作,按名字修改如图2-6,按序号修改如图2-7。

图2-6

图2-7
(3A)当有多个学生姓名相同时,按名字查找操作的测试结果:
如图2-8。

图2-8
(3B)当名字或者序号不存在时,按名字查找操作的测试结果:
按名字查找如图2-9,按序号查找如图2-10。

图2-9

图2-10
代码分析
1、主函数(main.py模块):
导入了ui.py和action.py两个模块,用if__name__==”__main__”:实现函数的入口。
import ui
import action
from action import *
from ui import *
if __name__ =="__main__":
ui.title()
while True:
s = Stuceo()
ui.main_menu()
a = int(input('请输入功能代号:'))
if a == 1:
s.lookstu()
continue
if a == 2:
s.addstu()
continue
if a == 3:
s.delstu()
continue
if a == 4:
s.renew()
continue
if a == 5:
s.find()
continue
if a == 6:
s.sort()
continue
if a == 0:
break
else:
print('代号有误!请输入正确的功能代号。')
continue
2、数据模型:学生类(model.py模块):
建议类Student,定义学生的属性,分别为姓名、年龄、成绩和序号。
注:关于studentlist表为什么一开始就往里面加了一组数据,我给出这样的解释:因为的添加数据的思路是将一个学生的所有信息封装到一个小列表里,通过append函数添加到大列表studentlist里,序号会自动加1,而如果建立一个空列表(studentlist=[]),那么第一组数据的序号从何加起呢?所以我加了一组序号为0的数据,方便第一组数据的序号加1,设置显示的时候会从大列表第二个元素开始显示,后面代码体现。
studentlist=[['',0,0,0]]
class Student:
def __init__(self,name,age,score,id):
self.name=name
self.age=age
self.score=score
self.id=id
3、逻辑控制(action.py模块):
导入了model.py和ui.py两个模块,建类Stuceo,继承了model.py模块里的类Student的属性。类Student的行为实现的功能:显示学生、添加学生、删除学生、修改学生、查找学生、排序。
from model import *
from ui import *
class Stuceo(Student):
def __init__(self,name='',age=0,score=0,id=0):
super().__init__(name,age,score,id)
# (1)显示学生:
def lookstu(self):
print('序号/姓名/年龄/成绩')
for i in range(1,len(studentlist)):
print(studentlist[i][3],studentlist[i][0],studentlist[i][1],studentlist[i][2])
# (2)添加学生:
def addstu(self):
self.name = input('请输入名字:')
self.age = int(input('请输入年龄(请输入整数):'))
self.score = int(input('请输入成绩(请输入整数):'))
self.id = studentlist[len(studentlist)-1][3]+1
studentlist.append([self.name,self.age,self.score,self.id])
print('已添加!')
# (3)删除学生:
def delstu(self):
while True:
dellist=[]
del_menu()
b = int(input('请输入功能代号(删除):'))
if b == 1:
dname=input('请输入要删除学生的姓名:')
for i in range(1,len(studentlist)):
if studentlist[i][0] == dname:
dellist.append(i)
if dellist == []:
print('查无此人!')
continue
else:
for i in dellist[::-1]:
print('查到此人信息!↓')
print('序号/姓名/年龄/成绩')
print(studentlist[i][3], studentlist[i][0], studentlist[i][1], studentlist[i][2])
del studentlist[i]
print('已删除!')
print('已删除所有符合条件的学生信息!')
dellist.clear()
continue
if b == 2:
did=int(input('请输入要删除学生的序号:'))
for i in range(1,len(studentlist)):
if studentlist[i][3] == did:
dellist.append(i)
print(i)
if dellist == []:
print('查无此人!')
continue
else:
i=dellist[0]
print('查到此人信息:')
print('序号/姓名/年龄/成绩')
print(studentlist[i][3], studentlist[i][0], studentlist[i][1], studentlist[i][2])
del studentlist[i]
print('已删除!')
print('已删除所有符合条件的学生信息!')
dellist.clear()
continue
if b == 0:
break
else:
print('代号有误,请输入正确的功能代号。')
continue
# (4)修改学生:
def renew(self):
while True:
relist = []
re_menu()
d = int(input('请输入功能代号(修改):'))
if d == 1:
rname=input('请输入要修改的学生姓名:')
for i in range(1,len(studentlist)):
if studentlist[i][0] == rname:
relist.append(i)
if relist == []:
print('查无此人!')
continue
else:
for i in relist[:]:
print('请修改此人信息:')
print('序号/姓名/年龄/成绩')
print(studentlist[i][3], studentlist[i][0], studentlist[i][1], studentlist[i][2])
studentlist[i][0] = input('请输入名字:')
studentlist[i][1] = int(input('请输入年龄(请输入整数):'))
studentlist[i][2] = int(input('请输入成绩(请输入整数):'))
print('修改成功!')
print('已完成所有符合条件的修改!')
relist.clear()
continue
if d == 2:
rid = int(input('请输入要修改的学生序号:'))
for i in range(1, len(studentlist)):
if studentlist[i][3] == rid:
relist.append(i)
if relist == []:
print('查无此人!')
continue
else:
i=relist[0]
print('请修改此人信息:')
print('序号/姓名/年龄/成绩')
print(studentlist[i][3], studentlist[i][0], studentlist[i][1], studentlist[i][2])
studentlist[i][0] = input('请输入名字:')
studentlist[i][1] = int(input('请输入年龄(请输入整数):'))
studentlist[i][2] = int(input('请输入成绩(请输入整数):'))
print('修改成功!')
print('已完成所有符合条件的修改!')
relist.clear()
continue
if d == 0:
break
else:
print('代号有误!请输入正确的功能代号。')
#(5)查找学生:
def find(self):
while True:
findlist=[]
find_menu()
c=int(input('请输入功能代号(查找):'))
if c == 1:
fname=input('请输入要查找的学生姓名:')
for i in range(1,len(studentlist)):
if studentlist[i][0] == fname:
findlist.append(i)
if findlist == []:
print('查无此人!')
continue
else:
print('查询结果如下:')
print('序号/姓名/年龄/成绩')
for i in findlist[:]:
print(studentlist[i][3], studentlist[i][0], studentlist[i][1], studentlist[i][2])
findlist.clear()
print('已显示全部符合条件的结果!')
continue
if c == 2:
fid = int(input('请输入要查找的学生序号:'))
for i in range(1, len(studentlist)):
if studentlist[i][3] == fid:
findlist.append(i)
if findlist == []:
print('查无此人!')
continue
else:
i = findlist[0]
print('查询结果如下:')
print('序号/姓名/年龄/成绩')
print(studentlist[i][3], studentlist[i][0], studentlist[i][1], studentlist[i][2])
print('已显示全部符合条件的结果!')
findlist.clear()
continue
if c == 0:
break
else:
print('代号有误!请输入正确的功能代号。')
# (6)排序:
def sort(self):
while True:
stulist=studentlist[1:]
sort_menu()
e=int(input('请输入功能代号(排序):'))
if e == 1:
iduplist=sorted(stulist,key=lambda x:x[3])
print('序号(升序)/姓名/年龄/成绩')
for i in range(len(iduplist)):
print(iduplist[i][3], iduplist[i][0], iduplist[i][1], iduplist[i][2])
continue
if e == 2:
iddownlist=sorted(stulist,key=lambda x:x[3],reverse=True)
print('序号(降序)/姓名/年龄/成绩')
for i in range(len(iddownlist)):
print(iddownlist[i][3], iddownlist[i][0], iddownlist[i][1], iddownlist[i][2])
continue
if e == 3:
scuplist=sorted(stulist,key=lambda x:x[2])
print('成绩(升序)/序号/姓名/年龄')
for i in range(len(scuplist)):
print(scuplist[i][2], scuplist[i][3], scuplist[i][0], scuplist[i][1])
continue
if e == 4:
scdownlist = sorted(stulist,key=lambda x:x[2],reverse=True)
print('成绩(降序)/序号/姓名/年龄')
for i in range(len(scdownlist)):
print(scdownlist[i][2], scdownlist[i][3], scdownlist[i][0], scdownlist[i][1])
continue
if e == 0:
break
else:
print('请输入正确的功能代号!')
continue
五、实验总结
1、对python的列表知识有了进一步的理解;
2、通过反复敲、测试数据,体会到了不同语法有着不同的功能,体悟了python代码的间接性;
3、对python模块的应用有了初步了解,确实很方便,有利于分工合作。

浙公网安备 33010602011771号