毕业设计编程考试机器评卷系统论文

上传人:无*** 文档编号:79280033 上传时间:2022-04-23 格式:DOC 页数:40 大小:615KB
收藏 版权申诉 举报 下载
毕业设计编程考试机器评卷系统论文_第1页
第1页 / 共40页
毕业设计编程考试机器评卷系统论文_第2页
第2页 / 共40页
毕业设计编程考试机器评卷系统论文_第3页
第3页 / 共40页
资源描述:

《毕业设计编程考试机器评卷系统论文》由会员分享,可在线阅读,更多相关《毕业设计编程考试机器评卷系统论文(40页珍藏版)》请在装配图网上搜索。

1、编程考试机器评卷系统1 前言1.1 课题背景及意义目前全国计算机应用能力等级考试及各省的高校计算机教学水平考试都有上机操作考试,编程考试是其主要内容之一。在编程考试中,一方面,由于考生人数多,必须采用机器评卷;另一方面,由于考生之间水平差距较大,针对同一问题编写的程序千姿百态。编译、连接、运行都可能出错,尤其是运行过程可能会产生死循环,因此,目前还没有采用完整的源程序作为机器评卷的依据。现在已投入使用的采用机器评卷的考试题型有填写问题的结果和填写少量语句两种。前一种题型的缺点一是容易舞弊,二是有些问题不编程也可得到结果;后一种题型的缺点是,难以看出考生独立解决问题的能力。因此有必要提出一种基于

2、完整源程序分析且能采用机器阅卷的考试题型及评卷算法,吸取以前机器评卷系统的优点,运用其部分设计思路,结合了自己的思想设计完善编程考试机器评卷系统。加强自身对计算机系统知识运用能力的锻炼。此编程考试机器评卷系统通过对考生编制的每个源程序的分析过程给出评分。1.2 课题相关技术的研究现状1.2.1编译原理简介在计算机科学的课程中,编译原理占有非常重要的位置,它是每个优秀的计算机专业人员必修的一门课程。它主要介绍编译程序的基本构造、一般设计方法和常用实现技术,讲解编译程序自动构造的原理和工具。具体内容包括:形式语言、有穷自动机原理及词法分析程序的自动构造、自上而下和自下而上的语法分析、语法制导翻译及

3、中间代码生成,目标程序运行时的存储组织策略及代码生成等等。并结合教授内容,安排学生在剖析一个简单的编译程序的基础上,完成编译程序的有关实验。经过本课程的学习,要求学生不但掌握一般高级语言编译程序的初步设计和实现的基本技能,并能为不同模式和不同领域的语言的实现方案寻找解决途径,另外还能运用编译程序构造的原理和技术完成相关软件工具的设计和开发工作。词法分析阶段的任务是对构成源程序的字符串从左到右进行扫描和分解,根据语言的词法规则,识别出一个一个具有独立意义的单词( 也称单词符号, 简称符号 )。语法分析的任务是在词法分析的基础上, 根据语言的语法规则从单词符号串中识别出各种语法单位( 如表达式、说

4、明、语句等 ) ,并进行语法检查,即检查各种语法单位在语法构上的正确性。语义分析与中间代码的生成。语义分析的任务是首先对每种语法单位进行静态的语义审查,然后分析其含义,并用另一种语言形式 (比源语言更接近于目标语言的一种中间代码或直接用目标语言 ) 来描述这种语义。代码优化的任务是对前阶段产生的中间代码进行等价变换或改造,以期获得更为高效即省时间和空间的目标代码。编译程序在工作过程中需要建立一些表格,以登记源程序中所提供的或在编译过程中所产生的一些信息,编译各个阶段的工作都涉及到构造、查找、修改或存取有关表格中的信息,因此,在编译程序中必须有一组管理各种表格的程序。图1.1编译程序的总体结构图

