• 考试系统试题实现(单选项)


    Insus.NET一直想把单选项试题实现的想法写成博文。想实现单选项试题,有几个问题需要清楚的:
    第一是选项内容,由几个选项组成,一个,二个还是三个四个等,选项的内容是A,B,C,还是其它内容,考员作答选择时,是存储Key值,还是存储显示值?因此有设计这些时,能够实现单选选项能有几种形式。

    第二是单选题,标题内容,以及用一个字段来存储标准答案(本次演示),也可以把答案存放入另外一个单独的表中。

    第三是,考员的答卷,需要存储,在考试时间之内,可以更改自己的答案。因此此表的字段有 用户ID,试题ID,答案,时间,其实真正的设计,也许需要考虑一个用户可以考几次,选择的题库等等...

    本次演示,只是实现试题显示,考员作答存储,以及读取等等功能,试题库创建与产生,在此不作演示。

     首先创建一个表,作为存储单选项类型,主要是为了解决单选的选项多少,内容不一样的情况。

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:         Insus.NET
    -- Create date:     2013-07-17
    -- Description:     单选项类别.
    -- =============================================
    CREATE TABLE [dbo].[SingleChooseType]
    (
        [sct_nbr] TINYINT IDENTITY(1,1) NOT NULL PRIMARY KEY,
        [Type] NVARCHAR(30) NOT NULL
    )
    GO
    View Code


    单选项表:

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:          Insus.NET
    -- Create date:     2013-07-17
    -- Description:     单选项.
    -- =============================================
    CREATE TABLE [dbo].[SingleChoose]
    (
        [sc_nbr] TINYINT IDENTITY(1,1) NOT NULL PRIMARY KEY,
        [sct_nbr] TINYINT NOT NULL FOREIGN KEY REFERENCES [dbo].[SingleChooseType] ([sct_nbr])
        [Content] NVARCHAR(30)     
    )
    GO
    View Code

     
    单选项试题:

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:           Insus.NET
    -- Create date:        2013-07-17
    -- Description:     单选试题。
    -- =============================================
    CREATE TABLE [dbo].[SC_Questions]
    (
        [scq_nbr] INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
        [Questions] NVARCHAR(500) NOT NULL,
        [sct_nbr] TINYINT NOT NULL FOREIGN KEY REFERENCES [dbo].[SingleChooseType] ([sct_nbr]),
        [Std_Answer] TINYINT NULL  FOREIGN KEY REFERENCES [dbo].[SingleChoose] ([sc_nbr])  --考虑到单选项项目多少,还是存储key值。
    )
    View Code


    下面为演示准备,创建一些选项类别,选项以及单选项试题。
    选项类别中,Insus.NET创建四种类别,当然这些名字,任你自由发挥。

     
    每种类别选项内容,看实际情况而定,来设定选项。



    下面Insus.NET尝试添加一些选择题。



    接下来,Insus.NET还要设计一张表,是存储每一位考员的考试题。真正的考试,应该是考员对应题库号,但现在只是演示单选,因此直接存储选择题目。在考员进入考试时,会把题目复制过来。表结构大约如下:

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:         Insus.NET
    -- Create date:    2013-07-17
    -- Description:    用户考卷
    -- =============================================
    CREATE TABLE [dbo].[Test]
    (
        [test_nbr] INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
        [User_Test_num] VARCHAR(20) NOT NULL,
        [scq_nbr] INT NOT NULL FOREIGN KEY REFERENCES [dbo].[SC_Questions] ([scq_nbr]),
        [Answer] TINYINT NULL --考员有可以不选择,因此设为可空
        --当然还有考试时间,是否提交考卷,得分成绩,评卷情况.....
    )
    
    GO
    View Code


    下面是用户注册成功之后,系统需要执行一个存储过程,创建用户的试题,或登录考试系统之后,需要选择一份试题。

    -- =============================================
    -- Author:         Insus.NET
    -- Create date:    2013-07-17
    -- Description:    用户注册成功系统产生试卷或是选择一份试卷
    -- =============================================
    CREATE PROCEDURE [dbo].[usp_test_Examination]
    (
        @User_Test_num VARCHAR(20)
    )
    AS
    IF NOT EXISTS (SELECT TOP 1 1 FROM [dbo].[Test] WHERE [User_Test_num] = @User_Test_num)
    INSERT INTO [dbo].[Test] ([User_Test_num],[scq_nbr]) SELECT @User_Test_num,[scq_nbr] FROM [dbo].[SC_Questions]
    
    GO
    View Code


    OK,考员("EU_001")开始作题时,需要把试卷显示于网页上。

    -- =============================================
    -- Author:         Insus.NET
    -- Create date:    2013-07-17
    -- Description:    用户作题试卷
    -- =============================================
    CREATE PROCEDURE [dbo].[usp_Test_GetByUser]
    (
        @User_Test_num VARCHAR(20)
    )
    AS
    --这里需要作些判断,如是否提交,时间过期,试卷状态等等。
    SELECT [test_nbr],[User_Test_num],q.[scq_nbr],[Questions],[sct_nbr],[Answer] FROM [dbo].[Test] AS t 
    LEFT JOIN [dbo].[SC_Questions] AS q ON (t.[scq_nbr] = q.[scq_nbr])
    WHERE [User_Test_num] = @User_Test_num
    
    GO
    View Code


    他的试卷在数据库初始信息如下:


    在显示考员题目时,还是把选择显示出来。

    -- =============================================
    -- Author:         Insus.NET
    -- Create date:    2013-07-17
    -- Description:    选项内容
    -- =============================================
    CREATE PROCEDURE [dbo].[usp_SingleChoose_GetByType]
    (
        @sct_nbr TINYINT
    )
    AS
    SELECT [sc_nbr],[sct_nbr],[Content] FROM [dbo].[SingleChoose] WHERE [sct_nbr] = @sct_nbr
    
    GO
    View Code


    为了试题与选项显示于网页上,Insus.NET两个类别,能让网页与数据连接与通信,即是逻辑层的物件。

    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Linq;
    using System.Web;
    
    /// <summary>
    /// Summary description for Test
    /// </summary>
    namespace Insus.NET
    {
        public class Test
        {
            private string user_number;
    
            public string UserNumber
            {
                get { return user_number; }
                set { user_number = value; }
            }
    
            BusinessBase objBusinessBase = new BusinessBase();
    
            public Test()
            {
                //
                // TODO: Add constructor logic here
                //
            }
    
            public DataTable GetTestByUser()
            {
                Parameter[] param = { 
                                    new Parameter ("@User_Test_num",SqlDbType.VarChar,-1,user_number)
                                    };
                return objBusinessBase.GetDataToDataSet("usp_Test_GetByUser", param).Tables[0];
            }
        }
    }
    Test.cs
    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Linq;
    using System.Web;
    
    /// <summary>
    /// Summary description for SingleChoose
    /// </summary>
    namespace Insus.NET
    {
        public class SingleChoose
        {
            private byte _type;
    
            public byte Type
            {
                get { return _type; }
                set { _type = value; }
            }
    
            BusinessBase objBusinessBase = new BusinessBase();
    
            public SingleChoose()
            {
                //
                // TODO: Add constructor logic here
                //
            }
    
            public DataTable GetSingleChooseByType()
            {
                Parameter[] param = {
                                        new Parameter ("@sct_nbr",SqlDbType.TinyInt,1,_type)
                                    };
                return objBusinessBase.GetDataToDataSet("usp_SingleChoose_GetByType", param).Tables[0];        
            }
        }
    }
    SingleChoose.cs

    试卷作答,全部选择完成之后,再提交卷。为了更好的互动,Insus.NET把试题与选项分开实现,然后再组合。

    为了解决网页Page与用户控件UserControl互动通信,Insus.NET在下面写两接口:






    创建选项用户控件: 

    <%@ Control Language="C#" AutoEventWireup="true" CodeFile="Options.ascx.cs" Inherits="Options" %>
    <asp:RadioButtonList ID="RadioButtonListSingleChoose" runat="server" RepeatColumns="10" RepeatDirection="Horizontal"></asp:RadioButtonList>
    Options.ascx


    在Options.ascx.cs代码,需要实作上面两个接口:



    在显示试题时,还要为每条单选题动态加载用户控件,因此Insus.NET还得设计一个接口:

    用户控件OPtions再实作这个接口:



    准备好了,我们显示单选题目,使用轻量级的Repeater控件来呈现。



    上面有两个地方,一是OnItemDataBound事件,还有是PlaceHolder控件,是用来显示选项的。



    上图中,序号0位,是找到Repeater控件的PlaceHolder控件。
    序号1位,是动态加载用户控件,并获取用户控件。
    序号2位,是为用户控件动态设置参数。

    考员看到的单选项题,如下:



    我们还要为考员所选择的存储起来。需要创建一个更新的存储过程:

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    -- =============================================
    -- Author:          Insus.NET
    -- Create date:   2013-07-17
    -- Description:   员选择作答
    -- =============================================
    CREATE PROCEDURE [dbo].[usp_Test_UpdateAnswer]
    (
        @test_nbr INT,
        @Answer TINYINT
    )
    AS
    UPDATE [dbo].[Test]  SET [Answer] = @Answer WHERE [test_nbr] = @test_nbr
    GO
    View Code


    去test.cs类别,添加一个public的方法:

     由于Repeater控件没有如GridView的DataKeyNames属性,因此放一个HiddenField控件,还要添加一个铵钮,让用户能交卷的动作。

     

    上图中的序号1,是获取主键;序号2是获取选择的用户控件;序号3是获取用户选择的值。另外,你设计试卷时,应该是交卷之后,再不能看到试卷了,应该是提示信息已交卷。
    如果考员作了如下选择:


    点击“交卷”铵钮之后,可以看到存储数据表的数据:



    好的,整篇的演示完成了。让大家对RadioButtonList控件应用有所护展。本博文有涉及到数据库,存储过程,用户控件,重点在于网页与用户控件之间的互通,这还涉及到接口,动态加载用户控件,怎样在Repeater控件外的铵钮事件中获取repeater控件内的一些值,如主键等。

    其实,作为更好的试卷设计,应该让考员能查看已经批改的试卷。系统应该是自动对比标准答案,来判断错与对。

      

  • 相关阅读:
    黑马day01 xml 的解析方式
    Vijos 1164 曹冲养猪(中国剩余定理)
    HDU 2577 How to Type (线性dp)
    Python中的文本(一)
    [LeetCode] Find Minimum in Rotated Sorted Array
    机器学习算法中怎样选取超參数:学习速率、正则项系数、minibatch size
    java网络基本类使用(一)
    java文档注释主要使用方法
    java数组或集合返回空的问题
    tornado web高级开发项目
  • 原文地址:https://www.cnblogs.com/insus/p/3193619.html
Copyright © 2020-2023  润新知