收藏 分享(赏)

C语言源程序的自动评判毕业设计论文.doc

上传人:HR专家 文档编号:11316658 上传时间:2020-03-17 格式:DOC 页数:68 大小:551.01KB
下载 相关 举报
C语言源程序的自动评判毕业设计论文.doc_第1页
第1页 / 共68页
C语言源程序的自动评判毕业设计论文.doc_第2页
第2页 / 共68页
C语言源程序的自动评判毕业设计论文.doc_第3页
第3页 / 共68页
C语言源程序的自动评判毕业设计论文.doc_第4页
第4页 / 共68页
C语言源程序的自动评判毕业设计论文.doc_第5页
第5页 / 共68页
点击查看更多>>
资源描述

1、苏 州 科 技 学 院 毕 业 论 文I目 录第 1 章 引言.111 背景介绍11.1.1 研究背景简介.11.1.2 C 语言简介 .1第 2 章 概要设计.321 方案设计32.1.1 开发环境.32.1.2 工作方式.32.1.3 系统目标.322 系统功能323 需要解决问题424 系统流程42.4.1 基本流程.42.4.2 具体实现.5第 3 章 详细设计.731 系统模块化分73.1.1 添加文件对话框.73.1.2 编译链接函数.83.1.3 运行/评判对话框 .932 系统模块具体实现103.2.1 准备工作.103.2.2 实现添加文件对话框.113.2.3 实现编译链接

2、函数.153.2.4 实现运行/评判对话框 .19第 4 章 测试.2641 测试方案2642 运行界面264.2.1 准备系统运行.264.2.2 系统测试.27结论.30致谢.32参考文献.33附录 A 外文参考文献(译文) .34附录 B 外文参考文献(原文) .48苏 州 科 技 学 院 毕 业 论 文1第 1 章 引言11 背景介绍1.1.1 研究背景简介C 语言是目前国际上广泛流行的、重要的计算机高级语言之一。它适合作为系统描述语言,即可用来编写系统软件,也可用来编写应用软件。对于学习计算机专业的学生来说,学好 C 语言将为今后学习其他编程语言打下良好的基础,而随着计算机应用的普及

3、,更多的其他非计算机专业也会需要学习编写简单的程序,C 语言也是一个很不错的选择。学习 C 语言,首先是要学习理论知识,阅读编程思想,阅读源代码,其次就是动手实践上机编写程序了。只有通过自己编写程序,才能更好的掌握理论知识,发现不足,取得进步。传统的教学方式中,学生采用 FTP,Email 甚至手写的方式提交编程作业,老师一般采用逐一检查并试运行的手工检查方式,然后给出相应的得分。由于在编程作业的提交过程中,很多学生可能会把一些有语法错误以及结果不正确的程序提交上来,这就需要花费老师很多的精力和时间,效果也不是很好。当前,采用计算机对源程序直接进行评判还不是很普遍。因此,有必要开发一套简单易用

4、的 C 语言源程序的自动评判系统,帮助老师检查学生的编程作业,提高老师工作效率,减轻老师负担。1.1.2 C 语言简介C 语言是国际上广泛流行的、很有发展前途的计算机高级语言。它适合作为系统描述语言,即可用来编写系统软件,也可用来编写应用软件。 早期的操作系统等系统软件主要是用汇编语言编写的(包括 UNIX 操作系统在内) 。由于汇编语言依赖于计算机硬件,程序的可读性和可移植性都比较差。为了提高可读性和可移植性,最好改用高级语言,但一般的高级语言难以实现汇编语言的某些功能(汇编语言可以直接对硬件进行操作) ,例如:对内存地址的操作、位操作等) 。人们设想能否找到一种既具有一般高级语言特性,又具

5、有低级语言特性的语言,集它们的优点于一身。于是,C 语言就在这种情况下应运而生了。 C 语言是在 B 语言的基础上发展起来的,它的根源可以追溯到 ALGOL 60。 1960 年出现的 ALGOL 60 是一种面向问题的高级语言,它离硬件比较远,不宜用来编写系统程序。1963 年英国的剑桥大学推出了 CPL 语言。1967 年英苏 州 科 技 学 院 毕 业 论 文2国剑桥大学的 Matin Richards 对 CPL 语言作了简化,推出了 BCPL 语言。1970 年美国贝尔实验室的 Ken Thompson 以 BCPL 语言为基础,又作了进一步简化,设计出了很简单的而且很接近硬件的 B