5、1.2.2 C语言基本语法总结(1)标识符 由字母、数字和下划线组成。标识符必须以字母或下划线开头。大、小写的字母分别认为是两个不同的字符。不同的系统对标识符的字符数有不同的规定,一般允许7个字符。(2)注释/和/必须成对出现;注释不能嵌套;注释可出现在程序的任何位置。(3) 常量整型常量十进制常数(八进制常数、十六进制常数、长整型常数);字符常量(用单引号括起来的字符);字符串常量(用双引号括起来的字符序列);浮点型常量(小数形式、指数形式)。(4) 表达式算术表达式(整型表达式、实型表达式);逻辑表达式(用逻辑运算符连接的整型量,结果为一个整数0或1,逻辑表达式可以认为是整型表达式的一种特

6、殊形式);字位表达式;强制类型转换表达式(用类型运算符使表达式的类型进行强制转换);逗号表达式;赋值表达式(将赋值号=右侧表达式的值赋给赋值号左边的变量);条件表达式;指针表达式(对指针类型的数据进行运算)。(5) 数据定义对程序中用到的所有变量都需要进行定义。对数据定义其类型,需要时要指定其存储类别。类型标识符可用:int、short、long、unsigned、char、float、double、struct 结构体名、union 共用体名等;存储类别可用:auto、static、register、extern(如不指定存储类别,作auto处理)。注意:外部数据定义只能用extern或st

7、atic,而不能用auto或register。(6) 函数定义形式为:存储类别数据类型函数名(形参表列);形参说明;函数体。函数的存储类别只能用extern或static。函数体是用花括弧括起来的,可包括数据定义和语句。(7) 变量的初始化可以在定义时对变量或数组指定初始值;静态变量或外部变量如未初始化,系统自动使其初值为零(对数值型变量)或空(对字符型数据);对自动变量或寄存器变量,若未初始化,则其初值为一不可预测的数据;只有静态或外部数组才能初始化。1.3 本文主要研究内容对考生编制的每个源程序的分析过程包括编译、连接、运行和结果评分。控制被评程序相应进程的运行。由于编译、连接、运行考生的

8、被评程序都是在评卷程序的召唤下进行的,因此控制被评程序相应进程的运行是评卷算法的主要任务。对被评程序运行过程中可能存在的死循环进行识别。为了避免因考生的被评程序中可能含有死循环而使评卷无法继续,算法中采取修改定时中断的方法。当被评程序相应进程运行足够长时问后仍未结束,则判定它含有死循环,可强行终止它。然后对该程序记分。当考生的一个程序被评分后,就可以对考生的下一个程序或下一个考生开始评分。为便于机器阅卷,可在试题类型上做如下要求:(1)源程序中主程序与所有子程序均存入同一文件且只能取规定的文件名;(2)所有的输入均由与试题相应的某一文件提供;(3)所有的输出结果均按指定的格式存入一个与试题相应

9、的文件中。2.开发平台及工具简介2.1 Visual C+简介:几乎所有世界级的软件,从业界领先的Web浏览器到面向任务的企业应用,都是使用Microsoft Visual C+开发系统来开发的。要用C+来开发Windows和Web上的高性能应用程序,Visual C+是效率最高的首选工具。Visual C+ 6.0在不牺牲灵活性、性能和控制力度的同时,给C+带来更高水平的生产效率。除了IntelliSense Technology(智能感应技术)和Edit and Continue(即编即调)等显著缩短开发时间的新特性外,Visual C+ 6.0还为Web开发和企业开发提供更良好的支持。M

10、icrosoft Visual C+ 6.0专业版的健壮的构件开发、强大的数据库工具和完备的Internet支持将使您从中受益,创建出策略性的商务解决方案来。Visual Studio C+6.0采用一种非常巧妙的方法将原本非常复杂的Windows编程步骤封装起来,使编程人员可以轻松容易地编写Windows应用程序。Visual C+6.0是Microsoft Visual Studio6.0的一个子集,他对低版本开发程序兼容。它有如下的特点:(1) Visual C+6.0提供了用于开发Windows环境下的应用程序和简捷、快速的开发环境。利用Visual C+6.0开发Windows应用程

