班 级 xxxxxxxx
学号 xxxxxxxxxx
毕业论文(
)
题 目 在线考试系统的设计与实现
姓 名 xxx
系 部 信息工程系
专 业 软件技术
指 导 教 师 xxx 职称 助教
日 期 xxx
在线考试系统设计与实现
XXX
【摘 要】人类已经步入了崭新的21世纪,以Internet技术为代表的信息技术为人类创造了一种新的不受地域、时间和计算机本身的约束的信息交流、共享和协作方式。在线考试系统前台主要实现考生在线考试、提交自动评分,后台主要实现添加、编辑和删除试题以及编辑试题分值等功能。
【关键词】Internet;计算机;在线考试;c#2.0+Microsoft SQL Server 2005;
1 系统分析
1.1系统模块的教员系统设计
登入教师模块,本窗体有试题信息管理、考试结果管理、个人信息维护,可以对试题进行添加、查询、列表。
1.2系统模块的学员系统设计
登入学员模块,本窗体有编辑个人信息、在线考试、帮助,可以对学员信息的添加、修改。
打开“在线考试”窗体,选择考试科目-开始考试-交卷评分
1.3系统模块的管理员设计
打开“管理员”窗体,本窗体有学员信息管理、教员信息管理窗体、
在线考试系统的业务
图
图1在线考试系统的业务流程图
2数据库的设计
在开发在线系统之前,分析了系统的数据量,由于在线考试系统中试题及考生信息的数据量会很大,因此选择Microsoft SQL Server2005数据库存储数据信息,数据库名为db_ExamOnline, 操作如下:
图2建立数据库
步骤一 打开Microsoft SQL Server2005
打开Microsoft SQL Server2005之后,输入服务器名称和身份验证,然后点击“连接”。
步骤二 单击数据库-新建-数据库,如图2所示,弹出保存对话框,选择好程序所在的目录输入保存名称“db_ExamOnline”,更改路径,单击确定按钮,即完成了数据库的设计。
从此以后,设计的所有数据表都属于这个数据库里面的表了。
在数据库中创建了8个数据表用于存储不同的信息。
图3系统中数据表
2.1管理员信息表Admin的设计
步骤一 选中数据库窗口对象下面的“表”,新建表,表名为 Admin,数据表有三个字段名:管理员编号(Adminid)、管理员姓名(LoginId )、管理员密码(LoginPwd )。
但管理员编号不能有相同的值,所以要把Adminid设置为关键字。,如图4所示。选中“管理员编号”所在行,然后单击工具栏上面的钥匙图标即可,在字段名称列里面直接输入字段名称“Adminid”,在数据类型里面选择“int”字段类型。
图4设置管理员编号关键字
步骤二 单击“关闭”按钮会自动弹出一个对话框,在该对话框里面输入表名“Admin”,然后确定保存数据表。
现在,管理员窗体用到的管理数据表Admin已经创建好了。然后打开表在里面输入一些数据,例如图5管理员编号为“1”,登录名为“admin”;登入密码为“00000”。
图5管理员信息窗体
2.2教员信息表Teacher的设计
在数据库下新建表,数据表有7个字段名,分别是 教师编号(teacherId)、教师登录名(LoginId)、教师登录密码(LoginPwd)、教师状态(UserStateId)、教师姓名(TeacherName) 、性别(Sex)、生日(Birthday),设教师编号为关键字,表名保存为”Teacher”,然后打开表输入一些数据,如下图:
图6教员信息表
2.3学员信息表Student的设计
在数据表下新建表,数据表的字段名分别是 学生编号(Studentid)、学生登录名(LoginId)、学生登录密码(LoginPwd )、 学生状态(UserStateId)、学生姓名(StudentName)、性别(Sex)、班级号(ClassId)、学号(StudentNo)、学生Id号(StudentIdNo)、主修(Major) 、之前的学校(SchoolBefore)、电话(Phone)地址(Address)、邮编(PostalCode)、希望工作城市(CityWanted)、希望工作(JobWanted)、备注(Comment)、电子邮件(Email),设置学生编号为关键字,表保存为“Student”,再打开表填入数据,如下图所示:
图7学员信息表
2.4系统的数据表除了上面的学员、教员、管理员表外还要建另外几个表,分别是年级表(Grade)、班级表(Class)、科目表(Subject)、试题表( Question)、状态表(UserState),分别对每个表的字段名、类型和主键进行详细设置,再打开每个表输入信息。如下图是试题表的信息,以此完成其他几个表,及完成所有数据库的工作。
图8试题信息表E-R图
图9试题信息表
3系统模块的设计
3.1登录模块的窗体设计
登录窗体是用来登录程序用的,本程序不是随便什么人都可以打开的。只有具有权限的用户才可以运行,并不是任何人都可以参加在线考试,默认是不允许匿名登录的,只有经过管理员分配的编号和密码才能登录在线考试系统参加考试,这时就需要通过登录模块验证登录用户的合法性。登录模块是在线考试系统的第一道安全屏障,登录模块运行结果如图10所示。
3.1.1用户登录用户名和密码后,选择登录类型再按“登录”按钮,根据选择的登录身份验证账号和密码是否正确,如果正确,则会转向与登录身份相符的页面,关键具体代码如下:
// “登录”按钮的单击事件
private void btnLogin_Click(object sender, EventArgs e)
{
bool isValidUser = false; // 标识是否为合法用户
string message = ""; // 验证不通过弹出的消息
if (ValidateInput()) // 验证输入成功,显示窗体
{
// 验证用户是否为合法用户
isValidUser = ValidateUser(
txtLoginId.Text.Trim(),
txtLoginPwd.Text.Trim(),
cboLoginType.Text.Trim(),
ref message
);
// 如果是合法用户,就跳转到相应的窗体
if (isValidUser)
{
//
登录用户名和登录类型
UserHelper.loginId = txtLoginId.Text.Trim();
UserHelper.loginType = cboLoginType.Text;
if (cboLoginType.Text == "教员")
{
// 创建教员主窗体对象
TeacherForm teacherForm = new TeacherForm();
// 显示窗体
teacherForm.Show();
// 登录窗体隐藏
this.Visible = false;
}
else if (cboLoginType.Text == "学员")
{
// 试题选择窗体对象
StudentForm studentForm = new StudentForm();
// 显示窗体
studentForm.Show();
this.Visible = false;
}
else if (cboLoginType.Text == "管理员")
{
// 试题选择窗体对象
AdminForm admin = new AdminForm();
admin.Show();
this.Visible = false;
}
}
else // 验证合法用户失败,给出提示
{
MessageBox.Show(message,"登录提示",MessageBoxButtons.OK,MessageBoxIcon.Warning);
}
}
3.1.2单击“取消”按钮,关闭登录窗口。代码如下:
// 取消登录,退出应用程序
private void btnCancel_Click(object sender, EventArgs e)
{
Application.Exit();
}
3.2管理员模块窗体的设计
新建一个网页,命名为AdminForm.aspx主要用于学员、教员信息的管理,点击教员信息管理会弹跳出教员信息列表,对教师信息的保存、修改、刷新等操作,点击学员信息管理控件会弹跳出学员信息表,对学生信息表的删除、保存、添加、刷新等操作。关键图如下所示
图11教员信息列表
图12学员信息列表
3.3学员模块窗体的设计
3.3.1新建一个网页,名为StudentFrom.aspx主要是编辑学员的个人信息,在线答题,考试交流,在编辑学员个人信息时会出现学员注册信息表窗体,对未注册的学员先进行注册同时会把数据存储到建好的数据库中,然后再点击“在线答题”控件,则弹跳出试题选择窗体,考生看完说明后,选择所考科目,根据考试的科目会弹跳出相符的页面。主要代码如下。
string sql = "SELECT SubjectName FROM Subject";
try
{
SqlCommand command =
new SqlCommand(sql, DBHelper.connection);
DBHelper.connection.Open();
// 执行查询
SqlDataReader dataReader = command.ExecuteReader();
// 循环添加到组合框中
while (dataReader.Read())
{
cboSubjects.Items.Add(dataReader["SubjectName"].ToString());
}
dataReader.Close();
}
// ……
3.3.2随机抽题: 自定义 SetSelectedQuestionIds() 方法
Random random = new Random();
int questionIndex = 0; // 随机产生的问题的索引值
// 抽取每一道题并保存抽出的题目的Id
int i = 0; // 记录抽取了几道题
while (i < QuizHelper.questionNum)
{
// 在所有问题的数量范围内抽题产生随机数
questionIndex = random.Next(QuizHelper.allQuestionIds.Length);
// 如果没有被选中过,可以选择
if (QuizHelper.selectedStates[questionIndex] == false)
{
QuizHelper.selectedQuestionIds[i] =
QuizHelper.allQuestionIds[questionIndex];
QuizHelper.selectedStates[questionIndex] = true;
i++;
}
}
3.3.3在线考试的“回答问题”页面的设计
在新建的页面里面添加时间(tmrCostTime),控制整个考试时间,代码如下:
private void tmrCostTime_Tick(object sender, EventArgs e)
{
int minute; // 当前的分钟
int second; // 秒
// 如果还有剩余时间,就显示剩余的分钟和秒数
if (QuizHelper.remainSeconds > 0)
{
QuizHelper.remainSeconds--;
minute = QuizHelper.remainSeconds / 60;
second = QuizHelper.remainSeconds % 60;
lblTimer.Text = string.Format("{0:00}:{1:00}", minute, second); // 补充
}
// 否则,就提示交卷
else
{
tmrCostTime.Stop();
MessageBox.Show("时间到了,该交卷了!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
QuizResultForm quizResultForm = new QuizResultForm();
quizResultForm.MdiParent = this.MdiParent;
quizResultForm.Show();
this.Close();
}
3.3.4 CheckOption() 方法:
switch (QuizHelper.studentAnswers[questionIndex])
{
case "A":
rdoOptionA.Checked = true;
break;
case "B":
rdoOptionB.Checked = true;
break;
case "C":
rdoOptionC.Checked = true;
break;
case "D":
rdoOptionD.Checked = true;
break;
default:
// 四个选项的 Checked 都设为 false
break;
}
3.3.5记录学员的答案:
四个单选按钮共用一个 Click 事件处理方法
// 选择答案时,记录答案
private void rdoOption_Click(object sender, EventArgs e)
{
QuizHelper.studentAnswers[questionIndex] =
Convert.ToString( ( (RadioButton)sender ).Tag);
}
3.4在线考试答题卡页面的设计
3.4.1窗体加载时,显示答案:
// 窗体的 Load 事件
private void AnswerCardForm_Load(object sender, EventArgs e)
{
int index = 0;
foreach (Control item in this.Controls)
{
if (item is Label ) // 如果是标签
{
index = Convert.ToInt32(item.Tag);
if (index != -1)
{
item.Text = QuizHelper.studentAnswers[index];
}
}
}
tmrCostTime.Start(); // 启动倒计时的计时器
}
3.4.2点击题号,返回修改答案
20个题号按钮共用一个 Click 事件处理方法,代码如下所示:
private void btnQuestion_Click(object sender, EventArgs e)
{
// 获得当前点击的按钮对应的题目索引
int questionIndex = Convert.ToInt32(((Button)sender).Tag);
// 打开答题窗体
AnswerQuestionForm answerQuestionForm
= new AnswerQuestionForm();
// 设置答题窗体显示的题目索引
answerQuestionForm.questionIndex = questionId;
answerQuestionForm.MdiParent = this.MdiParent;
answerQuestionForm.Show();
this.Close();
}
3.4显示结果窗体
图13答题结果窗体
分数的显示代码如下:
private void QuizResultForm_Load(object sender, EventArgs e)
{
int correctNum = 0; // 答对的题目数量
for (int i = 0; i < QuizHelper.questionNum; i++)
{
if (QuizHelper.studentAnswers[i] ==QuizHelper.correctAnswers[i])
{
correctNum++;
}
}
// 计算得分
int score = correctNum * 100 / QuizHelper.questionNum;
lblMark.Text = score.ToString()+"分";
// 确定分数条和评语
// ……
}
private void QuizResultForm_Load(object sender, EventArgs e)
{
// 计算分数 …….
// 确定显示分数的label的宽度
lblStudentScoreStrip.Width = lblFullMarkStrip.Width * score / 100;
// 根据不同的得分,显示不同的颜色
if (score < 60)
{
lblStudentScoreStrip.BackColor = Color.Red;
lblComment.Text = "该好好复习啦!";
picFace.Image = ilFaces.Images[0];
}
else if (score >= 60 && score < 85)
{ // …… }
// ……
3.4教员模块窗体的设计
新建一个网页名为TeacherForm.aspx,主要用于添加试题、查询试题、试题列表,当点击添加试题控件时会打开新增试题窗体,关键代码如下:
// 点击时,打开新增试题窗体
private void tsmiAddQuestion_Click(object sender, EventArgs e)
{
// 创建窗体对象
AddQuestionForm addQuestionForm = new AddQuestionForm();
// 设置 MDI 主窗体
addQuestionForm.MdiParent = this;
// 显示窗体
addQuestionForm.Show();
}
点击查询试题控件,会显示查询试题窗体,代码如下:
private void tsmiSearchQuestion_Click(object sender, EventArgs e)
{
SearchQuestionForm searchForm = new SearchQuestionForm();
searchForm.MdiParent = this;
searchForm.Show();
}
点击试题列表控件时,会显示出试题列表窗体,代码如下:
// 显示试题列表窗体
private void tsmiQuestionList_Click(object sender, EventArgs e)
{
QuestionListForm questionListForm = new QuestionListForm();
questionListForm.MdiParent = this;
questionListForm.Show();
}
设置窗体加载事件,当窗体被打开时,在该弹跳出的窗体下方显示教员的登录信息,主要代码如下:
// 窗体加载事件处理
private void TeacherForm_Load(object sender, EventArgs e)
{
// 设置状态栏标签显示的文字
lblTeacher.Text = string.Format("教员{0}登录了!",UserHelper.loginId);
}
教员窗体里面除了试题管理、教员管理还有窗口及帮助,打开“窗口”窗体,弹跳出下面页面。
点击“帮助”下的关于控件弹跳出帮助窗口,具体代码如下:
// 点击菜单中的“帮助”->”关于”,以模式窗口显示 About 窗体
private void tsmiAbout_Click(object sender, EventArgs e)
{
AboutForm aboutForm = new AboutForm();
aboutForm.ShowDialog(); // 以模式窗口显示
}
参考文献
[1]王先国.UML统一建模使用教程[M].北京:清华大学出版社,2009.4
[2]唐政、房大伟.C#项目开发全程实录[M].北京:清华大学出版社,2008.6
[3]王熙宁,宋宝玉,辛瑞杰. 网上考试系统开发模式与设计[J]. 情报科学, 2004,(06) .
[4]王付山.网上考试系统的设计与实现[J].电脑知识与技术,2007,1
[5]吕俊.WWW环境下在线考试系统的设计与实现[M].电子计算机与外部设备,1999
[6]于兆勤.基于INTERNET的考试系统的研究与开发[M].广东广播大学学报,2001
[7]沈大林.PhotoshopCS2图像处理
教程.中国铁道出版社,2007.3
致谢
本毕业设计最终得以顺利完成,非常感谢我的指导教师高正红老师。从设计选题直到设计的最终完成,他都给予我尽心尽力的指导。XXX老师严谨的治学态度深深的影响着我,对我今后的学习、工作、生活必将产生很大的影响。借此机会,特向老师表示最诚挚的感谢。
感谢xxxx学院的所有领导和老师。他们严谨的学风、渊博的知识、诲人不倦的品格一直感染和激励着我不断上进,使我大学三年的时光充实而有意义,海纳百川,取则行远,在这所美丽的校园里,我成长了许多。
在本系统的设计中,我也参照了大量的著作和文章,许多学者的科研成果及写作思路给我很大启发,在此向这些学者们表示由衷的感谢。感谢我的家人、同学、朋友对我的大力支持,他们的无私奉献、关爱和支持使我能够继续去追求自己的人生理想和目标。感谢所有关心、帮助和支持我的人。