6、 语言,并用 B 语言写第一个UNIX 操作系统,在 PDP-7 上实现。 1971 年在 PDP-11/20 上实现了 B 语言,并写了 UNIX 操作系统。但 B 语言过于简单,功能有限。1972 年至 1973 年间,贝尔实验室的 D.M.Ritchie 在 B 语言的基础上设计出了 C 语言(取 BCPL 的第二个字母) 。最初的 C 语言只是为描述和实现 UNIX 操作系统提供一种工作语言而设计的。1973 年,K.Thom- pson 和 D.M.ritchie 两人合作把 UNIX 的 90%以上用 C 改写。 后来,C 语言多次作了改进,但主要还是在贝尔实验室内部使用。直到 1

7、- 975 年 UNIX 第 6 版公布后 ,C 语言的突出优点才引起人们普遍注意。 1977年出现了不依赖于具体机器的 C 语言编译文本可移植 C 语言编译程序 ,使C 移植到其它机器时所做的工作大大简化了,这也推动了 UNIX 操作系统迅速地在各种机器上实现。随着 UNIX 的日益广泛使用,C 语言也迅速得到推广。C 语言和 UNIX 可以说是一对孪生兄弟,在发展过程中相辅相成。1978 年以后,C 语言已先后移植到大、中、小、微型机上,已独立于 UNIX 和 PDP 了。现在 C 语言已风靡全世界,成为世界上应用最广泛的几种计算机语言之一。 C 语言主要有以下一些特点:(1)语言表达能力

8、强。(2)语言简洁、紧凑,使用灵活,易于学习和使用。(3)数据类型丰富,具有很强的结构化控制语句。 (4)语言生成的代码质量高。(5) 语法限制不严格,程序设计自由度大。 (6)可移植性好。苏 州 科 技 学 院 毕 业 论 文3第 2 章 概要设计21 方案设计本课题的任务是完成一个 C 源程序的自动评判系统。首先需要解决的问题是确定整个系统的开发环境和工作方式,然后是确定系统所要达到的目标,接着分析系统所应完成的功能以及可能遇到的问题,最后给出具体实现的步骤。2.1.1 开发环境经过与指导老师的交流,查阅有关资料,分析系统的整体情况,本系统更加类似于一个应用程序,再结合自己所学知识,决定采

9、用微软的 Visual C+集成开发环境来开发整个程序。Visual C+是 Windows 环境下最强大、最流行的程序设计语言之一。Visual C+可以用来开发各种类型、不同规模和复杂程度的应用程序,开发效率很高,生成的应用软件代码品质优良。2.1.2 工作方式分析整个系统,最主要的功能是:编译链接源程序,运行目标程序,目标程序输入输出的重定向。结合 Visual C+开发环境来看,有批处理方式、普通应用程序方式、Add-in 方式。考虑到 Add-in 的方式在使用 Visual C+编译器去编译链接 C 源程序的时候更加方便,并且 Add-in 的方式也可以利用 Visual C+的可

10、视化界面的开发功能,所以工作方式采用 Visual C+下的 Add-in 方式。Visual C+ Add-In 基本上就是实现了 IDSAddIn 接口的 COM 对象。通过这个接口,Add-in 能够掌管 Visual C+环境,并且执行特定的任务 ,例如在 Visual C+环境下打开工作空间,编译工程等等。在使用 Add-in 方式的时候,首先需要打开 Visual C+环境,然后加载 add-in 文件(*.dll) 。2.1.3 系统目标本 系 统 最 终 目 的 是 为 了 减 轻 老 师 负 担 , 利 用 计 算 机 自 动 评 判 编 程 作 业 ,替 代 手 工 检 查

11、 方 式 。 要 求 学 生 将 编 写 好 的 作 业 交 至 指 定 文 件 夹 , 然 后 老 师 运行 本 系 统 , 编 译 链 接 , 运 行 生 成 目 标 程 序 , 通 过 比 较 程 序 输 出 与 标 准 答 案 ,可 以 得 到 每 个 源 程 序 的 评 判 结 果 。22 系统功能详 细 的 分 析 整 个 系 统 功 能 应 该 包 括 :1. 从 文 件 夹 抽 取 源 程 序 。2. 控 制 Visual C+编 译 器 编 译 链 接 源 程 序 。苏 州 科 技 学 院 毕 业 论 文43. 以 测 试 数 据 运 行 生 成 的 目 标 程 序 。4.