11、序具有很高的效率。(2) Visual C+6.0提供了MFC类,开发者只需要做少量的工作就可以得到功能齐全的Windows应用程序。与使用C和Windows SDK开发Windows应用程序相比,使用Visual C+6.0建立一个完美的Windows应用程序所花费的时间要少得多。(3) Visual C+6.0还提供了一个高度集成的工具集,使得在开发应用程序的全过程中都保证了较高的效率。集成化便于程序开发,开发者可以同时在编辑、建立、调试等不同任务之间快速切换,甚至可以同时进行。(4)调试方便:在程序调试时,在遇到编译错误时,会在输出窗口显示出错误类型、行号及错误提示等信息。在输出窗口中双

12、击错误提示时,光标会自动指向出现错误的代码所在行应方便快速找出错误。Visual C+支持断点调试,同时也可以在调试窗口观察有关变量的值,以方便查找出有关的逻辑错误。2.2 ADO技术1) ADO的技术特点 ADO的全称是ActiveX Data Object,它是微软公司为数据库应用程序开发的新接口。ADO基于COM,提供编程语言可利用的对象,它不仅面向Visual C+,同时还提供面向其他开发工具的应用,如Visual Basic、VJ等,甚至还提供面向诸如 VBScript、JavaScript等脚本语言的应用。ADO的底层是OLE DB,不仅能访问关系数据库,也能访问非关系型数据库。A

13、DO对OLE DB的包装是相当成功的,相对于OLE DB中众多的接口来说,ADO对象模型简明扼要,没有一点多余的东西,并且其功能还要比DAO强大的多。并且可以说到目前为止,ADO是目前最快的数据库访问的中间层。2) ADO的结构ADO模型包含了7个对象和4个集合,ADO的结构图如图2.1所示。2.3 SQL语句简介SQL是一种面向数据库的通用数据处理语言规范,能完成以下几类功能:提取查询数据,插入修改删除数据,生成修改和删除数据库对象,数据库安全控制,数据库完整性及数据保护控制。本文用到的SQL语句主要为select语句和insert语句。连接对象(Connection)错误集合(Errors

14、)错误对象(Error)属性集合(Properties)属性对象(Property)命令对象(Command)参数集合(Parameters)参数对象(Parameter)属性集合(Properties)属性对象(Property)记录集对象(Recordset)域集合(Fields)域对象(Field)属性集合(Properties)属性对象(Property)图2.1 ADO的结构图3 需求分析与概要设计3.1系统需求分析本课题的名称为:编程考试机器评卷系统。编程考试是计算机等相关专业的常见考试,其具体要求为对指定的题目设计算法并使用考试所规定的编程语言(如:C语言、JAVA语言、pyth

15、on语言)编写程序实现其设计的算法以完成题目的要求。由此我们可以把本课题按照要求分为两大功能模块来完成:某种编程语言的解析(语法分析、词法分析等);评分系统的设计(如何针对错误来打分、分数如何存储与显示给用户)。a) 某种语言的解析:本模块是系统中最重要的模块也是最难实现的模块是其他模块的基础。在这里选用最熟悉的、使用也最为广泛的C语言进行解析。C语言有着较为复杂的语法与词法规则。在本课题中拟模仿微软的经典编译器VC+的设计,来完成对C语言的解析,包括语法词法分析、关键字的高亮现实、输出程序中出现的错误等等。显示风格模拟VC+6.0的界面设计。b) 评分系统的设计:机器评卷永远也代替不了人来评

16、卷,使用机器评卷系统终归会遇到很多机器很难解决的问题。例如在程序中某一处发生用户丢失标点符号,这个现象对于评卷来说是一个小问题,但是对于程序来说就是一个大的问题(语法错误程序无法通过编译)。而且机器评卷永远也不可能如人评卷那样准确。因此,在本课题中评卷系统的设计遵守两大原则:尽量体现人性化设计对于小错误、小问题不给予严重的扣分;模拟VC+6.0的编译功能,已其检查的出的错误为评分标准。3.2 系统整体框架图C语言解析模块总体结构图如图3.1所示。程序运行后用户选择其所需要评阅的试卷,点击评卷开始阅卷。首先进入的就是C语言的解析部分。 首先,程序将对用户打开的C语言编程试卷.C文件,进行词法和语

