南 京 理 工 大 学
课程设计说明书
作 者: | 高明 | 学 号: | 914106840518 |
| 刘建平 |
| 914106840526 |
| 王金 |
| 914106840234 |
| 王琪栋 |
| 914106840235 |
| 雷杨 |
| 914106840618 |
学院(系): | 计算机科学与技术学院 | ||
专 业: | 计算机科学与技术 | ||
题 目: | 离散课程练习测验系统 |
2016年 10月
目录
一、概述 ·················································3
二、需求分析··············································3
三、系统设计··············································7
四、系统实施··············································12
五、系统测试··············································39
六、收获和体会 ···········································39
七、附录·················································39
八、参考文献············································39
一、概述
1、项目背景:
在Internet 飞速发展的今天,校园也慢慢进入网络时代,计算机网络已经成为学校教育事业发展不可或缺的一部分。网络给我们带来的不仅是无穷的信息,也带来了更多便利。为推动学校教育信息化的发展,远程教育已成为现代教育技术发展方向之一,在线考试作为远程教育的一个子系统也成为一个重要的研究领域。在线考试系统它具有降低考试成本,解决繁重的考务工作的优点。其中,我们选择计算机学科中较为重要的离散数学作为研究。
2、编写目的:
离散数学课程测验系统是为了满足离散数学课程教学,提高教学效率,服务于广大师生,本系统通过网上出题,机上考试,自动阅卷等工作为师生创造一个快捷的网络课程测验系统。
本项目用户针对计算机科学专业的学生和教师以及部分电子信息类专业学生、教师。
3、软件定义:
离散课程练习测验系统即为帮助用户练习、检测离散数学学习效果的系统。
4、开发环境:
软件测试运行环境为Windows 7及以上系统,数据库系统为SQL Server 2008.
二、需求分析
1、问题的提出:
2.1.1开发意图:“离散数学”是计算机科学的重要理论基础课程,它不仅是计算机科学的核心课程,而且以成为电子信息类专业的热门选修课。因此学生对离散数学试题的需求量日益增大。本软件则满足了此类用户的需求。
2.1.2应用目标:软件应用 方面应包含如下几点
(1)学生练习、测验、查询成绩
(2)老师测验选项、题库更改、查询成绩
(3)管理员创建账号等
2.1.3作用范围:计算机科学的老师和学生以及部分电子信息类专业的老师和学生。
2.1.4 该软件独立,并无与其他软件的联系。
2、系统的业务功能分析:
用户适用于网页。本软件的开发人员,如操作人员、维护人为在读计算机专业学生。系统功能共分为三大块:学生功能,教师功能,管理员功能。
1.2.1精度
每次出题相同率不能超过百分之三十。输出以及传输过程中的精度要求题目正确率百分之百,成绩显示应为整数。题目数量输入应为整数。
1.2.2时间特性要求
时间特性要求主要有如下几种:
(1)响应时间;
(2)更新处理时间;
(3)数据的转换和传送时间;
(4)解题时间;
由于能力有限,总的处理时间保持在十秒以内。
1.2.3灵活性
操作方式上的变化以及环境的变化应保证系统不会崩溃而且运行正常。
系统在出现问题或者需要改进时应保证修改方便。
3、系统的业务流程分析:
图2-1 系统基本流程图
4、需完成的功能:
一:学生功能:
(1)练习 :练习则会根据学生所选章节以及选择的各题型数量进行随机出题,并提供正误判断。
输入:输入要练习的章节(VARCHAR,数值范围(1-1000)),以及各题型数量(int,数值范围(1-1000))。
(2)测试 :测试则会根据教师提前选好的考题类型来随机出题,在规定时间内要求学生答题,时间结束后自动交卷,待提交试卷后自动给出成绩。
(3)查询 :除此之外,学生还可查询以往所有测试的成绩.
输入:测试时间(不输入直接查询则显示所有的成绩)(int,形式示例:20160125)。
二:教师功能:
(1)测试选项 :老师能够选择测试试卷题目类型的数量。达到控制测试的目的。
输入:题目数量(INTEGER)。
(2)题目选项 :老师可浏览所有数据库中的题目,并能够进行更改删除和增加。使得题库管理更加方便。
输入:更改:输入更改后的题目(VARCHAR,数值范围(1-8000) )
增加:输入增加的题目以及题目类型等等。(VARCHAR,数值范围(1-8000))
(3)查询选项 :老师可以根据学号以及测试时间来查询自己的学生的成绩,或者直接将所有自己的学生的成绩列出来。
输入:输入学号(int)或测试时间(int)。
三:管理员功能:
管理员可以进行管理工作,像创建学生老师账号,修改账号信息等。
四:登陆:
输入:用户账号和密码,与后台比对。(LONG)
5.数据流图:
图2,2 账户管理.
图2.3 学生功能
图2.4 教师功能
6.数据字典
数据流定义
表2.5 学生登录信息
表2.6 教师登录信息
表2,.7 管理员登录信息
表2.8 考试设置信息
表2.9 学生信息
表2.10 学生成绩表
表2.11 选择题信息表
表 2.12 判断题信息表
三、系统设计
1、数据表:
(1)、数据库的关系模式:
学生(学号,姓名,学生密码,学生教师,学生编号)
教师(教工号,姓名,教师密码)
管理员(管理员姓名,管理员密码,管理员编号)
考试(题目编号,编号,考试时间)
成绩(编号,学生编号,考试时间,考试分数,教师编号,教师姓名,学生姓名)
试题(试题编号,试题内容,选项一,选项二,选项三,选项四,答案,分值,章节名,教师编号)
(2)、表的物理设计:
表3.2. 学生信息
属性名 | 存储代码 | 类型 | 备注 | 允许为空 |
学号 | Stu_num | VARCHAR |
|
|
姓名 | Stu_name | VARCHAR |
|
|
学生密码 | Stu_pad | VARCHAR |
|
|
学生编号 | Stu_ID | INT |
|
|
学生教师 | Stu_class | INT | 学生教师ID | 允许 |
表3.3 教师信息
教工号 | Tea_ID | INT |
|
|
姓名 | Tea_name | VARCHAR |
|
|
教师密码 | Tea_psd | INT |
|
|
表3.4 管理员信息
姓名 | Man_ID | INT | 管理员姓名 |
|
管理员账号 | Man_name | VARCHAR |
|
|
管理员密码 | Man_psd | VARCHAR |
|
|
表3.5 试题信息
试题编号 | Title_ID | INT |
|
|
试题提干 | Title_name | VARCHAR |
| 允许 |
选项一 | Title_opt_a | VARCHAR |
| 允许 |
选项二 | Title_opt_b | VARCHAR |
| 允许 |
选项三 | Title_opt_c | VARCHAR |
| 允许 |
选项四 | Title_opt_d | VARCHAR |
| 允许 |
答案 | Title_answer | VARCHAR |
| 允许 |
分值 | Title_score | INT |
| 允许 |
章节编号 | Cou_ID | INT |
|
|
教师编号 | Tea_ID | INT |
|
|
表3.6 考试信息
考试时间 | Exam_time | INT |
|
|
题目编号 | Title_ID | INT |
|
|
编号 | ID | INT |
|
|
表3.7 成绩信息
编号 | Score_ID | INT |
|
|
学生编号 | Stu_ID | INT |
|
|
考试时间 | Exam_time | INT |
|
|
考试分数 | Exam_score | INT |
|
|
教师编号 | Tea_ID | INT |
|
|
教师姓名 | Tea_name | VARCHAR |
|
|
学生姓名 | Stu_name | VARCHAR |
|
|
2、视图,索引,数据库权限:
(1)数据具有可靠性应当在本系统投入使用的生命周期内不丢失数据并且当数据转为历史纪录后任何人不得进行更改。
(2)系统实现学生、教师和管理员的登陆区分来实现系统的稳定和安全性。
(3)系统正常运行过程中不允许出现逻辑与算法错误。
(4)系统正常运行过程中当操作发生失误时或数据溢出时应提示故障原因然后正常退出当前操作环境。
(5)没有得到授权的用户无法进入系统。
(6)没有得到修改权限的用户无法修改信息以及执行处理功能。
图3.7 教师功能
图3.8 学生功能
3、软件功能设计
(1)、系统的结构图
图3.9 系统结构图
(2)、功能表:
| 用户管理 | 题库管理 | 成绩查询 | 修改密码 | 用户注册 | 用户登录 | 在线考试 | 试卷管理 |
学号(学生) | √ |
| √ | √ | √ | √ | √ |
|
姓名(学生) | √ |
|
|
| √ |
| √ |
|
教工号 | √ | √ | √ |
| √ | √ |
|
|
姓名(教师) | √ |
|
| √ | √ |
|
|
|
密码(教师) | √ | √ | √ | √ | √ | √ |
| √ |
姓名(管理员) | √ |
|
|
| √ |
|
| √ |
管理员账号 | √ |
|
| √ | √ | √ |
|
|
管理员密码 | √ |
|
| √ | √ | √ |
|
|
选择题 |
| √ |
|
|
|
| √ |
|
判断题 |
| √ |
|
|
|
| √ |
|
选择题答案 |
| √ |
|
|
|
| √ |
|
判断题答案 |
| √ |
|
|
|
| √ |
|
| 学生登陆 | 随机出题 | 输入答案 | 计算分数 | 教师登陆 | 教师信息管理 | 学生信息管理 | 试卷管理 |
学号(学生) | √ |
| √ | √ |
|
| √ |
|
姓名(学生) |
|
|
|
|
|
| √ |
|
密码(学生) | √ |
| √ | √ |
|
| √ |
|
教工号 |
|
|
|
| √ | √ |
| √ |
姓名(教师) |
|
|
|
|
| √ |
|
|
密码(教师) |
|
|
|
| √ | √ |
| √ |
姓名(管理员) |
|
|
|
|
|
|
|
|
管理员账号 |
|
|
|
|
| √ | √ |
|
管理员密码 |
|
|
|
|
| √ | √ |
|
选择题 |
| √ |
|
|
|
|
|
|
判断题 |
| √ |
|
|
|
|
|
|
选择题答案 |
|
| √ | √ |
|
|
|
|
判断题答案 |
|
| √ | √ |
|
|
|
|
表3.10 功能需求与程序的关系-1
| 学生登陆 | 随机出题 | 输入答案 | 计算分数 | 教师登陆 | 教师信息管理 | 学生信息管理 | 试卷管理 |
学号(学生) | √ |
| √ | √ |
|
| √ |
|
姓名(学生) |
|
|
|
|
|
| √ |
|
密码(学生) | √ |
| √ | √ |
|
| √ |
|
教工号 |
|
|
|
| √ | √ |
| √ |
姓名(教师) |
|
|
|
|
| √ |
|
|
密码(教师) |
|
|
|
| √ | √ |
| √ |
姓名(管理员) |
|
|
|
|
|
|
|
|
管理员账号 |
|
|
|
|
| √ | √ |
|
管理员密码 |
|
|
|
|
| √ | √ |
|
选择题 |
| √ |
|
|
|
|
|
|
判断题 |
| √ |
|
|
|
|
|
|
选择题答案 |
|
| √ | √ |
|
|
|
|
判断题答案 |
|
| √ | √ |
|
|
|
表3.11 功能需求与程序的关系-2
(3)、功能描述:
图3,.12 系统功能模块
本系统分为四个模块,模块间的通信通过共享数据库来实现。
(1)信息管理模块:对用户和管理的信息尽心管理包块账户的添加删除以及密码修改
(2)练习考试模块:学生用户的练习及考试操作
(3)题库管理模块:老师对题库的增添修改及删除
(4)成绩查询模块:老师和学生对考试成绩的查询
模块分类 | 功能 | 对象 | 功能描述 |
登陆 | 登录 | 所有用户 | 用于用户登录 |
信息管理 | 教师信息管理 | 管理员 | 管理教师和学生信息,且可修改密码 |
学生信息管理 | |||
账号创建 | 创建用户账号 | 管理员 | 为要使用系统的用户创建登陆账号 |
密码修改 | 修改管理员密码 | 所有用户 | 修改登陆密码 |
修改学生密码 | |||
修改教师密码 | |||
题库管理 | 增添 | 教师 | 用户更新管理题库 |
删除 | |||
修改 | |||
查询 | 教师查询学生成绩 | 教师 | 查看学生成绩 |
学生查看自己成绩 | 学生 | 查看自己成绩 | |
考试 | 学生考试 | 学生 | 在规定时间内完成答题,系统自动给分 |
考试管理 | 教师 | 设置考试各题型数量以及考试时间 | |
练习 | 学生练习 | 学生 | 用于日常学生练习 |
表 3.13 系统功能
四、系统实施
(1)、系统的界面设计:
a.用户界面
主界面是由java开发的独立的页面。有一个登录主页。不同权限的账号登录后分别链接到其他页面,并可以根据各自的权限进行操作。
b.硬件接口
整个软件系统不大,因此无须与外界硬件联系。
若数据库数据量较大则可以保持与光盘刻录机的接口。
c.软件接口
主要为软件与操作系统的接口,在Windows上实现软件。
1.用户登录界面
完成用户登录功能。在登陆界面输入用户姓名和密码,点击提交完成登陆;点击重置进行再输入。
图4,1 用户登录界面
2.管理员功能界面
完成管理员功能。单击选项可进入教师管理,学生管理,账号管理,修改密码界面以及进行用户注销操作。
图4,2 管理员功能界面
3.教师管理界面
完成管理员对教师信息的更改删除查询,输入教师姓名执行查询操作或直接修改删除教师信息。
图4,3 教师管理界面
4.学生管理界面
完成管理员对学生用户信息的更改删除查询,输入任课教师以及学生姓名点击查询操作或直接修改删除学生信息。
图4,4 学生管理界面
5.账号创建界面
选择学生教师管理员的账号创建,单击选项完成操作。
图4,5 账号创建界面
6.添加学生界面
添加学生信息。姓名,学号,密码以及任课教师,点击提交完成操作。
图4,6 添加学生界面
7.修改密码界面
完成对旧密码的修改,点击提交完成操作。
图4,7 修改密码界面
图4,7,1 修改密码成功界面
8.教师功能界面
选择教师功能。单击选项,可进入题库管理,考试设置,查询系统,修改密码界面以及进行用户注销操作。
图4,8 教师功能界面
9.题库管理界面
教师完成题库管理功能。单击对题库进行添加修改删除操作。
图4,9 题库管理界面
10.试卷设置界面
完成教师对试卷的设置,编号,1分,2分,4分,5分题目数量。点击提交完成操作。
图4,10 试卷设置界面
11.教师查询成绩界面
完成教师对学生成绩的查询。输入考试时间与学生ID,单击查询完成操作。
图4,11 教师查询成绩界面
12.学生功能界面
选择学生功能。单击选项,可进入在线考试,在线练习,查询系统,修改密码界面以及执行用户注销操作。
图4,12 学生功能界面
13.学生考试界面
输入试卷编号进入考试,点击提交完成操作。
图4,13 学生考试界面
14.学生试卷设置界面
输入章节以及各分级题目数量进行试卷设置,点击提交完成操作。
图4,14 学生试卷设置界面
15.学生成绩查询界面
完成学生对成绩查询功能。输入考试时间,点击查询完成操作。
图4,15 学生成绩查询界面
16.在线练习/考试界面
学生进行练习/考试选项。单击多个选项中的一个选项完成单个题目的操作,可直接单击其他选项完成重新选择操作。
图4,16 在线练习界面
17.练习/考试结果界面
提供学生练习/考试结果查询。
图4,17 练习结果界面
(2)、事件的设计过程:
概要设计:总体设计,接口设计,运行设计,系统数据结构设计,系统出错处理设计
详细设计:程序系统的结构,模块设计
*(3)、主要代码描述:
1.查询教师示例部分代码
if(flag.equals("teacher")){
String name=request.getParameter("name");//得到模糊查询中输入的名字
ArrayList<Teacher> al=new ArrayList<Teacher>();
if(name!=null){//用于判断是不是第一次显示,即通过管理主页面的学生管理链接而来
if(name!=""){//用于判断是不是需要按条件进行查询
al=dbh.getTeacher("select top "+pageSize+" * from Tea_tb where Tea_name like '%"+name+"%' and Tea_ID not in (select top "+pageSize*(pageNow-1)+" Tea_ID from Tea_tb where Tea_name like '%"+name+"%')");
rowCount=dbh.getRowCount("select count(*) from Tea_tb where Tea_name like '%"+name+"%'");
}else{//无条件查询,显示所有教师信息
al=dbh.getTeacher("select top "+pageSize+" * from Tea_tb where Tea_ID not in (select top "+pageSize*(pageNow-1)+" Tea_ID from Tea_tb)");
rowCount=dbh.getRowCount("select count(*) from Tea_tb");
}
request.setAttribute("name", name);
}else{//第一次显示所有教师 信息。
al=dbh.getTeacher("select top "+pageSize+" * from Tea_tb where Tea_ID not in (select top "+pageSize*(pageNow-1)+" Tea_ID from Tea_tb)");
rowCount=dbh.getRowCount("select count(*) from Tea_tb");
request.setAttribute("name", "");
}
2.考试页面2分题示例部分代码
var maxtime = 120*30 //考试时间
function CountDown(){
if(maxtime>=0){
minutes = Math.floor(maxtime/30);
seconds = Math.floor(maxtime%60);
msg = "距离结束还有"+minutes+"分"+seconds+"秒";
document.all["timer"].innerHTML=msg;
if(maxtime == 5*30) alert('注意,还有5分钟!');
--maxtime;
}
else{
clearInterval(timer);
alert("时间到,结束!");
document.exam1.submit();
}
}
timer = setInterval("CountDown()",1000);
</SCRIPT>
</head>
<body>
<div align="center">
<table width="860" height="700" border="0">
<tr>
<td width="100%">
<center>
<form action="Student_Exam_Result.jsp" method="post" id="form1" target="_blank" name="exam1">
<table width="100%" border="0" background="<%=basePath %>imag/22.jpg">
<tr>
<td align="center" class="title"> <h2>课程考试题目</h2> </td>
</tr>
<div id="timer" style="color:red"></div>
<%
int Examtime=Integer.parseInt(examtime); %>
<tr><td><input type="hidden" name="examtime" value="<%=Examtime%>" ></td></tr>
<tr><td><input type="hidden" name="Title_1" value="<%=a11.size()%>" ></td></tr>
<tr><td><input type="hidden" name="Title_2" value="<%=a22.size()%>" ></td></tr>
<tr><td><input type="hidden" name="Title_4" value="<%=a44.size()%>" ></td></tr>
<tr><td><input type="hidden" name="Title_8" value="<%=a88.size()%>" ></td></tr>
<tr>
<td><h3>一、2分题,以下每题都有A、B、C、D四个选项,只有一个正确选项,选择正确的得2分,选错或不选不得分。</h3></td>
</tr>
<%
int j=1;
for(int i=0;i<a22.size();i++){
Title tl=(Title)a22.get(i);
%>
<tr><td align="center"><label></label>
<table width="100%" border="0">
<tr><td colspan="2"><%=i+1 %>、<%=tl.getTitle_name() %>( )</td></tr>
<tr>
<td width="50%"><label><input type="radio" name="bot<%=j%>" value="A" id="RadioGroup1_0" />A</label>、<%=tl.getTitle_opt_a() %></td>
<td width="50%"><label><input type="radio" name="bot<%=j%>" value="B" id="RadioGroup1_1" />B</label>、<%=tl.getTitle_opt_b() %></td>
</tr>
<tr>
<td><label><input type="radio" name="bot<%=j%>" value="C" id="RadioGroup1_2" />C</label>、<%=tl.getTitle_opt_c() %></td>
<td><label><input type="radio" name="bot<%=j%>" value="D" id="RadioGroup1_3" />D</label>、<%=tl.getTitle_opt_d() %></td>
</tr>
<tr><td><input type="hidden" name="answer<%=j%>" value="<%=tl.getTitle_answer() %>" ></td></tr>
</table>
</td>
</tr>
<%
j++;
}
%>
3.考试出题部分代码
if(flag.equals("test")){
ArrayList<Title> a1=null;
ArrayList<Title> a2=null;
ArrayList<Title> a4=null;
ArrayList<Title> a8=null;
String Cou_name=request.getParameter("Cou_name");
int Cou_ID=dbh.getID("select Cou_ID from Cou_tb where Cou_name='"+Cou_name+"'");
request.setAttribute("Cou_name", Cou_name);
Random rand=new Random();
ArrayList<Title> a11=new ArrayList<Title>();
ArrayList<Title> a22=new ArrayList<Title>();
ArrayList<Title> a44=new ArrayList<Title>();
ArrayList<Title> a88=new ArrayList<Title>();
String Title_1=request.getParameter("Title_1");
int num1=Integer.parseInt(Title_1);
String Title_2=request.getParameter("Title_2");
int num2=Integer.parseInt(Title_2);
String Title_4=request.getParameter("Title_4");
int num4=Integer.parseInt(Title_4);
String Title_8=request.getParameter("Title_8");
int num8=Integer.parseInt(Title_8);
a1=dbh.getTitle("select * from Title_tb where Title_score=1 and Cou_ID='"+Cou_ID+"'");
a2=dbh.getTitle("select * from Title_tb where Title_score=2 and Cou_ID='"+Cou_ID+"'");
a4=dbh.getTitle("select * from Title_tb where Title_score=4 and Cou_ID='"+Cou_ID+"'");
a8=dbh.getTitle("select * from Title_tb where Title_score=8 and Cou_ID='"+Cou_ID+"'");
if(num1>a1.size()||num2>a2.size()||num4>a4.size()||num8>a8.size()){
request.getRequestDispatcher("Student_Test_Info.jsp?flag=error").forward(request,response);
}else{
for(int i=0;i<num1;i++)
{
Title tl=(Title)a1.get(rand.nextInt(a1.size()));
if(a11.contains(tl))
{
i=i-1;
}else {
a11.add(tl);
}
}
for(int i=0;i<num2;i++)
{
Title tl=(Title)a2.get(rand.nextInt(a2.size()));
if(a22.contains(tl))
{
i=i-1;
}else {
a22.add(tl);
}
}
for(int i=0;i<num4;i++)
{
Title tl=a4.get(rand.nextInt(a4.size()));
if(a44.contains(tl))
{
i=i-1;
}else {
a44.add(tl);
}
}
for(int i=0;i<num8;i++)
{
Title tl=a8.get(rand.nextInt(a8.size()));
if(a88.contains(tl))
{
i=i-1;
}else {
a88.add(tl);
}
}
request.setAttribute("Cou_ID",Cou_ID);
request.setAttribute("a11", a11);
request.setAttribute("a22", a22);
request.setAttribute("a44", a44);
request.setAttribute("a88", a88);
request.getRequestDispatcher("Student_Online_Exam.jsp").forward(request, response);
}
五、系统测试
(1)、给出单元测试的测试用例:参见图4.1-4.17
(2)、给出系统测试的测试用例:参见图4.1-4.17
六、收获和体会
本次课程设计在老师的指导下以及长达一个多月的准备与开发里,我们完成了离散课程练习测验系统。从需求报告,概要设计,详细设计,软件开发,到软件完成以及测试,我们分工明确,互帮互助,从无到有,对软件的开发流程深有体会,更是明白团队合作的重要性。为了完成繁琐而复杂的软件设计,我们反复讨论,不断完善,总结网上现有开发经验并收集相关材料,才形成现有的系统。
通过这次课程设计,让我们将书本上的知识实践在一份份报告里,让我们真真切切的对软件开发与团队合作模式有了更深入的认识。
七、附录
八、参考文献
[1]邹新著,构建之法,人民邮电出版社 ,2015.7.
[2][美]Stephen R.Schach编著,面向对象与传统软件工程(中译),机械工业出版社.2003.9
[3]张海藩编著,软件工程导论,清华大学出版社,2010.1
[4]周之英编著,现代软件工程,科学出版社,2000.1
[5] [美]Roger S.Pressman著,软件工程:实践者的研究方法,2011.5
[6] [美]Steve McConnell著,Rapid Development,电子工业出版社,2003.3
[7]Ron Patton著,Software Testing,机械工业出版社,2002.3
[8]冀振燕编著,UML系统分析设计与应用案例,人民邮电出版社,2003.6
[9]吴建等编著,UML基础与Rose建模案例,人民邮电出版社,2004.10