12、程 序 输 出 与 标 准 输 出 比 较 。5. 根 据 比 较 结 果 得 到 评 判 结 果 。23 需要解决问题1. 存 放 C 源 程 序 的 文 件 夹 的 组 织 方 式 和 文 件 夹 中 C 源 程 序 的 命 名 方 式 。2. 程 序 通 过 何 种 方 式 提 取 C 源 程 序 。3. 用 程 序 控 制 Visual C+编 译 器 去 编 译 链 接 C 源 程 序 。4. 如 何 处 理 编 译 链 接 时 出 错 , 没 有 生 成 目 标 程 序 的 C 源 程 序 。5. 通 过 何 种 方 式 运 行 编 译 链 接 之 后 生 成 的 目 标 程 序

13、。6. 在 运 行 目 标 程 序 时 , 如 何 自 动 完 成 目 标 程 序 的 输 入 和 输 出 。7. 对 于 运 行 目 标 程 序 时 异 常 情 况 的 处 理 。8. 采 用 何 种 方 式 比 较 输 出 结 果 和 正 确 答 案 , 以 及 如 何 存 储 比 较 结 果 。24 系统流程2.4.1 基本流程基 本 上 本 系 统 是 一 个 顺 序 执 行 的 过 程 , 系 统 的 实 现 也 是 一 步 一 步 来 的 。下 一 个 模 块 需 要 用 到 上 一 个 模 块 的 数 据 。 系 统 流 程 图 如 图 1-1 所 示 。1. 系 统 从 文 件

14、 夹 提 取 出 所 有 的 C 源 程 序 。2. 系 统 控 制 Visual C+的 编 译 器 去 编 译 链 接 提 取 出 的 C 源 程 序 , 得 到相 应 的 生 成 的 目 标 程 序 (exe)。3. 系 统 以 正 确 输 入 数 据 运 行 生 成 的 目 标 程 序 (exe)。4. 系 统 提 取 运 行 目 标 程 序 (exe)得 到 的 输 出 数 据 。5. 系 统 将 输 出 数 据 与 正 确 答 案 进 行 比 较 。6. 根 据 比 较 结 果 得 到 评 判 结 果 。苏 州 科 技 学 院 毕 业 论 文5图 1-1 系统流程图2.4.2 具体

15、实现根据系统应该完成的功能,结合需要解决的问题,系统的具体实现如下:苏 州 科 技 学 院 毕 业 论 文61. 文件夹的组织方式:每一个题目设置一个文件夹,同一题目的所有编程作业( 只交后缀名为*.c 的文件) 交至对应的唯一文件夹下。2. 每个文件夹中 C 源程序的命名方式:以学号命名,后缀名为*.c ,这样每个文件夹中的 C 源程序是唯一的,在评判时能更直观的得到结果。3. 设置一个基本对话框,通过列表控件来提取选择的一个文件夹下的所有 C 源程序。4. 编译链接方面,Visual C+不能直接编译链接后缀名为 *.c 的 C 源程序,因此提前新建一个 WIN32 空白工程文件,然后将

16、C 源程序的后缀名改为*.cpp,放至空白工程中,便可以解决不能直接编译链接的问题。通过 Add-in接口,控制整个 Visual C+环境,打开已放入改了后缀名的 C 源程序的空白工程文件,然后便可进行编译链接。在这里要设置循环,对列表框中的每一个 C源程序都进行编译链接。5. 循环过程中,编译链接后生成目标程序的 C 源程序,从空白工程文件的 Debug 文件夹中复制其目标程序到暂存的文件夹,并用其学号来命名生成的目标程序。然后循环继续直到所有 C 源程序都完成编译链接。6. 对于编译链接后没有生成目标程序的 C 源程序,视为编译链接错误,将此结果先一步存至评判结果处。7. 编译链接全部完

17、成后,设置弹出一个对话框,用于输入测试数据、运行正确的目标程序,得到正确答案。同时通过列表框提取已经生成的所有以学号命名的目标程序。8. 对于编译链接正确,已经生成的目标程序,设置循环,每次循环中通过新建一个进程来运行应用程序,如果程序正常结束,则关闭进程,循环继续去运行下一个目标程序。9. 在运行目标程序时,通过管道技术来完成输入输出数据的重定向问题。10. 对于目标程序运行时可能出现的种种异常情况,例如死循环等,通过设定一个时间,超出这个时间后进程强制结束来处理,进程强制结束后主循环继续,同时判定为运行时错误。11. 在开始循环运行所有目标程序之前,需要老师首先运行此题目正确程序生成的应用