17、法的分析。然后通过特定的数据结构生成语法树,在这个阶段将检查出基本的语法词法错误,语法树是进行解析的基础。其作用与原理在后文中讲继续详细说明。在语法树生成成功之后,解析程序建立起关于考卷(C语言程序)的符号表。在符号表的基础上,程序能够对考卷进行类型匹配等表复杂的错误的检查。例如,函数的参数传递错误,结果返回错误等。图3.1 C语言解析模块总体结构图评卷系统总体框架如图3.2所示,当解析程序对源程序分析完毕后,系统根据解析结果对源程序进行评分。在评分中尽量体现人性化设计,例如源程序中如果出现标点符号漏掉等错误按照其他错误的一半分来扣。评分结束后根据分数写出对应的评语,为了方便分数的管理,将对应

18、的分数、评语、源程序名存入到数据库中。评分系统还提供评卷成绩列表用于现实所有的分数。图3.2 评卷系统总体框架图3.3 系统目标本系统为编程考试的机器评卷。系统中最为核心的目标为:对考生的C语言源程序进行解析。这就需要实现几个核心的算法,例如语法分析、词法分析、类型匹配等等。同时要实现评分的智能化、人性化,仅仅检查出语法、词法上存在错误是不够的。还需准确地获取错误的具体情况,根据不同的情况进行打分。因此本系统模拟VC+6.0编辑器,实现对C语言源程序的解析,并输出错误类型。为了方便用户的使用,在系统主界面中还添加一些类VC+编辑器的辅助功能,例如关键字高亮、错误行数提示等。在完成评分后,为了方

19、便成绩的管理,系统添加数据库功能,用数据库存储考试成绩,以方便管理与维护。本系统用VC开发,连接数据库采用ADO方式与Access进行连接。4. 详细设计4.1 数据库的创建本系统采用Access数据库来存储相关信息,建立数据库的过程如下:在工程所在目录下点击鼠标邮件,在弹出的快捷菜单中将鼠标移到“新建”,再在弹出的字菜单中点击“新建Microsoft Office Access 应用程序”。到此数据库就建立好了,将改Access文件改名C语言考试评分成绩.mdb。数据库表格的建立:本系统中数据库是用于存储考试成绩信息。本系统建立一张表:成绩表。成绩表只包含三个字段:题目、分数、评语,设计如表

20、4.1所示。表4.1 成绩表字段含义字段名数据类型C语言源程序标题题目Text程序得分分数Int评语评语Text4.2 MFC连接数据库本系统在进行数据库连接时采用的是ADO方式进行连接。ADO(ActiveX Data Object)是Microsoft数据库应用程序开发的新接口,是建立在OLE DB之上的高层数据库访问技术,即使你对OLE DB,COM不了解也能轻松对付ADO,因为它非常简单易用,甚至比你以往所接触的ODBC API、DAO、RDO都要容易使用,并不失灵活性。ADO数据库开发的基本流程,它的基本步骤如下:1)初始化COM库,引入ADO库定义文件2)用Connection对象

21、连接数据库3)利用建立好的连接,通过Connection、Command对象执行SQL命令,或利用Recordset对象取得结果记录集进行查询、处理。4)使用完毕后关闭连接释放对象。接下来详细介绍连接过程:COM库的初始化我们可以使用AfxOleInit()来初始化COM库,这项工作通常在CWinApp:InitInstance()的重载函数中完成,代码:BOOL CADOTest1App:InitInstance()AfxOleInit();. 2)用#import指令引入ADO类型库为了引入ADO类型库,需要在项目的stdafx.h文件中加入如下语句:#import c:program f

