1、MySchool 在线答题模块在线答题模块1 问题描述MySchool 考试管理系统在线答题模块:考试管理系统在线答题模块:1、学员登录学员登录 2、选题选题 3、答题答题 4、查看答题卡查看答题卡 5、自动阅卷评分自动阅卷评分要求完成在线答题模块相关界面设计及功能实现要求完成在线答题模块相关界面设计及功能实现2MySchool 数据库结构介绍数据库由教员提供数据库由教员提供 在线答题模块使用到的数据表在线答题模块使用到的数据表3问题分析-1需要使用到的数据表:nStudent:学员信息表nSubject:科目信息表nQuestion:题目信息表4问题分析-2主要功能分析1、登录n学员身份登录
2、,用户验证n记录登录的用户名和登录类型2、在线答题n选题:选择试题的科目n抽题:随机抽取20道题n答题:答题时间为20分钟,在程序中保存答案n修改答案:通过答题卡返回修改n判题:计算得分n结果显示:分数、分数条、表情、评语5问题分析-3主要界面分析n登录界面:与上机课的相同n学员主界面n选题界面n答题界面n答题卡界面n答题结果界面6问题分析-4辅助类分析nDBHelper 类:数据库连接字符串、数据库连接对象nUserHelper 类:当前登录用户名、登录类型nQuizHelper 类:1、totalSeconds:整型,答题限制时间 2、remainSeconds:整型,剩余时间 3、all
3、QuestionIds:整型数组,所有题目 Id 4、selectedStates:布尔型数组,表示题目是否已被抽中 5、questionNum:整型,题目数量 6、selectedQuestionIds:整型数组,选出的题目 Id 7、correctAnswers:字符串型数组,标准答案 8、studentAnswers:字符串型数组,学员用户的答案7问题分析-4QuizHelper 类中几个数组的关系:selectedStates题目是否被抽中题目是否被抽中0123456allQuestionIds所有题目所有题目 Id1345911100123456selectedQuestionIds
4、选出的题目选出的题目 Id 012correctAnswers标准答案标准答案012studentAnswers学员用户的答案学员用户的答案012falsefalsefalse falsefalsefalsefalse3truetrue410true未回答未回答未回答未回答未回答未回答DBC将该科目所有题目的将该科目所有题目的 Id 取出取出 题目状态都是未选中题目状态都是未选中随机抽随机抽 3 道题,道题,索引索引1、2、5被抽中被抽中取出抽中试题的标准答案取出抽中试题的标准答案用户答案都置为用户答案都置为“未回答未回答”8难点分析-1随机抽取试题:Random random=new Ran
5、dom();int questionIndex=0;/随机产生的问题的索引值随机产生的问题的索引值int i=0;while(i QuizHelper.questionNum)questionIndex=random.Next(QuizHelper.allQuestionsIds.Length);/如果没有被选中过,可以选择如果没有被选中过,可以选择 if(QuizHelper.selectedStatesquestionIndex=false)/随机数对象随机数对象生成小于指定最大值的非负随机数生成小于指定最大值的非负随机数9难点分析-2每次显示一道题目:n答题窗体增加 questionIn
6、dex 字段,记录当前显示的题目的索引值n根据selectedQuestionIds,利用 DataReader 读取题目信息10难点分析-3倒计时的时钟显示:QuizHelper.remainSecond-;minute=QuizHelper.remainSecond/60;second=QuizHelper.remainSecond%60;/控制显示格式控制显示格式lblTimer.Text=string.Format(0:00:1:00,minute,second);控制显示两位数字控制显示两位数字11难点分析-4答题卡显示答案:n用20个标签显示答案n将题目的索引写在标签的 Tag 中
7、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);item.Text=QuizHelper.studentAnswersindex;/循环每一个控件循环每一个控件判断控件是不是标签判断控件是不是标签12难点分析-5从答题卡返回修改答案:n用20个按钮显示题号n将题目的索引写在 Tag 中n20个按钮共用一个
8、Click 事件处理方法private void btnQuestion_Click(object sender,EventArgs e)/获得当前点击的按钮对应的题目索引获得当前点击的按钮对应的题目索引 int questionIndex=Convert.ToInt32(Button)sender).Tag);/自定义方法,打开答题窗体自定义方法,打开答题窗体 ShowAnswerQuestionForm(questionIndex);13难点分析-6颜色条表示分数:/计算得分计算得分int score=correctNum*100/QuizHelper.questionNum;lblMar
9、k.Text=score.ToString()+分分;/确定显示分数的确定显示分数的label的宽度的宽度lblStudentScoreStrip.Width=lblFullMarkStrip.Width*score/100;/根据不同的得分,显示不同的颜色根据不同的得分,显示不同的颜色if(score 60)lblStudentScoreStrip.BackColor=Color.Red;lblComment.Text=该好好复习啦该好好复习啦!;/14阶段划分第一阶段(20分钟)n设计学员主窗体,实现学员登录功能第二阶段(30分钟)n设计选题窗体,实现部分辅助功能第三阶段(80分钟)n实现
10、随机抽题功能第四阶段(80分钟)n设计答题窗体,实现答题功能第五阶段(60分钟)n设计答题卡窗体,实现答案显示和返回修改答案功能第六阶段(30分钟)n设计答题结果显示窗体,实现判题功能15第一阶段第一阶段(20分钟)设计学员主窗体,实现学员登录功能要求学员自己动手操作,教员巡视,解答学员提出的问题16阶段检查针对第一阶段抽查学员的操作结果教员给出点评或集中演示难点部分17第一阶段结果演示第一阶段设计的学员主窗体:18第二阶段第二阶段(30分钟)设计选题窗体,实现部分辅助功能要求学员自己动手设计选题窗体,实现科目组合框、退出答题的功能教员巡视,解答学员提出的问题19阶段检查针对第二阶段抽查学员的
11、编码结果教员给出点评或集中演示难点部分20第二阶段结果演示选题窗体:21第二阶段标准代码演示添加科目名称到科目组合框中:string sql=SELECT SubjectName FROM Subject;try SqlCommand command=new SqlCommand(sql,DBHelper.connection);DBHelper.connection.Open();/执行查询执行查询 SqlDataReader dataReader=command.ExecuteReader();/循环添加到组合框中循环添加到组合框中 while(dataReader.Read()cboSu
12、bjects.Items.Add(dataReaderSubjectName.ToString();dataReader.Close();/22第三阶段第三阶段(80分钟)实现随机抽题功能要求学员自己动手操作,教员巡视,解答学员提出的问题23阶段检查针对第三阶段抽查学员的编码结果抽查学员编写的完整代码,要求学员上台讲解,并演示运行结果教员给出点评24第三阶段标准代码演示随机抽题:自定义 SetSelectedQuestionIds()方法Random random=new Random();int questionIndex=0;/随机产生的问题的索引值随机产生的问题的索引值/抽取每一道题并保
13、存抽出的题目的抽取每一道题并保存抽出的题目的Idint i=0;/记录抽取了几道题记录抽取了几道题while(i 0)QuizHelper.remainSeconds-;minute=QuizHelper.remainSeconds/60;second=QuizHelper.remainSeconds%60;/以以“分分:秒秒”的形式显示时间的形式显示时间 lblTimer.Text=string.Format(0:00:1:00,minute,second);else /提示时间到,转到结果显示界面提示时间到,转到结果显示界面 32第五阶段第五阶段(60分钟)1、设计答题卡窗体 2、实现答案
14、显示和返回修改答案功能要求学员自己动手操作,教员巡视,解答学员提出的问题33阶段检查针对第五阶段抽查学员的编码结果抽查学员编写的完整代码,要求学员上台讲解,并演示运行结果教员给出点评34第五阶段窗体效果演示答题卡窗体:35第五阶段标准代码演示-1窗体加载时,显示答案:/窗体的窗体的 Load 事件事件private void AnswerCardForm_Load(object sender,EventArgs e)int index=0;foreach(Control item in this.Controls)if(item is Label)/如果是标签如果是标签 index=Conve
15、rt.ToInt32(item.Tag);if(index!=-1)item.Text=QuizHelper.studentAnswersindex;tmrCostTime.Start();/启动倒计时的计时器启动倒计时的计时器36第五阶段标准代码演示-2点击题号,返回修改答案n20个题号按钮共用一个 Click 事件处理方法private void btnQuestion_Click(object sender,EventArgs e)/获得当前点击的按钮对应的题目索引获得当前点击的按钮对应的题目索引 int questionIndex=Convert.ToInt32(Button)send
16、er).Tag);/打开答题窗体打开答题窗体 AnswerQuestionForm answerQuestionForm =new AnswerQuestionForm();/设置答题窗体显示的题目索引设置答题窗体显示的题目索引 answerQuestionForm.questionIndex=questionId;answerQuestionForm.MdiParent=this.MdiParent;answerQuestionForm.Show();this.Close();37第六阶段第六阶段(30分钟)设计答题结果显示窗体,实现判题功能要求学员自己动手操作,教员巡视,解答学员提出的问题
17、38阶段检查针对第六阶段抽查学员的编码结果抽查学员编写的完整代码,要求学员上台讲解,并演示运行结果教员给出点评39第六阶段窗体效果演示结果显示窗体:40第六阶段标准代码演示-1显示分数:private void QuizResultForm_Load(object sender,EventArgs e)int correctNum=0;/答对的题目数量答对的题目数量 for(int i=0;i QuizHelper.questionNum;i+)if(QuizHelper.studentAnswersi=QuizHelper.correctAnswersi)correctNum+;/计算得分计
18、算得分 int score=correctNum*100/QuizHelper.questionNum;lblMark.Text=score.ToString()+分分;/确定分数条和评语确定分数条和评语 /41第六阶段标准代码演示-2显示分数:private void QuizResultForm_Load(object sender,EventArgs e)/计算分数计算分数./确定显示分数的确定显示分数的label的宽度的宽度 lblStudentScoreStrip.Width=lblFullMarkStrip.Width*score/100;/根据不同的得分,显示不同的颜色根据不同的
19、得分,显示不同的颜色 if(score=60&score 85)/42总结巩固的知识点:n条件判断语句:if、嵌套 if、switchn循环结构:while、for、foreachn一维数组:整型、布尔型、字符串型n自定义方法:抽取试题、获取标准答案等n常用的 WinForms 控件:Label、TextBox、ComboBox、RadioButton、Button、PictureBox、ImageList、Timern静态字段实现窗体间的数据传递:QuizHelper、DBHelper、UserHelpernADO.NET 操作数据库:Connection、Command、DataReader43Thank you44