18、程序,并且输入运行数据(如无需数据输入则省略此步骤),得到正确的输出数据,存入一个编辑框。然后每次运行生成的目标程序得到输出时与编辑框中字符串比较,来得到比较结果。结果是相同或是不同。12. 最后的评判结果:没有生成目标程序,判为编译链接出错-50 分;生成了目标程序,但是输出与正确答案不同,判为运行错误-60 分;生成了目标程序,并且输出结果与苏 州 科 技 学 院 毕 业 论 文7正确答案相同,判为程序正确-100 分。苏 州 科 技 学 院 毕 业 论 文8第 3 章 详细设计31 系统模块化分根 据 系 统 所 应 该 完 成 的 功 能 , 以 及 考 虑 到 使 用 的 方 便 性

19、 , 将 系 统 划 分 为三 个 模 块 , 其 中 包 括 两 个 基 本 对 话 框 和 一 个 函 数 。3.1.1 添加文件对话框此 对 话 框 需 要 完 成 的 功 能 、 遇 到 的 问 题 及 解 决 办 法 :1. 初 始 化 : 在 系 统 运 行 之 前 删 除 空 白 工 程 文 件 中 不 需 要 的 文 件 , 清 空相 关 的 文 件 夹 。 此 功 能 通 过 对 话 框 上 的 一 个 “初 始 化 ”按 钮 完 成 。在 系 统 运 行 选 择 C 源 程 序 文 之 前 , 需 要 对 相 关 文 件 夹 和 文 件 进 行 处 理 ,有 删 除 文 件

20、 夹 、 清 空 文 件 夹 、 删 除 文 件 。 而 在 Visual C+中是不能直接删除非空的文件夹的,也没有清空文件夹的函数,文件是可以通过库函数DeleteFile()直接删除的。因此这里需要自己添加函数来清空文件夹,在清空文件夹之后调用库函数 RemoveDirectory()来删除已空文件夹。2. 添 加 文 件 : 初 始 化 之 后 , 从 相 应 的 存 放 相 同 题 目 的 文 件 夹 中 提 取 所有 的 C 源 程 序 文 件 (过 滤 器 设 置 为 只 能 选 取 后 缀 名 为 *.c 的 文 件 ), 将 所 有 的文 件 添 加 至 对 话 框 的 一

21、个 列 表 控 件 中 , 列 表 控 件 的 每 一 行 项 目 为 C 源 程 序 文件 的 绝 对 路 径 。 完 成 添 加 C 源 程 序 后 , 取 得 项 目 总 数 的 信 息 存 入 注 册 表 , 并且 以 项 目 总 数 设 置 循 环 , 将 每 个 C 源 程 序 文 件 的 绝 对 路 径 信 息 存 入 注 册 表 ,然 后 调 用 编 译 链 接 函 数 。 此 功 能 通 过 对 话 框 的 一 个 “添 加 文 件 ”按 钮 和 一 个 列表 控 件 完 成 。在 添 加 文 件 时 选 择 用 列 表 控 件 的 方 式 , 这 样 在 之 后 设 置 循

22、 环 对 每 个 C 源程 序 文 件 进 行 操 作 时 比 较 方 便 。 同 时 每 个 项 目 中 取 的 是 C 源 程 序 文 件 的 绝 对路 径 (包 括 文 件 名 ), 因 为 之 后 的 好 多 操 作 需 要 文 件 的 路 径 , 取 得 学 号 信 息 时也 比 较 方 便 。 因 为 在 Add-in 方 式 下 , 对 话 框 类 和 Add-in 类 之 间 的 数 据 传 递比 较 特 殊 , 所 以 采 用 将 列 表 控 件 中 的 相 关 信 息 存 至 注 册 表 的 方 式 , 以 便 今 后在 编 译 链 接 时 调 用 。3. 确 认 : 新