22、ilescommon filessystemadomsado15.dll no_namespace rename(EOF,adoEOF)这一语句的作用同我们已经十分熟悉的#include类似,编译的时候系统会为我们生成msado15.tlh,ado15.tli两个C+头文件来定义ADO库。开发环境中msado15.dll不一定在这个目录下,要按实际情况修改;在编译的时候可能会出现如下警告,对此微软在MSDN中作了说明,并建议我们不要理会这个警告:msado15.tlh(405) : warning C4146: unary minus operator applied to unsigned

23、type, result still unsigned。3)创建Connection对象并连接数据库为了首先我们需要添加一个指向Connection对象的指针_ConnectionPtr m_pConnection,下面的代码演示了如何创建Connection对象实例及如何连接数据库并进行异常捕捉:BOOL CADOTest1Dlg:OnInitDialog()CDialog:OnInitDialog();HRESULT hr;Tryhr = m_pConnection.CreateInstance(ADODB.Connection);/创建Connection对象if(SUCCEEDED(h

24、r)hr = m_pConnection-Open(Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb,adModeUnknown);/连接数据库/上面一句中连接字串中的Provider是针对ACCESS2000环境的,对于ACCESS97,/需要改为:Provider=Microsoft.Jet.OLEDB.3.51;catch(_com_error e)/捕捉异常CString errormessage;errormessage.Format(连接数据库失败!rn错误信息:%s,e.ErrorMessage();AfxMessageB

25、ox(errormessage);/显示错误信息在这段代码中我们是通过Connection对象的Open方法来进行连接数据库的。4)执行SQL命令并取得结果记录集为了取得结果记录集,我们定义一个指向Recordset对象的指针:_RecordsetPtr m_pRecordset;并为其创建Recordset对象的实例: m_pRecordset.CreateInstance(ADODB.Recordset),SQL命令的执行可以采用多种形式,本文采用了Recordset对象进行查询取得记录集。m_pRecordset-Open(SQL语句,_variant_t(IDispatch *)m_p

26、Connection,true),adOpenStatic,adLockOptimistic,adCmdText);插入操作采用的是Connection对象的Execute方法执行SQL命令。Execute()方法的原型如下所示:RecordsetPtr Connection15:Execute ( _bstr_t CommandText, VARIANT * RecordsAffected, long Options ) 其中CommandText是命令字串,通常是SQL命令。参数RecordsAffected是操作完成后所影响的行数, 参数Options表示CommandText中内容的类

27、型,Options可以取如下值之一:adCmdText表明CommandText是文本命令;adCmdTable表明CommandText是一个表名;adCmdProc表明CommandText是一个存储过程;adCmdUnknown表明CommandText内容未知。Execute()函数执行完后返回一个指向记录集的指针。5)关闭记录集与连接 记录集或连接都可以用Close()方法来关闭:m_pRecordset-Close();/关闭记录集m_pConnection-Close();/关闭连接本系统在设计对Access进行操作时为了方便将上述操作写成了一个类。4.3源程序运行检测算法的描述

28、 源程序运行检测算的程序流程图如下所示:图 4.3.1程序运行算法流程图上图中描述了本系统程序运行主算法的数据流程。其中包括了详细了,C语言源程序文件导入后的基本处理、词法分析的数据流程与具体方式、语法分析的数据流程、语法树的定义与生成、类型匹配的检测方式等等。在这一章中,本章中将重点从全局的角度对本系统主算法进行一个分析与实现的说明。由于涉及到的内容过多,与代码有关的设计与实现在下面的章节将详细的给出。首先,系统需要获取C语言源程序的代码信息。程序实现中通过MFC的CFILE类导入一个C语言的源程序文件.C文件。存储到MFC为文件提供的专用BUFFER中,注意这个时候文件的存储是以一个一个字

29、符的形式存储的。系统需要进行一些简单的处理把其翻译成一个一个的字符串。完成第一步之后,系统已经得到了一个关于C语言源程序的字符串存储结构。下面进入到的是C语言的词法分析阶段。词法分析大致分为两个部分:C语言保留字的查找特殊字符的查找与翻译(翻译成token字符),变量、函数等程序对象的词法检测。在这里首先需要解释一下的是为什么要把所有的东西都翻译成token字符?因为本系统是使用VC+去分析检查C语言程序,C+与C语言中的关键字有非常多的重复,如果不加翻译的话C+语言进行时会发生语法的错误。例如,在C语言源程序中存在/n字符,如果在本系统中直接将/n不进行分析进行下述语法树建立操作时,语法树的

