论文部分内容阅读
摘 要:人工手工进行排座,是杜绝考试舞弊的良方。但人工进行排座需要对考生有相当的了解,自然而然,熟知学生的辅导员是日常考试座位安排的最佳操作者。为了解决手工填写座位表的种种缺陷,我们特设计了可视化考试座位编排软件。
关键词:考试;软件;开发
中图分类号:TP311.11 文献标识码:A
Visual Seating Arrangement System Software Development
XU Zheng,LIU Xiang-yang,YU Yan
(Yunyang Medical University,Hubei Shiyan 442000)
Key words:
长期以来日常考试都是手工进行:辅导员在原有的复印的规则的座位表上手工的进行排座。这种原始的方法有如下弊病:手工填写座位表为辅导员繁重的工作雪上加霜、手工填写座位表不利于修改,一旦大范围调整,只能重新填写、相似考场的排座只能重排、学校各个教室的情况并不完全相同、同一张座位表不利于非标准的教室排座、写的座位表不利于长期保存。为了解决手工填写座位表的种种缺陷,我们特设计了可视化考试座位编排软件。
本软件主要分为三个模块:
1 学生信息的加载
由于本软件暂主要面对的使用者是辅导员,因此学生信息的加载仅仅需要用户将考生的花名册列表(Excel)中的姓名字段复制出来放置在文本文件中。利用简单的文件读取行字符的语句实现编写加载命令,加载姓名文件到列表控件中,得到进行分配座位考生的姓名列表
2 教室信息数据库管理
随着学校建设的推进,教学楼的数量和类型也在变化。为适应需要,特别设计了一个教室信息管理系统,实现了考试教室详细信息数据库的简单的添加修改等常用操作。
3 核心部分:可视化座位的显示及排座操作
为了表示显示表示方便,为每个桌子都专门设计了一个C++类表示:
class CSeat: public CObject{
public:
BOOL IsInList(int i,CObList *pNumList); //对象是否在对象序列中
DECLARE_SERIAL(CSeat)//DECLARE_SERIAL对象可以进行串行化输入输出
void Serialize(CArchive& ar); //串行化保存对象
void SetName(const CString &Name); //设置桌子对象的显示学生名称
CString GetName();//得到开始使用桌子的学生姓名
virtual void Draw(CDC *pDC);//在view窗口中绘出当前单个座位图
BOOL GetIsSelected();//得到座位是否被选择考试的信息
void SetIsSelected(BOOL IsSel);//设置此座位参与考试
void SetColor(COLORREF color);//设置座位的线条颜色
COLORREF GetColor();CSeat ();virtual ~CSeat ();
private:
static COLORREF m_fillColor;
BOOL m_IsSelected;
COLORREF m_Color;
CString m_strName;};
用户在选择相应教学楼教室后,系统开始在View窗口中初始化显示考场的原始的布局图。然后开始手工选择考试的座位,其中核心部分代码在于判断鼠标的点是否在矩形区域内
BOOL CDrawSeatView::IsInChipRect(CPoint point, CObList *pObList, POSITION *pCurPos, BOOL *pIsSel)
//此函数得到鼠标是否点按在座位上,同时利用参数CurPos记录搜索链表时停止的位置,
//利用参数IsSel记录当前位置上对象的IsSelected属性,不过,以上返回值只有在鼠标点按在了元器件上时才有使用价值
*pCurPos = NULL;
*pIsSel = FALSE;
POSITION pos = pObList->GetTailPosition();
int ht = CRectTracker::hitNothing;
CObject *pObject;
CSeat *pSeat;
while(pos!=NULL){ *pCurPos = pos;
pObject = pObList->GetAt(pos);
if (pObject->IsKindOf(RUNTIME_CLASS(CSeat))){ pSeat = (CSeat *)pObject;
ht = pSeat->m_RectTracker.HitTest(point);
*pIsSel = pSeat->GetIsSelected();
if (ht != CRectTracker::hitNothing) {return TRUE;}
else{pObList->GetPrev(pos); }}return FALSE;
选中参与考试的座位后,可以在已经分割窗口中的另一个姓名加载窗口中选择参加考试的学生进行考场布置。当中难点在于窗口分割中的通信,
代码如下:
首先获得当前窗口的框架:
CMainFrame* MainFrame=(CMainFrame*)(this->GetParent()->GetParent());
在窗口的框架中CSplitterWnd类中获得相应视图
CDrawSeatView* RView=(CDrawSeatView*)MainFrame->m_wndSplitter.GetPane(0,1);
关键词:考试;软件;开发
中图分类号:TP311.11 文献标识码:A
Visual Seating Arrangement System Software Development
XU Zheng,LIU Xiang-yang,YU Yan
(Yunyang Medical University,Hubei Shiyan 442000)
Key words:
长期以来日常考试都是手工进行:辅导员在原有的复印的规则的座位表上手工的进行排座。这种原始的方法有如下弊病:手工填写座位表为辅导员繁重的工作雪上加霜、手工填写座位表不利于修改,一旦大范围调整,只能重新填写、相似考场的排座只能重排、学校各个教室的情况并不完全相同、同一张座位表不利于非标准的教室排座、写的座位表不利于长期保存。为了解决手工填写座位表的种种缺陷,我们特设计了可视化考试座位编排软件。
本软件主要分为三个模块:
1 学生信息的加载
由于本软件暂主要面对的使用者是辅导员,因此学生信息的加载仅仅需要用户将考生的花名册列表(Excel)中的姓名字段复制出来放置在文本文件中。利用简单的文件读取行字符的语句实现编写加载命令,加载姓名文件到列表控件中,得到进行分配座位考生的姓名列表
2 教室信息数据库管理
随着学校建设的推进,教学楼的数量和类型也在变化。为适应需要,特别设计了一个教室信息管理系统,实现了考试教室详细信息数据库的简单的添加修改等常用操作。
3 核心部分:可视化座位的显示及排座操作
为了表示显示表示方便,为每个桌子都专门设计了一个C++类表示:
class CSeat: public CObject{
public:
BOOL IsInList(int i,CObList *pNumList); //对象是否在对象序列中
DECLARE_SERIAL(CSeat)//DECLARE_SERIAL对象可以进行串行化输入输出
void Serialize(CArchive& ar); //串行化保存对象
void SetName(const CString &Name); //设置桌子对象的显示学生名称
CString GetName();//得到开始使用桌子的学生姓名
virtual void Draw(CDC *pDC);//在view窗口中绘出当前单个座位图
BOOL GetIsSelected();//得到座位是否被选择考试的信息
void SetIsSelected(BOOL IsSel);//设置此座位参与考试
void SetColor(COLORREF color);//设置座位的线条颜色
COLORREF GetColor();CSeat ();virtual ~CSeat ();
private:
static COLORREF m_fillColor;
BOOL m_IsSelected;
COLORREF m_Color;
CString m_strName;};
用户在选择相应教学楼教室后,系统开始在View窗口中初始化显示考场的原始的布局图。然后开始手工选择考试的座位,其中核心部分代码在于判断鼠标的点是否在矩形区域内
BOOL CDrawSeatView::IsInChipRect(CPoint point, CObList *pObList, POSITION *pCurPos, BOOL *pIsSel)
//此函数得到鼠标是否点按在座位上,同时利用参数CurPos记录搜索链表时停止的位置,
//利用参数IsSel记录当前位置上对象的IsSelected属性,不过,以上返回值只有在鼠标点按在了元器件上时才有使用价值
*pCurPos = NULL;
*pIsSel = FALSE;
POSITION pos = pObList->GetTailPosition();
int ht = CRectTracker::hitNothing;
CObject *pObject;
CSeat *pSeat;
while(pos!=NULL){ *pCurPos = pos;
pObject = pObList->GetAt(pos);
if (pObject->IsKindOf(RUNTIME_CLASS(CSeat))){ pSeat = (CSeat *)pObject;
ht = pSeat->m_RectTracker.HitTest(point);
*pIsSel = pSeat->GetIsSelected();
if (ht != CRectTracker::hitNothing) {return TRUE;}
else{pObList->GetPrev(pos); }}return FALSE;
选中参与考试的座位后,可以在已经分割窗口中的另一个姓名加载窗口中选择参加考试的学生进行考场布置。当中难点在于窗口分割中的通信,
代码如下:
首先获得当前窗口的框架:
CMainFrame* MainFrame=(CMainFrame*)(this->GetParent()->GetParent());
在窗口的框架中CSplitterWnd类中获得相应视图
CDrawSeatView* RView=(CDrawSeatView*)MainFrame->m_wndSplitter.GetPane(0,1);