23、建 对 话 框 时 , 默 认 的 代 码 , 无 实 际 功 能 。 通 过 点 击 此 按 钮 ,得 到 “OK”按 钮 按 下 的 消 息 , 调 用 编 译 链 接 函 数 。 通 过 对 话 框 的 “OK”按 钮 完成 。此 对 话 框 的 数 据 输 入 是 : 文 件 夹 中 选 取 的 所 有 后 缀 名 为 (*.c)的 C 源 程 序苏 州 科 技 学 院 毕 业 论 文9文 件 。此 对 话 框 的 数 据 输 出 是 : 列 表 控 件 中 的 项 目 总 数 和 列 表 控件每个项目中C 源程序文件的绝对路径。3.1.2 编译链接函数此函数需要完成的功能、遇到的问题

24、及解决办法:编译链接:从注册表提取出添加文件对话框中列表控件的项目总数,以此设置循环。在每次循环中,首先进行初始化操作,删除空白工程文件夹中相关不用的文件和文件夹,然后通过从注册表提取出添加文件对话框列表控件的项目中的 C 源程序文件的绝对路径,将后缀名为 *.c 的 C 源程序文件改名为与建立空白工程时建立的关联的*.cpp 文件。通过 Add-in 的接口,在 Visual C+工作空间打开空白工程文件,此时它已经成为 C 源程序文件的工程文件,进行编译链接。编译链接完成之后如果在空白工程文件的 Debug 文件夹中找到生成的目标程序,则以此 C 源程序文件中的学号信息来命名此目标程序(即

25、,此时目标程序改名为学号.exe) 并且将改名后的目标程序复制到暂存所有生成的目标程序的文件夹中,以备运行时使用。而如果编译链接完成之后在空白工程文件的Debug 文件夹中没有找到生成的目标程序,则视为编译链接错误,直接在结果文件夹中以学号为信息给出评判结果。处理结束后进行下一个循环直到循环结束,给出编译链接已完成的信息提示框。首先编译链接时取用的数据是刚才添加文件对话框中列表控件中添加入注册表的信息。在每次循环开始前,都需要对 test 文件夹进行处理,删除 Debug文件夹,删除 0.cpp 文件,清空 result、outcome 文件夹,这些问题同添加文件对话框问题中的初始化一样,都需

26、要自己编写函数来清空文件夹和删除非空文件夹。然后因为是将 C 源程序文件加入空白工程文件中编译,且空白的关联cpp 文件已经命名为 0.cpp,所以 C 源程序文件在编译链接前都需要改名为0.cpp 文件。之后通过 Add-in,控制整个 Visual C+的开发环境,首先打开工作空间,然后载入工程,之后编译链接,当然这些都是 Visual C+自动完成的,相当于按下了 Build 按钮,这也就是使用 Add-in 方式的关键所在。编译链接结束后,如果在 Debug 文件夹中生成 0.exe 文件,则视为编译链接成功,且此时需要将此文件转移出来,因为如不转移,编译链接下一个 C 源程序文件时会

27、覆盖此 0.exe 文件。此函数的数据输入是:列表控件中的项目总数和列表控件每个项目中 C 源程序文件的绝对路径。此函数的数据输出是:编译链接成功后以学号命名的存至相同文件夹下的苏 州 科 技 学 院 毕 业 论 文10目标程序;编译链接错误后以学号为区分信息的存至结果文件夹下的评判结果。3.1.3 运行/评判对话框此 对 话 框 需 要 完 成 的 功 能 及 其 解 决 办 法 :1. 输入数据、运行正确程序:弹出此对话框后,进入运行目标程序,评判阶段,首先运行此题目正确程序编译链接后生成的 exe 程序,如果需要输入数据才能运行的,先输入数据,得到此题目正确的输出。此功能通过“选择正确程

28、序”按钮来选择此题目正确程序生成的 exe 文件,通过一个编辑框显示运行的正确 exe 文件路径,通过另一个编辑框来实现数据输入,通过第三个编辑框来得到运行正确 exe 文件后得到的数据输出,即标准答案。在编译链接结束后,进入运行/评判阶段,首先需要运行正确的程序,这是老师之前通过编译链接正确题目程序得到的正确的 exe 程序。如果程序需要输入数据之后运行的,在“正确输入” 编辑框中输入正确数据。通过编辑框的方式输入数据方便直观。因为这里是老师输入正确程序的正确数据输入,所以老师会确保输入数据的正确性。而如果不需输入数据即可得到输出数据的话就不用输入数据即可。之后通过 CreateProces