30、生出读到/n会自动换行,产生错误。关于构词法的算法,按照C语言构词法的所有要求上文中已经提到过,在这里就不再重复说明了。在完成上述查找翻译词法检测之后,在这个部分还有一个特殊的功能。按照每一个token的类型(关键字、变量、函数等等)给出不同颜色的提示。具体算法为查找到token的类型返回不同的颜色,在输出界面中显示出来。该功能能够帮助评卷人更好地认识与识别程序中的错误。在这里如果检测到构词法的错误,则记录该错误的位置token,并通过给出错误的输出。在完成上述步骤之后,系统进入到语法分析的阶段。语法分析较之词法分析更为复杂因为仅从局部无法完全准确的进行判断。语法分析算法的核心是建立一个关于C

31、语言源程序的语法树。语法树结构的定义是本步骤的重点。在本程序中采用嵌套递归的设计思路,来设计语法树的结构。首先,将每一个语法元素看做是一个基本的树对象。(例如,if语句整个是一个基本树对象而if语句中的表达式也是一个基本树对象,两者之间是一个嵌套的关系) 4.4 源程序的导入与解析C语言原程序的解析是本系统的重点,是系统其他部分执行的基础。编译原理的基础知识在本文的第二部分已做了介绍,这里就不再重复。根据本文中第三部分的设计,本模块的总体框架如图3.1所示,本模块大致分为以下4个功能模块实现:词法分析、语法分析、建立文档符号表、类型匹配检测。下文将针对每一个具体功能模块进行详细讲述。4.4.1

32、词法分析:C语言的构词法规则为:由字母、数字和下划线组成。标识符必须以字母或下划线开头。大、小写的字母分别认为是两个不同的字符。不同的系统对标识符的字符数有不同的规定,一般允许7个字符。同时C语言中拥有大量的保留字,在定义变量时不能与这些关键字重复。在本程序中也同样建立了一个关于C语言关键字的对应表词法分析功能主要由以下两个类来完成:l Class CTokenizer:这个类的主要作用为:从一个字符串中(这里把一个文件看作是一个字符串,MFC中CFile-Cstring获取用户调入的C语言源程序)分离出一个一个token来,配上简单的类型再通过NextToken()获取返回值。返回值与其宏定

33、义如下:CODE#define TT_EOL n#define TT_EOF -1#define TT_INTEGER -2#define TT_REAL -3#define TT_WORD -4#define TT_STRING #define TT_CHARl Class CScaner:这个类的作用为:获取C语言源程序中具体具体的的token类型。Token类型的定义必须与C语言关键字相对应用于词法的检测。C语言关键字如下表:autodoubleintstructbreakelselongswitchcaseenumregistertypedefcharexternreturnunion

34、ConstfloatshortunsignedContinueforsignedvoidDefaultgotosizeofvolatileDoifstaticwhile表1 C关键字表Token类型的定义分为以下5类与C语言相对应。CODE:enum TokenType程序关键字定义_AUTO, _DOUBLE, _INT, _STRUCT,_BREAK, _ELSE, _LONG, _SWITCH, _CASE, _ENUM, _REGISTER, _TYPEDEF,_CHAR, _EXTERN, _RETURN, _UNION,_CONST, _FLOAT, _SHORT, _UNSIGN

35、ED,_CONTINUE, _FOR, _SIGNED, _VOID,_DEFAULT, _GOTO, _SIZEOF, _VOLATILE,_DO, _IF, _STATIC, _WHILE,_READ, _WRITE, _PRINTF,操作关键字ASSIGN, PLUS, MINUS, TIMES, DIV, MOD,BITWISE_AND, BITWISE_OR, BITWISE_NOT, LOGICAL_NOT, LT, GT,中断关键字LPARAN, RPARAN, LBRACE, RBRACE, LSQUARE, RSQUARE, COMMA, DOT, SEMI, COLON,混

