论文部分内容阅读
摘要: 介绍.NET技术下开发考试系统中随机抽题、在线答题、评卷等一些关键问题的设计分析,以及C#代码实现。
关键词: DotNET技术;C#语言; SQL server2005
中图分类号:TP311.1 文献标识码:A 文章编号:1671-7597(2011)0210072-02
0 引言
系统使用的开发语言:C#;开发平台:Microsoft Visual Studio 2005;数据库:Microsoft SQL Server 2005;开发技术:DotNET;数据库访问技术:ADO.NET。
传统考试的过程是:出题、答题、评卷。在线考试系统中关键的部分就是:实现随机抽题功能;实现答题功能;实现判题功能,下面分析这几部分代码实现。
1 设计分析与代码实现
1.1 实现随机抽题功能
假设试题共有7道题目,现在要随机抽取3道题目的步骤如下:
第一步,将7道题目的Id全部取出,放在allQuestionIds数组中,注意,这些Id是标识,由于题目信息的增删可能会造成Id不连续。
第二步,为了避免重复抽取题目,用selectedStates数组来表示对应索引的题目是否被抽中过,false表示没被抽中,所以初始值都为false。
第三步,在allQuestionIds索引0-6中随机抽取3个数,假设1、2、5被抽中。每抽中一个,就将抽中的索引对因的题目Id取出来,放在selectedQuestionIds数组中,并把该题目的抽中状态置为true。
第四步,根据selectedQuestionIds数组中的题目Id,取出这些题目的标准答案,放在correctAnswers数组中。
第五步,将考生用户答案数组studentAnswers初始值置为“未回答”。
实现代码如下:
// 抽取试题
private void SetSelectedQuestionIds()
{
Random random = new Random();
int questionIndex = 0; // 随机产生的问题的索引值
// 抽取每一道题并保存抽出的题目的Id
int i = 0; // 记录抽取了几道题
while (i < QuizHelper.questionNum)
{
// 在所有题目的数量范围内抽题产生随机数
questionIndex = random.Next(Quiz
Helper.allQuestionIds.Length);
if (QuizHelper.selectedStates[questionIndex] == false)// 如果没有被选中过,可以选择
{
QuizHelper.selectedQuestionIds[i] = QuizHelper.allQuestionIds[questionIndex];
QuizHelper.selectedStates[questionIndex] = true;
i++;
}
}
}
// 取出試题的标准答案
private void SetRightAnswers()
{
string sql = ""; // 查询用sql语句
SqlCommand command = new SqlCommand();
command.Connection = DBHelper.connection;
DBHelper.connection.Open();
for (int i = 0;i < QuizHelper.selectedQuestionIds.Length;i++)
{
sql = string.Format("SELECT Answer FROM Question WHERE QuestionId={0}",
QuizHelper.selectedQuestionIds[i]);
command.CommandText = sql;
// 为标准答案数组赋值
QuizHelper.correctAnswers[i] = command.ExecuteScalar().ToString();
}
DBHelper.connection.Close();
}
1.2 实现答题功能
这部分以选择题为例说明,其它题型参考。
1)窗体Load事件处理的事务
在窗体出现时,要启动倒计时的计时器。还要显示需要的题目的信息。如果是从答题卡返回的,那么可能题目已经做答过,要把用户选择的答案对应的选项选中。
如下代码所示。
private void AnswerQuestionForm_Load(object sender,EventArgs e)
{
tmrCostTime.Start();// 启动计时器
GetQuestionDetails(); // 显示题目信息
CheckOption();// 如果题目已经答过,让相应的选项选中
CheckBtnNext();// 确定是否到了最后一题
}
2)检查选项是否应被选中// 如果已经答了题目,选中相应的选项
private void 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:
rdoOptionA.Checked = false;
rdoOptionB.Checked = false;
rdoOptionC.Checked = false;
rdoOptionD.Checked = false;
break;
}
3)记录学生的答案
四个单选按钮共用一个 Click 事件处理方法。
// 选项单选按钮的单击事件处理,选择答案时,记录答案
private void rdoOption_Click(object sender,EventArgs e)
{
QuizHelper.studentAnswers[questionIndex] = Convert.ToString(((RadioButton)sender).Tag);
}
1.3 实现判题功能
将用户答案数组与标准答案数组比较来计算答对题目的数量。按答對题目按每道题的分值来计算得分。
// 计算答对的题目数量
int correctNum = 0;
for (int i = 0;i < QuizHelper.questionNum;i++)
{
if (QuizHelper.studentAnswers[i] == QuizHelper.correctAnswers[i])
{
correctNum++;
}
}
// 计算得分
// QuizHelper.questionScore 记录每道题的分值
int score = correctNum *QuizHelper.questionScore;
// 显示分数
lblMark.Text = score.ToString()+"分";
2 结论
这个系统是基于C/S架构开发的,在计算机相关课程考试中经过了实践应用。但实际项目设计时,需要在题目表中加入试题难度以及试题所属章节,在抽题算法中应考虑这两项内容的百分比。这样组卷才更科学。
参考文献:
[1]徐祗祥,使用C#开发数据库应用程序[M].北京:科学技术文献出版社,2008,172-196.
[2]张光建,浅谈无纸化考试[J].中国教育教学杂志,2006(4)132-133.
作者简介:
张光建,四川建筑职业技术学院讲师,研究方向:IT教育、软件开发。
关键词: DotNET技术;C#语言; SQL server2005
中图分类号:TP311.1 文献标识码:A 文章编号:1671-7597(2011)0210072-02
0 引言
系统使用的开发语言:C#;开发平台:Microsoft Visual Studio 2005;数据库:Microsoft SQL Server 2005;开发技术:DotNET;数据库访问技术:ADO.NET。
传统考试的过程是:出题、答题、评卷。在线考试系统中关键的部分就是:实现随机抽题功能;实现答题功能;实现判题功能,下面分析这几部分代码实现。
1 设计分析与代码实现
1.1 实现随机抽题功能
假设试题共有7道题目,现在要随机抽取3道题目的步骤如下:
第一步,将7道题目的Id全部取出,放在allQuestionIds数组中,注意,这些Id是标识,由于题目信息的增删可能会造成Id不连续。
第二步,为了避免重复抽取题目,用selectedStates数组来表示对应索引的题目是否被抽中过,false表示没被抽中,所以初始值都为false。
第三步,在allQuestionIds索引0-6中随机抽取3个数,假设1、2、5被抽中。每抽中一个,就将抽中的索引对因的题目Id取出来,放在selectedQuestionIds数组中,并把该题目的抽中状态置为true。
第四步,根据selectedQuestionIds数组中的题目Id,取出这些题目的标准答案,放在correctAnswers数组中。
第五步,将考生用户答案数组studentAnswers初始值置为“未回答”。
实现代码如下:
// 抽取试题
private void SetSelectedQuestionIds()
{
Random random = new Random();
int questionIndex = 0; // 随机产生的问题的索引值
// 抽取每一道题并保存抽出的题目的Id
int i = 0; // 记录抽取了几道题
while (i < QuizHelper.questionNum)
{
// 在所有题目的数量范围内抽题产生随机数
questionIndex = random.Next(Quiz
Helper.allQuestionIds.Length);
if (QuizHelper.selectedStates[questionIndex] == false)// 如果没有被选中过,可以选择
{
QuizHelper.selectedQuestionIds[i] = QuizHelper.allQuestionIds[questionIndex];
QuizHelper.selectedStates[questionIndex] = true;
i++;
}
}
}
// 取出試题的标准答案
private void SetRightAnswers()
{
string sql = ""; // 查询用sql语句
SqlCommand command = new SqlCommand();
command.Connection = DBHelper.connection;
DBHelper.connection.Open();
for (int i = 0;i < QuizHelper.selectedQuestionIds.Length;i++)
{
sql = string.Format("SELECT Answer FROM Question WHERE QuestionId={0}",
QuizHelper.selectedQuestionIds[i]);
command.CommandText = sql;
// 为标准答案数组赋值
QuizHelper.correctAnswers[i] = command.ExecuteScalar().ToString();
}
DBHelper.connection.Close();
}
1.2 实现答题功能
这部分以选择题为例说明,其它题型参考。
1)窗体Load事件处理的事务
在窗体出现时,要启动倒计时的计时器。还要显示需要的题目的信息。如果是从答题卡返回的,那么可能题目已经做答过,要把用户选择的答案对应的选项选中。
如下代码所示。
private void AnswerQuestionForm_Load(object sender,EventArgs e)
{
tmrCostTime.Start();// 启动计时器
GetQuestionDetails(); // 显示题目信息
CheckOption();// 如果题目已经答过,让相应的选项选中
CheckBtnNext();// 确定是否到了最后一题
}
2)检查选项是否应被选中// 如果已经答了题目,选中相应的选项
private void 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:
rdoOptionA.Checked = false;
rdoOptionB.Checked = false;
rdoOptionC.Checked = false;
rdoOptionD.Checked = false;
break;
}
3)记录学生的答案
四个单选按钮共用一个 Click 事件处理方法。
// 选项单选按钮的单击事件处理,选择答案时,记录答案
private void rdoOption_Click(object sender,EventArgs e)
{
QuizHelper.studentAnswers[questionIndex] = Convert.ToString(((RadioButton)sender).Tag);
}
1.3 实现判题功能
将用户答案数组与标准答案数组比较来计算答对题目的数量。按答對题目按每道题的分值来计算得分。
// 计算答对的题目数量
int correctNum = 0;
for (int i = 0;i < QuizHelper.questionNum;i++)
{
if (QuizHelper.studentAnswers[i] == QuizHelper.correctAnswers[i])
{
correctNum++;
}
}
// 计算得分
// QuizHelper.questionScore 记录每道题的分值
int score = correctNum *QuizHelper.questionScore;
// 显示分数
lblMark.Text = score.ToString()+"分";
2 结论
这个系统是基于C/S架构开发的,在计算机相关课程考试中经过了实践应用。但实际项目设计时,需要在题目表中加入试题难度以及试题所属章节,在抽题算法中应考虑这两项内容的百分比。这样组卷才更科学。
参考文献:
[1]徐祗祥,使用C#开发数据库应用程序[M].北京:科学技术文献出版社,2008,172-196.
[2]张光建,浅谈无纸化考试[J].中国教育教学杂志,2006(4)132-133.
作者简介:
张光建,四川建筑职业技术学院讲师,研究方向:IT教育、软件开发。