29、s()函数运行正确程序,这里通过重定向技术使用管道来完成自动的使用输入数据运行程序并且自动的将输出数据送入编辑框而不是在显示屏显示。在正确输出编辑框中会显示出正确的结果,这样子也便于观察。2. 选择目标文件:输入正确数据,以此数据运行正确的 exe 文件后,得到正确输出,即标准答案。选取暂存文件夹中所有 C 源程序文件编译链接正确后生成的所有以学号命名的目标程序至列表控件,列表控件项目为选取的目标程序的绝对路径。此功能通过一个“添加文件” 完成选取所有目标程序,通过一个列表控件来完成添加所有目标文件。这里也是通过列表控件来完成选择文件的工作,因为知道生成的所有目标程序在 test 文件夹下的

30、result 文件夹中,所以在打开文件时直接定位到此程序所在的文件夹。每个项目中同样也是放的目标程序的绝对路径(包括文件名),因为之后使用函数运行程序是需要使用程序的绝对路径。3. 运行目标文件、进行评判:完成选取所有目标程序后,以列表控件的项目总数即目标程序总数设置循环。在每次循环中,以运行正确程序的 exe 文件时的数据输入作为运行目标程序的数据输入,即使用正确输入编辑框中的输入数据,去运行目标程序,得到输出数据,将此输出数据与正确输出编辑框中的数据比较,这两个数据都是 CString 类型的。如果比较结果相同,则视为运苏 州 科 技 学 院 毕 业 论 文11行正确,将此结果以学号信息为

31、区别存至结果文件夹中作为评判结果;如果比较结果不同,则视为运行时错误,也将此结果以学号信息为区别存至结果文件夹作为评判结果。完成一个目标程序的运行、评判之后,循环继续,去运行、评判下一个 C 源程序。直到处理完所有的目标程序,至此运行、评判结束。此功能通过一个“ 开始” 按钮完成。在这里运行程序时的原理和运行正确程序时的一样,正确的数据输入就采用正确输入编辑框中的数据,这样可以确保程序正确时得到的输出与正确输出相同,方便评判。一个问题是需要考虑到这里运行的是学生的程序而不是老师的正确程序,所以可能出现运行异常、死循环的进程不结束的问题,那么就会出现死机的情况,主程序运行不下去,所以这里需要设置

32、进程运行超时的处理。因为是教学中的 C 源程序文件作业,相对较为简单,所以设置运行时间为 4 秒,如果进程运行超时还没有自动结束,则强制结束,判为运行时错误。若果进程自动结束,则于正确结果比较得到评判结果。此对话框的数据输入是:题目正确源程序生成的 exe 文件,正确的测试数据输入,所有 C 源程序文件编译链接正确后生成的目标程序。此对话框的数据输出是:以输入的正确测试数据运行正确程序后的正确数据输出;比较运行目标程序后的数据输出与正确数据输出,结果相同后得到的以学号信息区别的存至结果文件夹的运行正确的评判结果;比较运行目标程序后的数据输出与正确数据输出,结果不同后得到的以学号信息区别的存至结

33、果文件夹的运行错误的评判结果。32 系统模块具体实现在 这 一 节 中 , 将 会 对 各 个 模 块 中 系 统 那 个 实 现 的 难 点 、 遇 到 的 问 题 、 解决 的 方 法 、 重 点 技 术 问 题 的 给 出 详 细 的 说 明 。3.2.1 准备工作在开始系统设计之前,在 Visual C+中新建一个 Win32 空白工程,这里工程名为 test,然后在此空白工程中新建一个 C+文件,文件名为 0.cpp。以后编译链接选取的 C 源程序文件时则将 C 源程序文件改名为 0.cpp 并替换空白工程中的 0.cpp 文件即可。为防止编译链接时编译链接两次,选择组件-配置,移除

34、 Win32 Release 只保留 Win32 Debug。在此空白工程文件夹 test 中,新建一个文件夹 result 用于保存编译链接成功后生成的以学号命名的目标程序,新建一个文件夹 outcome 用于存放最后的评判信息,新建一个空白文本文件file.txt。在每次开始使用系统之前,进行的初始化操作就包括删除 Debug 文件夹、苏 州 科 技 学 院 毕 业 论 文12删除 0.cpp 文件,清空 result 和 outcome 文件夹。接着开始系统的具体功能实现阶段。首先 Visual C+中新建一个DevStudio Add-in Wizard 工程,工程名称为 Auto,并