36、合操作符EQ/* = */, NEQ/* != */, PLUS_PLUS/* + */, MINUS_MINUS/* - */,PLUS_ASSIGN/* += */, MINUS_ASSIGN/* -= */, TIMES_ASSIGN/* *= */, DIV_ASSIGN/* /= */,NGT/* = */, LOGICAL_AND/* & */, LOGICAL_OR/* | */,其他_EOF, _ID, _NUM, _STRING, _CHARACTER, _LABEL, _ERROR, _NONE;Cscaner实现词法分析的查找与反向查找是通过函数CMap来实现的。成员变量

37、m_KeyIndex 把C语言源程序(CString)的关键字和TokenType对应。例如:当系统查找到+时,自动把它翻译成Token类型PLUS。l 变量标识符构词法分析原理:例如标识strID1,根据C语言的变量命名法则,系统先检查变量名的开头部分是否由正确的字母或符号组成。(_ a b c d e f g h i j k l m n o p q r s t u v w x y zA B C D E F G H I J K L M N O P Q R S T U V W X Y Z)。然后再检查变量的其他部分是否含有0 1 2 3 4 5 6 7 8 9。4.4.2语法分析:本系统中语法

38、分析的功能是由类Cparser来完成的。l Class Cparser完成的主要功能是:在词法分析的基础上,通过文法与相应的规则起建立语法树。具体实现如下:首先定义数据结构CTreeNode,结构CtreeNode是建立语法树的基础。CtreeNode的由以下代码实现。CODE:#define MAX_CHILDREN 3class CTreeNodepublic:CTreeNode*child MAX_CHILDREN ;/ point to child nodeCTreeNode*father;/ point to father nodeCTreeNode*sibling;/ point

39、to sibling nodeintlineno;NodeKindnodekind;union StmtKindstmt;ExpKindexp; kind;enum TokenTypetype;CStringszName;CStringszScope;/ node function scopeBOOLbArray;/ is this an array declarationintiArraySize;/ array size;l Grammar分析与函数返回:1. program-declaration_list2. declaration_list-declaration_list decl

40、aration | declaration3. declaration-var_declaration | fun_declaration4. var_declaration-type_specifier ID(, .); | type_specifier ID NUM (, .);5. type_specifier-int | void | char, actually this step is in declaration_list()6. fun_declaration-type_specifier ID ( params ) compound_stmt7. params-param_l

41、ist | void | empty, void is thought as empty8. param_list-param_list , param | param9. param-type_specifier ID | type_specifier ID 10. compound_stmt- loal_declarations statement_list | expression_stmt11. local_declarations-local_declarations var_declaration | var_declaration12. read ( var ) ;13. wri

42、te ( expression ) ;14. printf ( STRING ) ;15. expression_stmt-expression ; | ;16. expression-var = expression | logic1_expression17. logic1_expression-logic1_expression | logic2_expression | logic2_expression18. logic2_expression- logic2_expression & simple_expression | simple_expression19. simple_e

43、xpression-additive_expression relop additive_expression | additive_expression20. relop- = | | = | = | !=21. additive_expression - additive_expression addop term | term22. addop- + | -23. term-term mulop logic3_expression | logic3_expression24. mulop- * | / | %25. logic3_expression- ! logic3_expressi

44、on | factor26. factor-( expression ) | var | call | NUM27. var-ID | ID expression 28. call-ID ( args )29. args-args_list | empty30. args_list-args_list , expression | expression31. sub_compoundstmt-ID : | call ; | expression_stmt32. if_stmt-if ( expression ) compound_stmt33. | if ( expression ) comp

45、ound_stmt else compound_stmt34. while_stmt-while ( expression ) compound_stmt35. for_stmt-for ( var = expression ; expression ; var = expression ) compound_stmt36. goto_stmt-goto ID ;37. break_stmt-break ;38. continue_stmt-continue ;39. return_stmt-return ; | return expression ;l 基本树形结构:if语句: if语句表达

