zoukankan      html  css  js  c++  java
  • 考试系统试题实现(单选项)

    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控件内的一些值,如主键等。

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

      

  • 相关阅读:
    sqlserver中判断表或临时表是否存在
    Delphi 简单方法搜索定位TreeView项
    hdu 2010 水仙花数
    hdu 1061 Rightmost Digit
    hdu 2041 超级楼梯
    hdu 2012 素数判定
    hdu 1425 sort
    hdu 1071 The area
    hdu 1005 Number Sequence
    hdu 1021 Fibonacci Again
  • 原文地址:https://www.cnblogs.com/insus/p/3193619.html
Copyright © 2011-2022 走看看