标题 | 基于光标阅读机的课程教学质量测评系统开发 |
范文 | 崔丽红 摘要:基于光标阅读机评卷系统,定制实现了一种课程教学满意度测评系统。介绍了测评系统组成,给出了信息卡打印、数据汇总分析处理两个功能模块的实现方法和源代码,为快速准确采集处理来源分散、数量巨大的测评信息提供了一种简单易用的辅助工具。 关键词:测评卡设计;课程编码;汇总统计;数据分析 中图分类号:G424 文献标识码:A 文章编号:1009-3044(2016)36-0121-03 光学标记阅读机(Optical Mark Reader),简称OMR,是一种高速的信息录入设备,它集光、机、电于一体,运用光电转换原理以极快的速度识别填涂点,从载有信息的信息卡上读取数据,并通过数据电缆送入计算机。由于OMR每秒钟录入数千个信息,且误码率极低。因此,OMR在标准化考试、报名管理、税务申报、户籍管理、人口普查、投票选举、民意测验、干部测评、彩票发行等众多领域被应用。 为实现课程教学质量考核评价信息处理达到智能化、考评方法的规范化和辅助决策科学化,提高考评数据分析处理能力和工作效率,增强考评结果的信度和效度,我们研发了“基于OMR的课程教学质量满意度测评系统”(简称系统),系统供教务部门测评课程教学质量时对各种数据信息进行统计汇总和分析处理,生成各种考评资料,管理各种考评信息,为准确评价课程提供依据。系统与人工制作发放纸质测评表、人工统计相比,它解决了人工易出错、效率低下,以及测评结果计算机数据录入中的瓶颈问题,把人们从繁重的机械劳动中解脱出来。系统与直接用网络测评系统相比,解决了需要将学生集中到计算机房以及匿名评价人数不易控制问题,可以集中学生在短暂时间内实施完成,使采集处理那些来源分散而数量巨大的信息变得轻而易举,快速而准确。 1 测评系统组成与使用流程 系统由光标阅读机、打印机、机读信息卡和配套软件、数据处理分析应用软件组成。系统应用特点是统一制卡、分散填涂、集中录入、快速处理。根据要采集的信息设计印制信息卡,并编制相应的应用软件,然后把信息卡分发下去分散填涂,再把填涂好的卡收集起来用OMR阅读,最后由计算机进行分析处理和管理。因此,按照考评的工作流程,完成一次考评活动可分为“考评准备”〉“满意度测评”〉“测评结果输出”〉“测评结果分析”四个部分。 2 测评系统编程中具体代码实现 2.1 测评机读信息卡设计 根据测评课程的特点、要求和测评过程,合理设计机读信息卡。匿名情况下,学号不涂写。学生班次可以制卡时直接打印。编号的含义可以为在有多页情况下的页码,也可以为学生班次,可以制卡时直接打印。通常情况下,测评信息卡片制作时,课程名称可在Microsoft Word中输入套打。本文为了便于后续汇总统计,将所有课程统一编码放在数据库中,在自主研发的软件中读取数据库输入课程名称套打,优点有二:一是可以分门别类选择课程进行选择输入打印,减少输入错误;二是编码时只要将同一门课程的编码设置相同,之后不管这门课程出现在哪一张卡片中,以及在卡片中的名称如何,都可以正确汇总出这门课程测评票数。三是自由操作卡片中的所有信息。 2.1.1 读取课程代码 void CTXPropertyPage1::GetCodeMain() {//读取学生班次的代码,以便在信息卡中按学生班次输入课程 CComboBox* pBox1 = (CComboBox*)GetDlgItem(IDC_COMBO_CODEMAIN); CString str; int index=pBox1->GetCurSel(); pBox1->GetLBText(index,str); ASSERT(m_pDB); ASSERT(m_pDB->IsOpen()); CString strRecordIdQuery = _T( "name ='") + str + _T("'") ; int nCodeMain; CDaoRecordset rs(m_pDB); try { CString strSelect(_T("Select * From [")); strSelect += "codemain";//表名稱 strSelect += _T("]"); rs.Open(dbOpenDynaset,strSelect); if ( rs . FindFirst ( strRecordIdQuery ) ) { COleVariant var; var = rs.GetFieldValue(2); nCodeMain=V_I2(&var);}} catch (CDaoException* e) { DisplayDaoException(e); e->Delete(); return; } rs.Close(); m_GeoAtt.m_nCodeMain=nCodeMain; SetDlgItemInt(IDC_E_CODE_MAIN,nCodeMain);} void CTXPropertyPage1::SetCodeSbCurSel_init() {//设置当前课程编码和名称 CComboBox* pBox2 = (CComboBox*)GetDlgItem(IDC_COMBO_CODESB); ASSERT(m_pDB); ASSERT(m_pDB->IsOpen()); int nCodeSb; CDaoRecordset rs(m_pDB); CString strCodeMain; strCodeMain.Format("%d",m_GeoAtt.m_nCodeMain); CString strSQL(_T("Select * From [")); strSQL += "codesb";//表名称 strSQL += _T("] "); strSQL += "WHERE ([codemain] = " + strCodeMain +_T(" ) or ( [codemain] =0 ) "); try {// Open the recordset using the filtered SQL string rs.Open( dbOpenDynaset, strSQL ); pBox2->ResetContent(); COleVariant var; rs.MoveFirst(); var = rs.GetFieldValue(1); pBox2->AddString(CCrack::strVARIANT(var)); var=rs.GetFieldValue(2); nCodeSb=V_I2(&var); pBox2->SetCurSel(0); rs.MoveNext(); while (!rs.IsEOF()) { var = rs.GetFieldValue(1); pBox2->AddString(CCrack::strVARIANT(var)); rs.MoveNext(); }} catch (CDaoException* e) { DisplayDaoException(e); e->Delete(); return; } rs.Close(); if(!m_bFirst) { m_GeoAtt.m_nCodeSb=nCodeSb; SetDlgItemInt(IDC_E_CODESB,nCodeSb); CString str; pBox2->GetLBText(pBox2->GetCurSel(),str); SetDlgItemText(IDC_E_TEXT,str);}} 2.1.2 输出课程信息及代码 void CDrawView::SaveFilesAs() {//在保存时输出设计的信息卡的课程代码和名称 CFileDialog filedlg(FALSE,"*.drw","测评卡.drw",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "系统内部文件 (*.drw) |*.drw|| ",NULL); CMainFrame *pMainFrm = ((CMainFrame *)AfxGetMainWnd()); filedlg.m_ofn.lpstrInitialDir=pMainFrm->m_sMainDirectory; if(filedlg.DoModal() == IDOK) { CString filename = filedlg.GetPathName(); CDrawDoc* pDoc = GetDocument(); pDoc->DoSave(filename); //將套打结果存为与原始文件同名的txt格式文件 POSITION pos = pDoc->m_objects.GetHeadPosition(); int id = filename.ReverseFind('.'); filename=filename.Left(id)+".txt"; ofstream outfile(filename); int iKechengshu=0; int iXuhao=0; //套打数据记录,输出制卡时所填涂的队号或页码 while (pos != NULL) { CDrawObj* pObj = pDoc->m_objects.GetNext(pos); if(pObj->IsKindOf( RUNTIME_CLASS( CDrawRect)) &&!pObj->IsKindOf( RUNTIME_CLASS( CDrawText))) { iXuhao++; if(pObj->m_GraphicAtt.m_nIndexfillmode) {outfile< outfile< pos = pDoc->m_objects.GetHeadPosition(); //套打数据记录,输出序号、班级号、课程编码和课程名称 while (pos != NULL) { CDrawObj* pObj = pDoc->m_objects.GetNext(pos); if(pObj->IsKindOf( RUNTIME_CLASS( CDrawText))) { iKechengshu++; outfile< outfile< outfile.close(); }} 输出文件的文本文件内容,第一行为填涂的页码(编码),其余各行为:序号、班号、课程编码和课程名称。实际上,在设计卡片时可将编号和20门课程的位置处分别留有矩形空白和文字空白,只需在输入时将多余位置设为白色,即可不打印输出课程名为空白的行。 2.2 测评信息处理 图1 测评信息卡保存文件数据内容 评估结果处理代码如下: // InstrXlsFilePath为上面的测评结果统计表;InstrXlsFilePath为制卡时输出的卡片信息文本文件 // OutstrXlsFilePath为输出的结果文件 void CMainFrame::ProcessSourceData(CString InstrXlsFilePath,CString InstrTxtFilePath,CString OutstrXlsFilePath) { //写表头开始 CStringArray sampleArray; sampleArray.RemoveAll(); sampleArray.Add("序号"); sampleArray.Add("课程编码"); sampleArray.Add("课程名称"); sampleArray.Add("优秀"); sampleArray.Add("良好"); sampleArray.Add("合格"); sampleArray.Add("不合格"); ((CMainFrame*)AfxGetMainWnd())->ExportData(OutstrXlsFilePath,sampleArray); //写表头结束 CString stringBianhao="",stringXuhao="",stringZhuanyeBianma="",stringBianma="",stringKechengming="",stringAll=""; CString stringYouxiu="",stringLianghao="",stringHege="",stringBuhege=""; CStdioFile infile1; if(!infile1.Open(InstrTxtFilePath,CFile::modeRead)) { MessageBox("file error"); return; } infile1.ReadString(stringBianhao); int iYouxiu, iLianghao,iHege,iBuhege; int iTotalRows; iTotalRows = 0; for(int iItem = 0; iItem < 20; iItem ++) { sampleArray.RemoveAll(); CString strXuhao; strXuhao.Format("%d",iItem+1); sampleArray.Add(strXuhao); infile1.ReadString(stringAll); int nPositon; //空格位置 nPositon = 0; //第一个空格位置 for(int i=0;i stringKechengming = stringAll.Right(stringAll.GetLength()-nPositon);//最后一个 stringAll=stringAll.Left(nPositon); for(int j=0;j { if(stringAll.GetAt(j)==(' ')) nPositon=j; } stringKechengming = stringAll.Right(stringAll.GetLength()-nPositon);//倒數第二个 //处理空白情况 if(stringKechengming.Find("空白")==-1 ) { stringAll=stringAll.Left(nPositon); for(int k=0;k {if(stringAll.GetAt(k)==(' ')) nPositon=k;} stringBianma = stringAll.Right(stringAll.GetLength()-nPositon);//倒数第二个 sampleArray.Add(stringBianma);
sampleArray.Add(stringKechengming); { //excel 文件读取优秀、良好、合格和不合格结果 CStringArray sampleArray2; CSpreadSheet ssResult(InstrXlsFilePath,"测评原始数据"); ssResult.BeginTransaction(); iTotalRows=ssResult.GetTotalRows(); iYouxiu=0; iLianghao=0; iHege=0; iBuhege=0; for(int M=3;M { ssResult.ReadRow(sampleArray2,M); //MessageBox(sampleArray2[2]); if(sampleArray2[2].GetAt(iItem)=='A') iYouxiu++; if(sampleArray2[2].GetAt(iItem)=='B') iLianghao++; if(sampleArray2[2].GetAt(iItem)=='C') iHege++; if(sampleArray2[2].GetAt(iItem)=='D') iBuhege++; }} stringYouxiu.Format("%d",iYouxiu); stringLianghao.Format("%d",iLianghao); stringHege.Format("%d",iHege); stringBuhege.Format("%d",iBuhege); sampleArray.Add(stringYouxiu); sampleArray.Add(stringLianghao); sampleArray.Add(stringHege); sampleArray.Add(stringBuhege); ((CMainFrame*)AfxGetMainWnd())->ExportData(OutstrXlsFilePath,sampleArray); }} stringAll=""; iTotalRows = iTotalRows-2;//从第三行开始 stringAll.Format("成功汇总了%d条数据",iTotalRows); AfxMessageBox(stringAll);} void CMainFrame::ExportData(CString strXlsFlile, CStringArray &m_strarray) {//导出为Microsoft excel格式文件 CSpreadSheet ssSave(strXlsFlile,"DATA"); ssSave.BeginTransaction(); ssSave.AddRow(m_strarray); ssSave.Commit();} 3 结束语 通過以上思路实现了一个基于光标阅读机读入数据,然后利用程序进行统计分析,可以实现学校课程教学质量满意度的测评,实践表明,只要在涂卡过程中完成按照要求进行,系统就能够满足快速准确测评的需要。使用过程中也发现一些问题,比如使用激光打印机打印卡片可使卡片受热发生弯曲,读卡时易出现卡纸现象,应保持信息卡的平整、干燥、洁净,不折叠,可以使光标阅读机卡纸率大大下降;使用签字笔或荧光笔涂卡会出现不能识别的情况;读卡程序输出的excel文件版本过老,使作者编写的处理程序无法读取数据等,在系统开发过程中要注意解决这些问题,可进一步提高系统使用效率。 |
随便看 |
|
科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。