46、式语句语句while语句:while语句表达式语句表达式语句表达式for语句表达式for循环语句:复合语句:语句复合语句语句语句声明l 支持的语句及运算:1) 数据类型:int,char void,PCode里支持float,在80x86 ASM里不支持2) 语句:赋值(=),if, while,for,return,break,continue3) 数学运算:+,*,/4) 关系运算:= =,=,szName, t-szScope ) = -1 ) / not defined, so add it to the symbol tablem_SymbolTable.st_insert( t-s

47、zName, t-szScope, t-type, t-lineno, location+ );/ add it to function declaration listm_FunArgs.fa_insert( t ); else / redefinition函数重定义theApp.score=theApp.score-10;OutputErrMsg( error in line %d: function %s() redefinition, t-lineno, (LPCTSTR)t-szName );.以上为函数发生重定义时的扣分情况。系统按照解析的顺序依次扣分,在解析完成之后即得出考试的最

48、终成绩。4.5.2评语的书写在得到考试分数后,往往需要对考试成绩进行一个简单的数据分析。评语的书写即完成这个数据分析的功能,使整个系统更加合理,体现出人性化设计。评语的书写是根据成绩而来,因此设计函数Cstring comment(int score)来实现这个功能。改函数输入评分成绩,即返回对应的评语。实现代码如下:CString CCProgrammeExaminationGradeSystemDoc:comment(int score)CString PY;if (score=100) PY = 非常不错,请再接再厉!;if (score=90 )PY = 程序中有少许错误,请务必注意程

49、序的细节;if (score=80) PY = 程序基本上是正确的,请注意C语言的语法;if (score=60) PY = 程序中出现了较多的问题,但仍能保持程序的结构。希望以后努力改进;if (scoreMoveFirst();while(!rst-adoEOF)m_list.InsertItem (nCount,_T();/添加行rst-MoveNext();nRecordCount+;for(int n=0; n MoveFirst();rst-Move(n);for(int i=0; i GetFields()-GetCount(); i+)CellText=(char*)(_bst

50、r_t)rst-GetFields()-GetItem(long)i)-Value;CellText.TrimLeft();CellText.TrimRight();m_list.SetItemText (n,i,CellText);l 在初始化对话框时初始化列表属性并调用显示函数,完成显示功能CODE:m_list.ModifyStyle(0L,LVS_SHOWSELALWAYS);/高亮显示被选中项m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT|/允许整行选中LVS_EX_HEADERDRAGDROP|/允许整列拖动LVS_EX_GRIDLINES

51、|/画出网格线LVS_EX_ONECLICKACTIVATE|/单击选中项LVS_EX_FLATSB);/从成员详细表读出字段名称到列表控件中;CString strSQL,FieldName;strSQL.Format(Select *from 成绩表);m_RecordsetPtr=theApp.m_pAdo.ReadDataBase(strSQL);for(int j=0;jGetFields()-GetCount();j+)FieldName=(char*)(_bstr_t)m_RecordsetPtr-GetFields()-GetItem(long)j)-Name;FieldNam

52、e.TrimLeft();FieldName.TrimRight();m_list.InsertColumn(j, FieldName, LVCFMT_CENTER, 150);show(m_RecordsetPtr);4.6 程序死循环的中断处理算法4.6.1考试类型与评卷算法的描述在设计这个算法时,为便于机器阅卷, 本文中对试卷类型的要求做出以下规定:(1) 源程序中主程序与所有子程序均存入同一文件且只能取规定的文件名; (2) 所有的输入均由与试题相应的某一文件提供;(3) 所有的输出结果均按指定的格式存入一个与试题相应的文件中1 对考生编制的每个源程序的分析过程包括编译、连接、运行和按结果评分。由于编译、连接、运行考生的被评程序都是在评卷程序的召唤下进行的, 因此控制被评程序相应进程的运行是评卷算法的主要任务。为了避免因考生的被评

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!