面向对象程序设计学生选课系统项目设计书.docx
《面向对象程序设计学生选课系统项目设计书.docx》由会员分享,可在线阅读,更多相关《面向对象程序设计学生选课系统项目设计书.docx(14页珍藏版)》请在冰豆网上搜索。
面向对象程序设计学生选课系统项目设计书
面向对象程序设计
—--——-学生选课系统(SRS)项目设计书
一:
项目介绍
项目名称:
学生选课系统(SRS)
项目大致的功能和性能要求:
该系统让学生能够在线为每学期选择课程,还要能跟踪完成学位要求的过程。
当一个学生考入该大学时,他/她使用SRS制定一个学习计划,其中的课程要满足特定的学位计划,然后选定自己的导师。
SRS将检验该计划是否能满足该学生获得特定学位的需要。
确定了学习计划后,在每个学期前的注册期限内,学生可以在线查看课程时间表,选择自己想听的课程。
如果该课程有多位教授同时指导,还要指明希望听课的时段(周几,何时)。
SRS将检验该生是否满足选中课程的选课先决条件,方法是查阅该生的在线成绩单和学位记录(学生可以随时在线查看自己的成绩单)。
假定(a)选定课程的先决条件得到满足,(b)课程满足学生的学习计划,和(c)选定课程尚有名额空余,则学生将选中该课程。
如果条件(a)和(b)得到满足,条件(c)未得到满足,则学生被放入一个“先到先得”对列中.如果出现名额空余(原因可能时有学生放弃选修,或课程选修名额增加),则该生自动选修该课程,同时系统会向该生发送一封电子邮件通知,此时如果打算不再继续选秀这门课,学生应该退选该课程;否则,就得为选修该课程付费。
退选课程可以在该门课程开学后一周之内进行。
二:
需求说明
1系统简要分析
管理员可以通过超级用户身份登录,对系统进行全面的管理,对新用户的添加,删除,对信息进行管理。
管理员可以对老师及同学的帐户进行管理,
老师、学生不同身份的用户进入不同的界面,进行不同的操作。
教师可以发布自己本学期所要教的课程,以及对学生成绩进行管理。
同学可以通过查询本学期所开设课程进行选择。
2应用需求分析
学生选课系统需要满足来自三方面的需求,这三个方面分别是学生、教师和管理员。
学生的需求是查询院系的课程、学生选课情况及学生信息的修改;教师对选课系统学生选课情况进行操作,同时形成学生选课查看确认;选课管理员的功能最为复杂,包括对学生、教师、选课进行管理和统计,及系统状态的查看、维护并生成选课报表。
学生可以直接查看选课情况,学生可以根据本人学号和密码登录系统,还可以进行本人学科成绩情况的查询和维护部分个人信息。
一般情况下,学生只应该查询和维护本人的选课情况和个人信息,若查询和维护其他学生的选课及成绩查询信息,就要知道其他学生的学号和密码.这些是很难得到的,特别是密码,所以不但满足了学生的要求,还保护了学生的个人隐私.
学校工作人员有修改学生选课的权限,所以需对工作人员登陆本模块进行更多的考虑。
在此系统中,学校工作人员可以为学生加入选课或是登陆记录,并打印生成相应的报表给用户查看和确认院系管理人员功能的信息量大,数据安全性和保密性要求最高。
本功能实现对选课信息、教师信息、总体选课情况信息的查询和统计、工作人员和管理人员信息查看及维护。
学校管理员可以浏览、查询、修改、统计选课的基本信息;浏览、查询、统计和修改学生选课的基本信息,浏览、查询、统计学生信息,但不能添加删除和修改学生的信息,这部分功能应该由院系工作人员执行,但是,删除某条学生选课基本信息记录时,应实现对该学生选课的级联删除。
并且还应具有生成选课报表,并打印输出的功能。
设计不同用户的操作权限和登陆方法对所有用户开放的学生选课查询和个人部分信息维护查看个人情况信息维护学生个人密码根据选课情况对数据库进行操作并生成报表根据选课情况对数据库进行操作并生成报表查询及统计各种信息维选课信息维护工作人员和管理员信息维护学生信息处理信息的完整性。
本系统主要实现教师信息管理、学生信息管理、课程信息管理和系信息管理,其中教师信息管理有教师姓名、教师工号、教师职称、教师所属系;学生信息管理有学生姓名、学生学号和学生所在系;课程信息管理有课程名称、学分、上课地点、已选人数、课程性质、开课系、课程人数;系信息管理有系号和系名。
本文为互联网收集,请勿用作商业用途本文为互联网收集,请勿用作商业用途
(1)学生信息模块完成学生的登陆,然后根据各位同学所在的系不同,调用相应的选课模块。
其中学生登录模块的功能是验证登录人员确实是本院的学生,学生启动本系统后,系统提示输入学生学号码和密码,验证后进入主控操作界面。
(2)教师信息模块完成教师的登陆,然后根据各位教师所在的系不同,教师所教的课程不同,调用所选的课程.其中教师登陆模块的功能是验证登录人员确实是本院的教师,教师启动本系统后,系统提示输入教师工号和密码,验证后进入主控操作界面。
(3)课程信息管理包括必修课程和选修课程,学生必需先登陆才能进行对课程的选课否则不能进入选课系统。
(4)系信息管理中学生必需选重所在的系号和系名才能进行选课,否则并不能进行选课.
3场景说明
场景1:
“选修一门课程"
一个名为Fred的学生成功选修了一门课程,事件顺序如下:
1.Fred,一名学生,登入SRS
2。
他查看本学期的课程表,决定要选修的课程.
3。
Fred申请课程“对象入门”的选修资格,课程代码是OBJ101.
4。
系统检查Fred的学习计划,确保申请的课程符合他的学位目标(假设学生不允许参加学习计划之外的课程).
5。
系统检查他的成绩单,确保他已经修完了先修课程—-如果存在的话。
6。
确认该门课程有空余选修名额。
7.这门课程被添加到Fred的课程列表中.
从Fred的角度看来,他希望发生这些事情:
在登录进入SRS后,从可选课程列表中选择课程OBJ101然后点击“添加”按钮。
场景2:
“选修一门课程2”
1。
Fred,一名学生,登入SRS
2。
他查看本学期的课程表,决定要选修的课程.
3.Fred申请课程“对象入门"的选修资格,课程代码是OBJ101.
4。
系统检查Fred的学习计划,确保申请的课程符合他的学位目标(假设学生不允许参加学习计划之外的课程)。
5.系统检查他的成绩单,检查他没有修完了先修课程,他不能选修该课程。
场景3:
“退选一门课程”
1.Fred,一名学生,登入SRS
2.他查看本学期的课程表,决定要退选的课程。
3。
Fred退选课程“对象入门”的选修资格,课程代码是OBJ101.
4.从可选课程列表中选择课程OBJ101然后点击“drop”按钮。
三:
软件设计文档:
1。
学生选课系统(SRS)UML图:
2。
场景1的界面
3。
场景1的协作图:
4场景1的时序图:
5。
调和测试
在这一节中,我们主要讨论了两个问题,一个是系统的项目文档,另一个是系统的测试,下面我们分别加以说明.作为一个完整的系统,项目文档是其中不可缺少的部分也是相当重要的部分。
好的文档能够使用户快速了解并准确的使用系统的各项功能。
减少误操作,减少错误产生的可能,这对用户和开发人员都有很多的好处.查看问题描述的执行概要;类图;
数据字典;用例文档;重要场景和对应的消息追溯图。
由于本身能力的局限性,所以做编写的代码,即使经过反复检查也难免出错所以在本阶段力求使用有限的时间找出尽可能多的错误,力求系统尽量正确.
四、核心代码
操作概念文档我们创建的SRS有以下功能:
1,当GUI开始运行,本学期课程表上可用的课程将会被显示.
2,在一个学生使用SRSGUI前,他必须登录。
登录的动作是填写学号.
3,如果学生已经登录,将显示学生的姓名和选修的课程(也就是学生目前的课程表)。
4,在登录后,SRSGUI应该允许学生做以下动作:
从课程表中选择一门课程添加到他的课程表中
从课程表中删除一门课程
保存目前的课表到一个文件
从系统注销
基于SRS需求规格说明书的类列表
四、核心代码
1.Person类:
(1)Person类的字段:
publicabstractclassPerson
{
privatestringname;
privatestringssn;
}
(2)Person类的构造器;
publicPerson(stringname,stringssn)
{
this.Name=name;
this.Ssn=ssn;
}
(3)Person的Tostring()方法:
publicabstractoverridestringToString();
(4)Person类的Display()方法:
publicvirtualvoidDisplay()
{
Console。
WriteLine("PersonInformation:
");
Console。
WriteLine("\tName:
”+this.Name);
Console.WriteLine("\tSoc.SecurityNo。
:
”+this.Ssn);
}
2.Student类:
(1)Student类继承自Person类:
publicclassStudent:
Person{}
(2)Student类的字段:
privatestringmajor;
privatestringdegree;
privateTranscripttranscript;
privateArrayListattends;
privatestringpassword;
(3)Student类的构造器
publicStudent(stringname,stringSsn,stringmajor,stringdegree):
base(name,ssn)
{
this.Major=major;
this.Degree=degree;
this。
Tanscript=newTanscript(this);
attends=newArrayList();
}
(4)Student的Property:
publicstringMajor{
get{
returnmajor;
}
set{
major=value;
}
}
publicstringDegree{
get{
returndegree;
}
set{
degree=value;
}
}
publicTranscriptTranscript{
get{
returntranscript;
}
set{
transcript=value;
}
}
publicstringPassword{
get{
returnpassword;
}
set{
password=value;
}
}
(5)Display方法:
publicoverridevoidDisplay()
{
base.Display();
Console.WriteLine("Student-SpecificInformation:
");
Console.WriteLine("\tMajor:
”+this。
Major);
Console.WriteLine("\tDegree:
"+this.Degree);
DisplayCourseSchedule();
PrintTranscript();
}
(6)AddSection方法:
publicvoidAddSection(Sections){
attends。
Add(s);
}
(7)DropSection方法:
publicvoidDropSection(Sections){
attends。
Remove(s);
}
3。
Professoer类:
(1)Professor类的字段:
privatestringtitle;
privatestringdepartment;
privateArrayListteaches;
(2)AgreeToTeach()方法:
publicvoidAgreeToTeach(Sections)
{
teaches.Add(s);
s。
Instructor=this;
}
4。
Course类:
(1)Course类的字段:
privatestringcourseNo;
privatestringcourseName;
privatedoublecredits;
privateArrayListofferedAsSection;
privateArrayListprerequisites;
(2)Course类的方法:
publicvoidAddPrerequisite(Coursec)
{
prerequisites.Add(c);
}
(3)HasPrerequisites方法:
publicboolHasPrerequisites(){
if(prerequisites.Count>0){
returntrue;
}
else{
returnfalse;
}
}
(4)GetPrerequisites()方法:
publicIEnumeratorGetPrerequisites(){
returnprerequisites.GetEnumerator();
}
5.Section类:
(1)Section类的字段:
privateintsectionNo;
privatechardayOfWeek;
privatestringtimeOfDay;
privatestringroom;
privateintseatingCapacity;
privateCourserepresentedCourse;
privateScheduleOfClassesofferedIn;
privateProfessorinstructor;
(2)Enroll()方法:
publicintEnroll(Students)
{
Transcripttranscript=s.Transcript;
if(s。
IsEnrolledIn(this)||
s.IsCurrentlyEnrolledInSimilar(this)||
transcript.VerifyCompletion(this。
RepresentedCourse))
{
returnPREVIOUSLY_ENROLLED;
}
Coursec=this.RepresentedCourse;
if(c。
HasPrerequisites()){
IEnumeratore=c。
GetPrerequisites();
while(e。
MoveNext()){
Coursepre=(Course)e。
Current;
if(!
transcript.VerifyCompletion(pre)){
returnPREREQ_NOT_SATISFIED;
}
}
}
if(!
ConfirmSeatAvailability()){
returnSECTION_FULL;
}
if(!
enrolledStudents.ContainsKey(s。
Ssn)){
enrolledStudents。
Add(s。
Ssn,s);
}
s。
AddSection(this);
returnSUCCESSFULLY_ENROLLED;
}
6。
ScheduleOfClasses类:
(1)ScheduleOfClasses的字段:
privatestringsemester;
privateHashtablesectionsOffered;
(2)AddSection()方法:
publicvoidAddSection(Sections){
stringkey=s。
RepresentedCourse。
CourseNo+”—"+s。
SectionNo;
sectionsOffered。
Add(key,s);
s.OfferedIn=this;
}
7。
TranscriptEntry类:
(1)TranscriptEntry的字段:
privatestringgrade;
privateStudentstudent;
privateSectionsection;
privateTranscripttranscript;
(2)ValidateGrade()方法:
publicstaticboolValidateGrade(stringgrade){
booloutcome=false;
if(grade。
Equals("F")||grade.Equals("I”)){
outcome=true;
}
if(grade。
StartsWith("A")||grade.StartsWith(”B")||
grade。
StartsWith("C”)||grade。
StartsWith("D”)){
if(grade。
Length==1){
outcome=true;
}
else{
if(grade。
Length〉2){
outcome=false;
}
else{
if(grade。
EndsWith("+")||grade.EndsWith("-")){
outcome=true;
}
else{
outcome=false;
}
}
}
}
returnoutcome;
}
8。
Transcript类:
(1)Transcript的字段:
privateArrayListtranscriptEntries;
privateStudentstudentOwner;
(2)VerifyCompletion()方法:
publicboolVerifyCompletion(Coursec){
booloutcome=false;
for(inti=0;iTranscriptEntryte=(TranscriptEntry)transcriptEntries[i];
Sections=te。
Section;
if(s。
IsSectionOf(c)){
if(TranscriptEntry.PassingGrade(te。
Grade)){
outcome=true;
break;
}
}
}
returnoutcome;
}
五、心得与体会
通过这几周SRS项目设计,我对面向对象程序设计语言C#和SRS管理系统有了一定的了解,在一定程度上扩展了我的视野,丰富了我的知识,同时也使我学会了如何使用所学的知识去解决一些实际的问题.
不过在设计的过程中,我发现自己掌握的知识不够系统,理论知识也不够强化,在将理论投入到实践中时总是出现一些小问题.有时候通过别人的指点会突然间恍然大悟,所以我觉得自己对知识的理解和熟练程度不够。
在设计阶段,通过对课题的深入分析与研究,迫使我对技术有了一定的了解.
团结就是力量,一个项目设计的完成包含着很多人辛勤的汗水。
在和别人合作过程中,我学会了耐心的听取别人的意见,并与别人和睦相处.我相信只有通过合作,才能充分发挥自己的优点,有团队精神才能使自己更出色。
这次设计为我以后的工作道路奠定了一定的基础。