基于模板的题库平台系统
关键词 模板,符号运算,组卷,知识点,组件
组卷
模板解释器
数据库访问
rtf图文显示
数学公式组件
动态几何服务器
rtf格式图文生成器
符号演算系统
1 引言
随着机技术的,各种类型的资源得以迅速发展。读物、课件比比皆是,基于或单机的题库系统、系统也越来越受到广大教师学生的喜爱。学生通过大量题目的练习,以加深对所学知识的理解,考试系统也由于计算机自动组卷减轻了老师的工作量。我们通过对目前这类系统(尤其是中学数学)的调查发现,这类系统虽然受到市场的欢迎,但明显还有一些不足之处,一是没有智能,题目往往以一种固定的形式存在,没有灵活性;二是系统庞大,为了包含各知识点和避免组卷重复,一般都是通过大量题目来实现;三是对数学公式和动态几何支持不够。为此,我们设计了一种基于模板的题库系统,将符号演算引入进来,针对某类学科,将各类题目归类,对于一类题目建立一个或多个模板。数据库只存放模板,将模板分成题目和答案两部分,一一对应,在模板记录上有该模板对应的关键字,也就是我们组卷时的依据。这样,我们的数据库可以建得非常小,查询也就会非常快。系统在组卷时,根据关键字快速查询到模板,由模板解释器进行解释,生成相应的题目和答案。
2 系统结构
我们的系统针对中学数学开发,数据库采用Microsoft Access2000,用VC++6.0开发,通过DAO访问数据库。试卷以rtf格式显示,支持图文混排。

