华南农业大学计算机科学与工程系
面向对象技术综合性实验报告
题目考试成绩分析程序实验时间2007年12月23日指导教师肖磊专业年级计算机科学与技术2005级姓名张文龙学号200530740329
内容要求
(1)系统中明确要求处理的对象包括班级,学生,课程,考试成绩单.其中班级信息包括年级,专业,班号,还包括若干学生.学生信息包括学号和姓名.课程信息包括课程编号,名称,学分,学时.成绩单信息包括班级,课程,考试考试日期,考试人数,每个学生的成绩.
(2)系统运行期间可以不断增加新的信息,包括学生信息,班级信息,课程信息,成绩单信息.系统关闭后,这些信息不应该被丢失掉,而是应该能够保存起来,以便下次使用.所以,要求系统能够实现信息的永久性存储,将这些信息保存到相应文件中.
(3)系统要求当指定班级和课程后,能够对相应的成绩单进行如下分析.包括使用文本和图形两种方式进行分析.分析的功能具体有:分数分析:最高分,最低分,平均分,分数段分析:分别统计0-59,60-69,70-79,80-89,90-100的学生人数和所占的百分比.图形界面分析采用柱状图和饼状图两种图形进行分析.
评语及成绩
项目/分数
优
良
中
及格
不及格
比重%
内容完成情况
□
□
□
□
□
25%
系统分析设计
□
□
□
□
□
30%
程序设计水平
□
□
□
□
□
20%
实验报告撰写
□
□
□
□
□
10%
实验总结
□
□
□
□
□
5%
其他(功能)
□
□
□
□
□
10%
总评成绩
第一部分:系统需求分析
(1)系统中明确要求处理的对象包括班级,学生,课程,考试成绩单.其中班级信息包括年级,专业,班号,还包括若干学生.学生信息包括学号和姓名.课程信息包括课程编号,名称,学分,学时.成绩单信息包括班级,课程,考试考试日期,考试人数,每个学生的成绩.
(2)系统运行期间可以不断增加新的信息,包括学生信息,班级信息,课程信息,成绩单信息.系统关闭后,这些信息不应该被丢失掉,而是应该能够保存起来,以便下次使用.所以,要求系统能够实现信息的永久性存储,将这些信息保存到相应文件中.
(3)系统要求当指定班级和课程后,能够对相应的成绩单进行如下分析.包括使用文本和图形两种方式进行分析.分析的功能具体有:分数分析:最高分,最低分,平均分,分数段分析:分别统计0-59,60-69,70-79,80-89,90-100的学生人数和所占的百分比.图形界面分析采用柱状图和饼状图两种图形进行分析.
第二部分:系统设计
(1)功能类设计
对于分析阶段中要求处理的每一个对象,分别用一个类来模拟现实中的一个实体.系统中的功能类有:学生类(Student),班级类(Class),课程类(Course),成绩单类(ScoreMenu).
①类的实例属性设计:
学生类(Student):学生学号(id)学生姓名(name)
班级类(Class):年级(grade),专业(major),班号(classNumber),学生人数(studentNumber),学生(students)
课程类(Course):课程编号(id),课程名称(name),学分(credit),学时(period)
成绩单类(ScoreMenu):班级(classOfScoreMenu),课程(course),考试时间(testTime)
参加考试人数(numberOfAttendTestStudent),参加考试学生学号(idOfStudent),参加考试学生分数(scoreOfTest)
②类的静态属性设计:
学生类(Student):学生信息文件(STUDENT_FILE)
班级类(Class):班级信息文件(CLASS_FILE)
课程类(Course):课程信息文件(COURSE_FILE)
成绩单类(ScoreMenu):成绩单文件(SCORE_MENU_FILE),试卷最高分数(MAX_SCORE)
③类的方法设计:
访问器和修改器:对于各个功能类中的每个属性,都设计了相应的访问器和修改器.例如学生类的属性id,分别设置了访问器getId(),和修改器setId().
equals()方法:由于系统可以增加新的信息,但是为了避免增加冗余信息,即增加系统中已经存在的对象,需要确认要新增加对象,是否已经存在系统中,故需要比较每个增加的对象是否相等.故对于各个功能类,都实现了equals()方法.
seToFile()方法:各个功能类都实现了该方法,把对象保存到磁盘文件中,此方法保证保存的对象不会在系统文件中重复保存.
queryFromFile()方法:各个功能类都实现了该方法,每个类的该方法有相应类型的对象的参数,实现从相应文件中查询参数中的对象是否保存在文件中.
loadFile()方法:各个功能类的此方法实现把相应的文件内容返回.例如:学生类的
loadFile()方法,返回系统中学生文件的所有学生信息的内容.
其中,seToFile(),queryFromFile(),loadFile()为静态方法.
班级类(Class):findStudent(Studentstudent)方法,查找学生student是否存在班级中
addStudent(Studentstudent)方法,在班级里增加新学生,如果已经存在班级中,则不重复保存.
removeStudent(Studentstudent)方法,从班级里删除学生.
成绩单类(ScoreMenu):getHighestScore()方法,返回最高分
getLowestScore()方法,返回最低分
getAverageScore()方法,返回平均分
getAnasisOfScore()返回各分数段人数
④类的UML图设计:
说明:各个类图中的每个属性的访问器和修改器没有被列出来.
StudentCourse-id:long
-name:String-id:String
-name:String
-creit:float
-period:int+Student()
+Student(id:long,name:String)
+seToFile():boolean
+queryFromFile(id:long):Student
+loadFile():Student[]
+equals(o:Object):boolean+Course()
+Course(id:Stirng,name:String,credit:
float,period:int)
+seToFile():boolean
+queryFromFile(id:String):Course
+loadFile():Course[]ClassScoreMenu-grade:int
-major:String
-classNumber:int
-studentNumber:int
-students:Student[]-classOfScoreMenu:Class
-course:Course
-testTime:int[]
-numberOfAttendTestStudent:int
-idOfStudents:long[]
-scoreOfTest:float[]+Class()
+Class(grade:int,major:String,classNumber:
int,studentNumber:int,students:Student[])
-findStudent(student:Student):Student
+addStudent(newStudent:Student):boolean
+removeStudent(student:Student):boolean
+equals(o:Object):boolean
+seToFile():boolean
+queryFromFile(grade:int,major:String,classNumber:int):Class
+loadFile():Class[]+ScoreMenu()
+ScoreMenu(classes:Class,course:Course,testTime:int[],num 58;int,ids:long[],scores:float[])
-findIndexOfStudent(id:long):int
-isIdInClass(id:long):boolean
+getHighestScore():float
+getLowestScore():float
+getAverageScore():float
+getAnasisOfScore():int[]
+seToFile():boolean
+queryFromFile(classes:Class,course:Course):ScoreMenu
+loadFile():ScoreMenu[](2)界面类设计
程序主界面用窗体类MainWindow实现.对于系统分析中,程序要求实现的每一个增加和查询操作(增加学生信息,查询学生信息,增加课程信息,等等),都用一个窗体来实现,放在MainWindow窗体中.对于成绩分析,系统采用三种分析方式:文字分析,柱状分析,饼状分析,分别用三各窗体来实现.
①系统中用到的界面类有
主窗口类(MainWindow):程序运行时的主界面,包括菜单栏,工具栏.
增加学生窗口类(AddStudentJPanel):增加学生信息时,用户增加学生信息的界面.
查询学生窗口类(QueryStudentJPanel):查询学生信息时,用户查询学生信息的界面.
增加课程窗口类(AddCourseJPanel):增加课程信息时,用户增加课程信息的界面.
查询课程窗口类(QueryCourseJPanel):查询课程信息时,用户查询课程信息的界面.
增加班级窗口类(AddClassJPanel):增加班级信息时,用户增加班级信息的界面.
查询班级窗口类(QueryClassJPanel):查询班级信息时,用户查询班级信息的界面.
增加成绩单窗口类(AddScoreMenuJPanel):增加成绩单时,用户增加成绩单的界面.
查询成绩单窗口类(QueryScoreMenuJPanel):查询成绩单时,用户查询成绩单的界面.
成绩单文字分析窗口类(ScoreTextAnasysJFrame):采用文字方式显示成绩单分析结果.
成绩单柱状分析窗口类(ScoreColumnAnasysJFrame):采用柱状方式显示成绩单分析结果.
成绩单饼状分析窗口类(ScoreCircleAnasysJFrame):采用饼状方式显示成绩单分析结果.
其中,从增加学生窗口类(AddStudentJPanel),到查询成绩单窗口类(QueryScoreMenuJPanel),都继承了JPanel类,各个窗体放在主窗口(MainWindow)中.
成绩单分析窗口类(ScoreTextAnasysJFrame,ScoreColumnAnasysJFrame,ScoreCircleAnasysJFrame),则采用与主窗口独立的窗口,显示成绩单分析的结果.
②主窗口类(MainWindow)设计思路:
主窗口类界面由四部分组成:菜单栏,操作模块工具栏,具体操作工具栏,操作界面区.
菜单栏:包括退出系统,显示风格(Metal,Motif,Windows),系统文件(学生文件,课程文件,班级文件,菜单栏文件),选项(系统,作者),当前时间.
操作模块工具栏:包括查询,增加,成绩分析三大模块.放在主界面最下方.
具体操作工具栏:由学生,课程,班级,成绩单相应的操作组成.例如,查询工具栏里有:查询学生信息,查询课程信息,查询班级信息三项.紧跟着放在菜单栏下方.
操作界面区:相应的操作的界面,例如,当用户选择查询模块,然后选择查询课程信息,则显示查询课程信息界面.
③增加和查询学生,课程,班级,成绩单窗口类设计思路:
说明:这四部分(学生,课程,班级,成绩单)的设计思路都是类似的,故以增加和查询课程窗口类为例子.
增加课程窗口类设计:
将课程类的实例属性(id,name,credit,period)的名称(课程编号,课程名称,学分,学时),分别用一个JLabel组件显示出来,接着在JLabel组件右边分别放一个JTextField组件,目的是让用户输入相应的数据.
然后会有一个"确定"JButton组件,表示完成输入信息."确定"JButton组件的处理器一般思路是:首先判断数据的数据的格式是否合法.例如,学时要求是整型的数据,如果输入2.4或者abc等,则是非法数据.数据不合法则要求用户重新输入数据.数据合法后,接下来,程序在相应的文件(课程文件)里检查相应的课程信息是否已经存在(以课程编号为关键字),如果存在则增加失败,否则增加成功.
查询课程窗口类设计:
将课程类的关键字属性(id)的名称(课程编号)用JLabel组件显示出来,接着在其右边放一个JTextField组件,让用户输入相应的查询信息.接着有一个"确定"JButton组件,表示完成查询信息的输入."确定"JButton组件的处理器思路是:首先检验输入的数据是否合法.非法则要求重新输入,否则,从相应的文件(课程文件)检索相应的信息是否存在,然后返回结果.
④成绩单分析窗口类设计:
前面的窗口类都是使用工具画出来的,而成绩单分析窗口类(总共有三个类),则是用代码写出来的.这三个类都有一个共同点:有一个类型为ScoreMenu参数的构造函数.类的功能就是根据相应的ScoreMenu参数,构造出相应的结果.包括文字界面,柱状界面,饼状界面.
(3)辅助功能
程序实现的业务功能有:增加和查询一个学生,课程,班级,成绩单的信息,对一个成绩单进行分析(文字方式,柱状方式,饼状方式),查看系统的系统文件(学生,课程,班级,成绩单文件).除了业务功能,程序还增加了一些辅助功能.包括:选择程序界面显示风格(Metal,Motif,Windows),显示当前时间(用图形界面显示当前时间).
第三部分:系统测试
说明:系统开始运行的时候,系统中没有任何信息(学生信息,课程信息,班级信息,成绩单信息),故用户需要先增加一定的信息后,才能进行相应的操作.例如,增加班级信息时,首先要增加若干学生信息.因为班级里面的学生信息,要求是已经存在系统的学生文件中.
增加成绩单时,首先应该增加了相应的班级信息和课程信息,否则,系统会提示班级信息,或课程信息不存在.
程序运行时的主要操作和界面如下图所示
增加学生信息界面
查询课程信息界面
查询成绩单界面
成绩单分析文本界面
成绩单分析柱状界面
成绩单饼状界面
当前时间界面
第四部分:实验总结
系统主要采用了面向对象的软件工程方法进行系统分析和建模,采用了JA语言,SUN公司的工具NetBeans进行系统实现.由于系统需求指导书已经明确要求了系统需要处理的对象和实现的功能,故相对而言系统难度降低了一些,可以直接进行系统设计.系统的功能类的方法的算法难道比较简单,没有涉及到较大难道的算法.在实现时,首先实现了系统的功能类,而且也不是实现了全部的方法(涉及文件存储的方法暂时没有实现),在全部实现了功能类后,再开始考虑界面类的设计,同时实现功能类中关于文件存储的方法.在设计界面类的时候,尽量利用工具的方便性,来进行界面设计,例如主程序界面,增加和查询界面,都是采用工具"画"出来的.在设计界面类的时候,稍微难的就是成绩单分析柱状图.因为具体成绩单的数据,其构造出来的界面肯定不同,所以用纯代码来实现,其中关键的地方是各种框架的嵌套使用和框架管理器的设置.系统基本上实现了系统的需求,但由于时间仓促,还有几个地方没能完善.例如,系统可以实现增加信息和查询信息的功能,但没有实现的功能(实际上是需要的).总的来说,这次实验收获还是比较大的.