35、且在 CCommands-ICommands 中自动添加一个函数 AutoCommandMethod()。这个函数是系统的切入点。这时编译链接工程之后,生成 DLL 文件,加载此文件后,工具栏会添加一个按钮,此按钮实现的是 AutoCommandMethod()的函数功能。系统的使用从点击这个按钮开始。3.2.2 实现添加文件对话框建立起 DevStudio Add-in Wizard 工程后,在工作空间,右击 Auto Classes添加一个对话框类 AddFile,即添加文件对话框。编辑此对话框,添加 “初始化”、“添加文件”按钮和一个列表控件,保留默认的 “OK”、 “Cancle”按钮

36、。1. “初始化”按钮:此按钮完成的功能是删除 Debug 文件夹、删除 0.cpp文件,清空 result 和 outcome 文件夹。在 Visual C+中可以通过库函数DeleteFile()删除一个文件。(1). 在此遇见的问题是在 Visual C+中不能直接删除一个不为空的文件夹以及没有现成的库函数来清空一个文件夹,因此自己添加两个函数DeleteFolder 和 ClearFolder,分别用于删除文件夹 (不管其是否为空)和清空文件夹(清空其中的文件而保留文件夹),函数代码如下:a. DeleteFolder 函数void AddFile:DeleteFolder(CStri

37、ng sPath)CFileFind ff; BOOL bFound; bFound = ff.FindFile(sPath + “*.*“); while(bFound) bFound = ff.FindNextFile(); CString sFilePath = ff.GetFilePath(); if(ff.IsDirectory() if(!ff.IsDots() DeleteFolder(sFilePath); 苏 州 科 技 学 院 毕 业 论 文13 else if(ff.IsReadOnly() SetFileAttributes(sFilePath, FILE_ATTRIB

38、UTE_NORMAL); DeleteFile(sFilePath); ff.Close(); SetFileAttributes(sPath, FILE_ATTRIBUTE_NORMAL); RemoveDirectory(sPath); b. ClearFolder 函数void AddFile:ClearFolder(CString sPath)CFileFind ff; BOOL bFound; bFound = ff.FindFile(sPath + “*.*“); while(bFound) bFound = ff.FindNextFile(); CString sFilePath

39、 = ff.GetFilePath(); if(ff.IsDirectory() if(!ff.IsDots() DeleteFolder(sFilePath); else if(ff.IsReadOnly() 苏 州 科 技 学 院 毕 业 论 文14 SetFileAttributes(sFilePath, FILE_ATTRIBUTE_NORMAL); DeleteFile(sFilePath); ff.Close(); SetFileAttributes(sPath, FILE_ATTRIBUTE_NORMAL); (2). 完整的 “初始化”按钮代码如下:CString StrDes

40、tFile=“D:test0.cpp“;DeleteFile(StrDestFile);/删除 0.cpp 文件CString DirectoryDebugName=“D:testDebug“;DeleteFolder(DirectoryDebugName);/删除 DEBUG 文件夹CString DirectoryResultName=“D:testresult“;ClearFolder(DirectoryResultName);/清空 result 文件夹ClearFolder(“D:testoutcome“);/清空 outcome 文件夹GetDlgItem(IDC_addfile_

41、BUTTON)-EnableWindow(true);/设置“添加文件”按钮禁用,点击“初始化 ”后启用GetDlgItem(IDOK)-EnableWindow(true);/ 设置“OK”按钮禁用,点击“初始化”后启用2. “添加文件”按钮:点击之后弹出选择文件对话框,完成选择所有的 C源程序文件,然后将所有的 C 源程序文件添加至对话框的列表控件中,列表控件的每一行项目为 C 源程序文件的绝对路径。然后将列表控件中的项目总数和每个项目所指向的 C 源程序文件的绝对路径存入注册表,以备编译链接时使用。(1). 列表控件的初始化工作需要首先设置列表控件的属性属性-样式-查看-报告,然后在 A

42、ddFile 类的 Message 中选择 WM_INITDIALOG 添加函数苏 州 科 技 学 院 毕 业 论 文15OnInitDialog(),最后在此函数中添加代码如下:m_list.InsertColumn(0,“file“,LVCFMT_CENTER,500,-1);(2). 点击“添加文件” 按钮后弹出打开文件对话框,通过 CFileDialog 来实现,设置过滤器以便只能选择后缀名为*.c 的 C 源程序文件,同时相关参数设置为能够选择多个文件,其代码如下:CFileDialog Dlg(TRUE,“*.c“,NULL,OFN_FILEMUSTEXIST|OFN_ALLOWM

43、ULTISELECT,“C 文件 (*.c)|*.c|“,NULL);(3). 对于选择多个文件添加至列表控件中,需要设置指针,通过GetStartPosition()函数使指针指向选取的第一个文件开始,直至最后一个文件,然后通过 GetNextPathName()函数来将选取的 C 源程序文件的绝对路径添加入列表控件,代码如下:POSITION pos=Dlg.GetStartPosition(); while(pos!=NULL) CString FileName=“; FileName = Dlg.GetNextPathName(pos); m_list.InsertItem(0, “,

44、 0);m_list.SetItem(0, 0, LVIF_TEXT, FileName,0, 0, 0, 0); (4). 将选取的所有 C 源程序文件的绝对路径存入列表控件后,通过AfxGetApp()-WriteProfileInt 将列表框项目总数写入注册表,然后以项目总数设置循环,通过 AfxGetApp()-WriteProfileString 依次将每个 C 源程序文件的绝对路径写入注册表,以备编译链接时使用,其代码如下:AfxGetApp()-WriteProfileInt(“Configure“, “count“,m_list.GetItemCount();for (int

45、i = 0 ; i WriteProfileString(“Configure“, szRegKey,m_list.GetItemText(i, 0);(5). 完整的 “添加文件”按钮代码如下:苏 州 科 技 学 院 毕 业 论 文16CFileDialog Dlg(TRUE,“*.c“,NULL,OFN_FILEMUSTEXIST|OFN_ALLOWMULTISELECT,“C 文件 (*.c)|*.c|“,NULL);if(Dlg.DoModal()=IDOK) POSITION pos=Dlg.GetStartPosition(); while(pos!=NULL) CString F

46、ileName=“; FileName = Dlg.GetNextPathName(pos); m_list.InsertItem(0, “, 0);m_list.SetItem(0, 0, LVIF_TEXT, FileName,0, 0, 0, 0); AfxGetApp()-WriteProfileInt(“Configure“, “count“,m_list.GetItemCount();for (int i = 0 ; i WriteProfileString(“Configure“, szRegKey,m_list.GetItemText(i, 0);3. “OK”按钮:此按钮的代

47、码是新建对话框时的默认代码,无实际功能,其按下的意义在于,取得按下“OK”的消息,调用编译链接函数。此消息的实现是在系统切入点 AutoCommandMethod()函数出,点击工具栏按钮后弹出添加文件对话框,进行完选取 C 源程序文件的操作后,点击“OK”按钮,AutoCommandMethod()函数得到按下“OK”按钮的消息,然后调用编译链接函数,进入下一步工作,这里 AutoCommandMethod()函数相关代码如下:AddFile AddFileDlg;/弹出添加文件对话框if(AddFileDlg.DoModal()=IDOK)/若按下添加文件对话框的 “OK”按钮build(

48、);/调用编译链接函数苏 州 科 技 学 院 毕 业 论 文173.2.3 实现编译链接函数首先建立编译链接函数,这个函数是在 Add-in 方式下建立的,目的是操控 Visual C+的开发环境,实现在工作空间打开工程文件,调用 Visual C+自带的编译器去编译链接工程。建立此函数的过程是:右击 CCommands 类下的ICommands,选择 Add Method,然后方法名称为 build,即建立了一个 build()函数,此时函数代码为空,不实现功能。 在添加文件对话框完成所有工作后,点击“OK”按钮,发出按钮按下的消息,在 AutoCommandMethod()函数中调用 bu

49、ild()函数。此函数要实现的功能是:1. 初始化工作,在每次编译链接 C 源程序文件前需要删除 Debug 文件夹和 o.cpp 文件,以保证编译链接成功后在 Debug 文件夹中生成的目标程序是对应当前的 C 源程序文件的,其代码如下:DeleteFile(“D:test0.cpp“);/删除 0.cpp 文件DeleteFolder(“D:testDebug“);/删除 Debug 文件夹2. 取得 C 源程序文件中的学号信息,因为 C 源程序文件存至列表控件中的是其绝对路径,包括路径和完整的文件名(因为在命名时有要求,所以文件名也就是“学号 .c”) ,所以需要提取出文件名中的学号(即文件标题),学号是唯一区别标志,以便在给出评判结果时使用学号信息,代码如下:CString stillfilena

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 学术论文 > 管理论文

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报