组卷模块接受用户输入,然后通过数据库访问模块查找相应的模板,将各模板交给模板解释器,由模板解释器进行翻译。
动态几何模块,我们采用最小服务器模式开发,它完成动态几何的作图、显示、运动等。由模板解释器负责创建,并通过内存映射文件进行数据传递。
CString strObj = _T( "gDrawServer.document" );
//创建动态几何服务器
InsertObject(strObj,OLEIVERB_SHOW );
COleClientItem*pActiveItem= GetDocument()->GetInPlaceActiveItem( this );
if (pActiveItem != NULL)
{
CWnd* pWnd = pActiveItem->GetInPlaceWindow();
//strCmd是一组动态几何数据
DWORD nSize = strCmd.GetLength() + 2;
//创建内存映射文件
HANDLE hSharedMapFile =
CreateFileMapping((HANDLE)0xFFFFFFFF,
NULL, PAGE_READWRITE, 0, nSize, "MySharedDraw");
if ( hSharedMapFile )
{
//映射缓存区视图:
LPSTR pszSharedMapView = (LPSTR)MapViewOfFile( hSharedMapFile,
FILE_MAP_READ|FILE_MAP_WRITE, 0, 0, 0 );
if ( pszSharedMapView )
{
strcpy( pszSharedMapView, strCmd );
UnmapViewOfFile(pszSharedMapView );
//发消息给服务器,
pWnd->SendMessage(
NOTIFY_DRAW_CURVE, 0, 0 );
}
CloseHandle( hSharedMapFile );
}
pActiveItem->Close();
}
数学公式模块采用ActiveX组件开发,它完成数学公式编辑、显示等。由模板解释器负责创建,并通过数学公式模块提供的外部接口进行数据传递。
CString strObj = _T( "FormulaEdit.FormulaEditCtrl.1" ); //创建公式
InsertObject(strObj,OLEIVERB_SHOW );
CMytrItem*pItem=( CMytrItem*)GetDocument()->
GetInPlaceActiveItem( this );
if ( pItem )
{
pItem->EnableAutomation();
LPDISPATCH lpDisp;
lpDisp = pItem->GetIDispatch();
_DFormulaEdit formula( lpDisp );
//strCmd:是需要显示的公式
formula.SetCaption( strCmd );
pItem->DeactivateUI();
}
3 模板设计
在软件的开发中,我们采用题目模板和答案模板一一对应,将其和搜索关键字联系起来放入数据库。模板以格式化文本存放。
3.1 模板格式
由于模板代表一类题目、或某些知识点,为此,我们定义了一组格式。
(2) %$string%$,string是一组动态几何数据。
(3) %%,作为%字符解释,即显示%。
(4) %1s第一个字符参数,类似%2s, %3s, …。
(5)、%ustring%u,string为字符串,表示string加下划线。
(6) 、%astring%a,string需要符号演算。
………………………………………………
例如,如果模板数据为“已知%#x^2-5*x+1=0%#,求%#x^4+1/x^4%#的值。”
则,显示结果为:
已知 ,求的值。
3.2 模板解释器
模板解释器是本文的核心,它负责将模板翻译成我们需要的文档,该文档支持图文混排。为此,我们设计了一个类:
class CZuJuanInfo //组卷
{
public:
CZuJuanInfo();
~CZuJuanInfo();
enum { MAXCOUNT = 100 };
//一次组卷最大题目数100
void Create_Paper( CMyView* ); //组卷
void Create( int Km, int nKey, int nTx );
…………………………………………………..
protected:
int m_nDegree; //难度系数
TCHAR m_szName[ c_nameLen ]; //试卷名称
int m_nGrade; //----年级
int m_Km; //学科
………………..
struct TypeInfo
{
int m_nTx; //题型
int m_nCount;//题数
};
struct Info
{//某类知识点的题型、题数
int m_nKey; //---------选中的知识点
CArray<TypeInfo,TypeInfo&>m_keyTm;
//关于m_nKey的题目
void Update( int nTx, int nCount );
Info& operator = ( Info& );
int GetTiMuCount();
};
CArray< Info, Info& > m_arrayTm;
};
在解释器中,一个重要的问题是生成实参以替换形参。因此,解释器的工作过程:
(1)从左到右扫描题目模板文本,将所有的形参找到,放到链表1中,我们用一个结构标记了形参在模板文本中的起始位置、参数类型、大小范围、原始串等等。
(2)在链表中根据参数类型生成实参。
(3)对题目模板文本从右到左进行参数替换,即用链表1中的实参替换模板文本中的形参。
(4)从左到右扫描答案模板文本,将所有的形参找到,放到链表2中。由于答案的形参一定在链表1中能找到,因此,这里我们用一个结构只标记了形参在答案模板文本中的起始位置,和链表1中对应的实参。
(5)对答案模板文本从右到左进行参数替换,即用链表2中的实参替换模板文本中的形参。
(6)分别扫描题目模板和答案模板,进行符号演算。即对有关代数式进行运算、化简等。
(7)分别扫描题目模板和答案模板,生成rtf格式文本、创建动态几何图形、数学公式组件等等。
3.3 异常处理
系统的稳定性是非常重要的,我们在设计程序时,充分考虑到了该问题。如对于参数替换,由于输入模板的错误,导致在答案模板中出现的形参在题目模板中没有对应,或参数替换后出现整数除以0等等。又如下面方程组:
由于参数的不同,其解有三种可能:唯一解、无解和无穷多个解。
对于类似这些问题,系统都有模块处理。
4结论
本文通过将题目按知识点、题型等分类,建立相应模板,既实现了快速组卷又避免了试卷重复;将符号演算系统嵌入到系统,使得系统具有了智能性,由模板解释器对模板的分析解释,然后生成所需要的题目,根据题目再自动求解;通过组件技术,将数学公式写成控件,模板解释器通过控件的外部接口传递参数,使得该系统非常平滑地支持了数学公式的显示、编辑。在进一步的智能平台开发中,我们可以将它与专家系统的知识、概念有机地连为一体,建立一个完整的具有图形语义知识的题库系统。
1 朱大勇,郭四稳. 基于动态作图的图形符号编辑系统[J]. 机工程. 2003第29卷第18期:Page23-24
2 Cardelli, L.,and Wegner, P. [1985]. On understanding types, data abstraction, and polymorphism. ACM Computing Surveys 17:4, 471-522
3 Joong-Rin Shin, Wook-Hwa Lee, Dong-Hae Im. A windows-based interactive and graphic package for the education and training of power system analysis and operation. IEEE Transactions on Power Systems. (PWRS). vol.14.1999. no.4. p.1193-1199
4 William Ford, William Topp.陈君译.数据结构C++语言描述---应用标准模板库(STL). 清华大学出版社,2003,5
5 姜文清. 编译技术原理.国防出版社, 1994, 7
6 Adam Drozdesk 著,陈曙晖译.数据结构与算法--C++版(第二版).清华大学出版社,2003,4
7 Mikey Williams著,前导工作室 译.Windows 2000编程技术内幕.机械工业出版社,1999,12
8 北京希望出版设总策划,周鸣杨编著.Visual C++界面编程技术.北京希望电子出版,2003,2