编译原理课程.doc_第1页
编译原理课程.doc_第2页
编译原理课程.doc_第3页
编译原理课程.doc_第4页
编译原理课程.doc_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

淮淮阴阴工工学学院院 编译原理课程设计指导书编译原理课程设计指导书 江苏江苏 淮阴工学院淮阴工学院 计算机工程系计算机工程系 二二 OO 八年二月八年二月 前前言言 编译原理 是计算机科学与技术专业最重要的一门专业基础课程 内容庞大 涉及面广 知识点多 由于该课程教 学难度都非常大 往往费了大量时间而达不到 预期教学效果俗语说 学习的最好方法是实践 本课程设计正是基于此 力求为学生 提供一个理论联系实际的机会 通过布置一定难度的课题 要求学生独立完成 通过 实践 建立系统设计的整体思想 锻炼编写程序 调试程序的能力 学习文档编写规 范 培养独立学习 吸取他人经验 探索前言知识的习惯 树立团队协作精神 同时 课程设计可以充分弥补课堂教学及普通实验中知识深度与广度有限的缺陷 更好地帮 助学生从全局角度把握课程体系 本指导书在全面把握教学大纲及教材精神的基础上 共设计了 6 个题目 不是用 一个独立的例子涵盖这些知识点 而是按层次逐步深入 为了使学生理解它们之间如 何相互配合 设计要求使用接近实际需要的方式编程 重点放在编译程序的基本特征 上 结合实际应用 通过详细的实例 循序渐进地启发学生完成设计 课程设计比教 学实验复杂 涉及的深度较广 并更加实用 目的是通过课程设计的综合训练 培养 学生实际分析问题 编程和动手能力 最终目标是通过课程设计的形式 帮助学生系 统地掌握该门课程的主要内容 更好地完成教学任务 书中给出的实例概念清楚 体 系完整 内容丰富 采用循序渐进的方式 提高学生实际动手能力 完成 知识 实 践 技能 的整个学习过程 目目 录录 前 言2 选题一 有穷自动机的化简与确定化4 选题二 LL 1 语法分析5 选题三 算符优先分析法7 选题四 LR 0 语法分析8 选题五 SLR 1 语法分析9 选题六 逆波兰式的生成10 附录 A VISUAL C 6 0 简介11 附录 B C C 常用函数26 附录 C 课程设计操作规程61 附录 D 文档要求与规范64 选题一选题一有穷自动机的化简与确定化有穷自动机的化简与确定化 一 设计内容及要求一 设计内容及要求 1 可以使用任何语言来完成 例如 C C 2 以文件方式读取自动机 3 判断读取的自动机是确定的还是不确定的自动机 4 若是不确定的自动机 将自动机确定化 5 将确定化后的自动机最小化 6 输入测试字符串 输出测试结果 二 实现原理二 实现原理 1 确定化 子集法 1 置 Q F 为空集 2 令 q0 CLOSURE q0 并把 q0 置为未标记后加入到 Q 中 3 如果 Q 中存在未标记状态 q1 q2 qi 则对每个 a 定义 d q1 q2 qi a p1 p2 pj 当且仅当 d q1 q2 qi a r1 r2 rk CLOSURE r1 r2 rk p1 p2 pj 如果 p1 p2 pj 不在 Q 中 则把它置为未标记后加入到 Q 中 如果 p1 p2 pj 中至少有一个是 M 的 终态 则同时把 p1 p2 pj 加入到 F 中 然后给 Q 中的状态 q1 q2 qi 加上标记 4 重复执行 3 直到不能向 Q 中加入新状态 并且 Q 中所有的状态都有标记为止 5 重新命名 Q 中的状态 然后获得等价的 DFA M 2 DFA 的最小化 利用等价关系找出状态集 Q 上的所有最大等价状态子集 即找出 Q 的最小划分 然后从各个 等价子集中选取一个代表状态 消去各等价子集中的非代表状态 这样就实现了 DFA 的最小化的 目的 主要步骤 for v q p F Q F do 标记可区分状态表中的表项 q p p 和 q 不可合并 for v q p F F Q F Q F 且 q p do if E a 可区分状态表中的表项 q a p a 已被标记 then begin 标记可区分状态表中的表项 q p 递归的标记本次被标记的状态对的关联链表上的各个状态对在可区分状态表中 的对应表项 end else for v a do if q a p a 且与 q p 与 q a p a 不是同一个状态对 then 将 q p 放在 q a p a 的关联链表上 选题二选题二 LL 1 语法分析 语法分析 一 设计内容及要求一 设计内容及要求 1 一切 LL 1 文法 含有直接左递归但可以转化为 LL 1 文法的文法 含有间接左递归但可 以转化为 LL 1 文法的文法 2 计算出文法的 First Follow 3 构造相应文法的预测分析表 4 对某个输入句子进行分析 二 实现原理二 实现原理 1 LL 1 文法 LL 1 文法是一类可以进行确定的自顶向下语法分析的文法 就是要求描述语言的文法是无左 递归的和无回溯的 根据 LL 1 文法的定义 对于同一非终结符 A 的任意两个产生式 A a 和 A b 都要满足 SELECT A a SELECT A b 1 文法的左递归 当一个文法是左递归文法时 采用自顶向下分析法会使分析过程进入无穷循环之中 所以采 用自顶向下语法分析需要消除文法的左递归性 文法的左递归是指若文法中对任一非终结符 A 有 推导 A A 则称该文法是左递归的 左递归又可以分为直接左递归和间接左递归 直接左递归 若文法中的某一产生式形如 A A V 则称该文法是直接左递归的 消除直接左递归的方法 设有产生式是关于非终结符 A 的直接左递归 A A V 且 不以 A 开头 对 A 引入一个新的非终结符 A 把上式改写为 A A A A 间接左递归 若文法中存在某一非终结符 A 使得 A A 至少需要两步推导 则称该文法是间接左递归的 消除间接左递归的方法 方法一 采用代入法把间接左递归变成直接左递归 方法二 直接改写文法 设有文法 G10 S S A A S 因为 S A S 所以 S 是一个间接递归的非终结符 为了消除这种间接左递归 将 式代入 式 即可得到与原文法等价的文法 可以证明 S S 式是直接左递归的 可以采用前面介绍的消除直接左递归的方法 对文法进行改写后可得 文法 S S S S 2 计算 First 集 1 若 X VT 则 First X X 2 若 X VN 且有产生式 X a a VT则 First X a 3 若 X VN 且有产生式 X 则 First X 4 若 X Y1 Y2 Yn 都 VN 而由产生式 X Y1 Y2 Yn 当 Y1 Y2 Yi 1 都能推导出 时 其中 1 i n 则 First Y1 First Y2 First Yi 都包含在 First X 中 5 当 4 中所有 Yi都能推导出 i 1 2 n 则 First X First Y1 First Y2 First Yn 反复使用上述步骤直到每个符合的 First 集合不再增大为止 3 计算 Follow 集 对文法中的每个 A VN 计算 Follw A 1 设 S 为文法的开始符合 把 加入 Follow S 中 2 若 A B 是一个产生式 则把 First 的非空元素加入 Follow B 中 如果 能推导 出 则把 Follow A 也加入 B 中 3 反复使用以上步骤直到每个非终结符号的 Follow 集不再增大为止 4 预测分析方法 预测分析方法是自顶向下分析的另一种方法 一个预测分析器是由三个部分组成 预测分析 程序 先进后出栈 预测分析表 预测分析程序的框图如下 选题三选题三算符优先分析法算符优先分析法 一 实验内容与要求一 实验内容与要求 已知文法 E E T E T T T T F T F F F E i E i d 其中 d 表示 0 9 的数字 i 表示字母 大小写均包含 根据算符优先分析法 将表达式进行语法分析 判断一个表达式是否正确 1 可以使用任何语言来完成 例如 Java C 2 构造此文法的分析过程 3 输入测试字符串 输出测试结果 二 实验原理二 实验原理 1 算符优先分析算法算法原理 1 初始化栈 k 1 S k 2 依次从输入串中读入符号 a 当前单词若为标识符 则 a 值为 i 若为常数则 a 值为 d 其它 a 直接取单词值 若 a 大于等于栈顶第一个终结符的优先级 则 a 进栈 若 a 小于栈顶第一个终结符的优先级 则重复做 i 找出最左子串 S j a ii 把 S j 1 S k 归约为某个 N iii 将归约后的非终结符 N 入栈 出错处理 若输入串扫描完毕 且栈中呈现 S 且 a 为 则符合语法要求 否则就不符合语法要 求 选题四选题四LR 0 语法分析语法分析 一 实验内容与要求一 实验内容与要求 1 录入合法的 LR 0 文法 2 将输出 LR 0 分析表 3 可以对输入的句子进行语法分析 二 实验原理二 实验原理 1 LR 分析表的构造 1 若 A a Ik 且 GO Ik a Ij a VT 则置 ACTION k a sj 2 若 A Ik 则对任意终结符 a 包括 置 ACTION k a rj j 为产生式 A 的编 号 3 若项目 S S Ik 则置 ACTION k acc 4 若 GO Ik A Ij A VN 则置 GOTO k A j 5 不能用上述方法填入内容的单元均置为 出错标志 用空白表示 2 LR 分析算法描述 将 S0 移进状态栈 移进符号栈 S 为状态栈栈顶状态 a getsym 读入第一个符号给 a while ACTION S a acc if ACTION S a Si PUSH i a 分别进栈 a getsym 读入下一个符号给 a else if ACTION S a rj 第 j 条产生式为 A 将状态栈和符号栈分别弹出 项 push A 将 GOTO S A 移进状态栈 S 为当前栈顶状态 else error 选题五选题五SLR 1 语法分析语法分析 一 实验内容与要求一 实验内容与要求 已知控制语句 算术表达式 布尔表达式的文法如下 2 算术表达式算术表达式 1 E E E 2 E E E 3 E E 4 E i 1 构造相应文法的 SLR 分析表 2 构造相应的符合以上三种文法的简单代码段 3 可以对此代码段进行 SLR 语法分析 二 实验原理二 实验原理 SLR 1 分析法的引入是当文法的 LR 0 项目集规范族中存在移进 归约冲突或归约 归约冲突 时 可以通过向前查看一个符号的办法来进行处理 以解决冲突 SLR 1 分析法与 LR 0 分析法的不同主要是在于分析表的构造上 而分析算法上相同 1 SLR 1 分析表的构造 1 若 A a Ik 且 GO Ik a Ij a VT 则置 ACTION k a sj 2 若 A Ik 则对任何终结符 a 包括 且满足 a FOLLOW A 时 置 ACTION k a rj j 为产生式 A 的编号 3 若项目 S S 属于 Ik 则置 ACTION k acc 4 若 GO Ik A Ij A VN 则置 GOTO k A j 5 不能用上述方法填入内容的单元均置为 出错标志 用空白表示 选题六选题六逆波兰式的生成逆波兰式的生成 一 实验内容与要求一 实验内容与要求 已知文法如下 E S S S or B S B B B and C B C C not C C S C id C id relop id 1 录入合法的 SLR 1 文法 2 构造 SLR 1 分析表 3 对输入的句子进行 SLR 语法分析 4 对经过 SLR 语法分析正确的句子构造相应的逆波兰式 二 实验原理二 实验原理 SLR 分析方法同上 1 逆波兰式构造的一般步骤 从左到右扫描后缀表达式各个符号 每碰到运算对象时就把它推进栈 每碰到一个 K 元运算 符时 就取出栈顶的 K 个运算对象进行相应的运算 并且用运算结果去替换栈顶的 K 个运算对象 然后再继续扫描表达式中余留符号 如此等等 直到整个表达式计算完毕为止 当上述过程结束后 整个表达式之值将留于栈顶 运算符进栈运算符进栈 运算符栈运算符栈 退栈退栈 比栈顶高进栈 比栈顶低或相同的退栈比栈顶高进栈 比栈顶低或相同的退栈 波兰表示波兰表示 运算对象运算对象 表达式表达式 附录附录 A Visual C 6 0 简介简介 考虑到目前大多数初学者使用的都是 PC 机和 Windows 操作系统 我们以 Visual C 作为推 荐的 C 编译器 A 1 Visual C 集成开发环境集成开发环境 Visual C 软件包包含了许多独立的组件 如编辑器 编译器 调试器 以及各种各样为开发 Windows 环境下的 C C 程序而设计的工具 其中最重要的是一个名为 Developer Studio 的集成开 发环境 Developer Studio 把所有的 Visual C 工具结合在一起 集成为一个由窗口 对话框 菜 单 工具栏 快捷键及宏组成的和谐系统 通过该集成环境 程序员可以观察和控制整个开发进 程 图 A 1 显示了一个典型的 Developer Studio 主窗口 它分为几个部分 窗口顶部是菜单和工具 栏 左面的一个子窗口是工作区窗口 工作区的右面是编辑子窗口 最下面是输出子窗口 值得 注意的是 上述各种部件 包括子窗口 菜单栏和工具栏的位置不是一成不变的 可以根据个人 的喜好重新安排 图图 A 1 典型的典型的 Developer Studio 窗口窗口 1 菜单和工具栏 Developer Studio 中有一个 Menu Bar 菜单栏 通常停靠在开发环境窗口的顶部 其中的菜 单项有 File 文件处理 Edit 编辑功能 View 查看 Insert 插入 Project 项目管理 Built 编译 Tools 工具 Window 窗口 和 Help 帮助 等 分别对应一个下拉子菜单 除菜单栏外 开发环境中还有几个工具栏 一般均放在开发环境的顶部 菜单栏的下方 如 Standard 标准工具栏 用于文件管理 编辑和查看等 Wizard Bar 向导工具栏 和 Build MiniBar 建立工具栏 用于编译 连接等 工具栏上有常用命令的图标 一般来说 工具栏上 的命令在菜单中均有对应选项 但工具栏使用更方便 只要用鼠标左键点击工具栏中的相应图标 即可调用相应的功能 开发环境的各种菜单栏和工具栏均为停靠式 可以用鼠标拖动改变它们的位置 除此之外 Developer Studio 的所有部分几乎都可响应鼠标右键单击而弹出一个上下文相关菜单 甚至当 Developer Studio 没有打开窗口时 在空白区右击鼠标也会弹出一个菜单 其中含有使窗口可见和 调整工具栏是否可见的命令 在工具栏上除标题栏外的任何地方右击鼠标 同样可以弹出菜单 在使用集成环境工作时试一试鼠标右键 还会发现许多其他的快捷方式 2 Developer Studio 窗口 除了各种对话框外 Developer Studio 显示两种类型的窗口 即文档窗口和停靠窗口 文档窗 口是一般的带边框子窗口 其中含有源代码文本或图形文档 Window 子菜单中列出了在屏幕上以 平铺方式还是以层叠方式显示文档窗口的命令 所有其他的 Developer Studio 窗口 包括工具栏和 菜单栏 都是停靠式窗口 开发环境有两个主要的停靠窗口 Workspace 工作区 窗口和 Output 输出 窗口 另外还有一个 Debugger 调试器 停靠窗口 只在调试过程中显示 图图 A 2 新建一个项目新建一个项目 停靠窗口可以固定在 Developer Studio 用户区的顶端 底端或侧面 或者浮动在屏幕上任何地 方 停靠窗口 不论是浮动着的或是固定着的 总是出现在文档窗口的上面 这样 就保证了当 焦点从一个窗口移到另一个时 浮动的工具栏一直都是可见的 但这也意味着 文档窗口偶尔会 看起来像消失了似的 例如 如果正在文本编辑器中编辑源代码 此时打开一个占据整个 Developer Studio 用户区的停靠窗口 源代码文档就会消失 它隐藏在新窗口之下 解决方法是要 么关了覆盖的窗口 要么把它拖到不挡眼的地方去 3 菜单选项 快捷键和工具栏 Developer Studio 的许多功能都有不只一种调用方法 例如 执行一个编译 连接成功的可执 行文件 既可通过选择菜单选项 Build Execute exe 完成 也可以直接使用快捷键 Ctrl F5 还可以 用鼠标点击 Build MiniBar 编译工具栏 上的相应图标来完成 一般来说 越是常用的功能 可 以调用的方法越多 越方便 4 用 Developer Studio 编写和调试简单 C 程序 在 Visual C 中 C 的程序是存放到以后缀名为 CPP 的文件中 系统是通过 Projects 工程 项目 来管理这些文件的 所以要编写和运行 C 程序 首先必须建立一个 Projects 下面以一个简单的例子来说明如何在 Visual 集成开发环境编写和调试简单 C 程序的步骤 1 首先运行并打开 Developer Studio 系统 选择菜单选项 File New 中的 Projects 选项卡 从卡中选择 Win32 Console Application Win32 控制台应用程序 2 为应用项目取一个名字 填写在选项卡右上方的 Project Name 项目名称 处 并检查 下面的 Location 位置 中列出的路径是否正确 注意使下面的单选框选择 Create New Workspace 即要建立新工作区 然后按下 OK 按钮 如图 A 2 3 这时会出现 Application Wizard 应用程序生成向导 提问要生成的项目类型 选择 An Empty Project 空项目 按下 Finish 结束 键 会弹出一个窗口 显示新项目的有关信息 检 查无误后按 OK 按钮 如图 A 3 及 A 4 图图 A 3 确定项目类型确定项目类型 图图 A 4 项目相关信息项目相关信息 4 这时屏上会显示一个空项目 并生成一个工作区文件 后缀为 DSW 再次选择 File 菜 单的 New 选项 并选择 Files 选项卡 从卡中选择 C Source File C 源程序 5 为程序取一个名字 可与项目名相同 也可以不同 填写在选项卡右边的 File 处 然后 按下 OK 按钮 如图 A 5 图图 A 5 建立文件建立文件 6 这时开发环境右侧的文件编辑窗口中出现了一个空文件 在此可以键入源程序代码 如 图 A 6 7 程序输入后 应仔细检查一遍 然后就可以编译了 8 选择菜单选项 Build Compile gravitation cpp 其中 gravitation 为文件名 编译源程序 稍候片刻 会在 Output 窗口 通常在屏幕下方 中显示编译结果 如出错信息等 编译错误的处 理在下一节介绍 如果程序正确 编译结果会生成一个目标文件 后缀为 OBJ 9 目标文件还需通过连接才能生成可执行文件 选择菜单选项 Build Build gravitation exe 连接目标文件 结果显示在 Output 窗口中 连接的结果为可执行文件 后缀为 exe 以上两步也可以并为一步 即直接使用菜单选项 Build Build gravitation exe 图图 A 6 代码的编辑界面代码的编辑界面 生成的可执行文件可以单独运行 也可以在开发环境中直接运行 后一种方法在程序需要反 复调试时更加方便 在集成开发环境中直接运行程序的方法是选用菜单选项 Build Excute exe 程 序运行结果如图 A 7 图图 A 7 程序运行结果程序运行结果 A 2 Visual C 帮助功能帮助功能 MSDN Microsoft Developer Network 是使用 Microsoft 开发工具或是以 Windows 和 Internet 为开发平台的开发人员的基本参考资料 通过 MSDN 所提供的 Help 资料 可以对 Visuan C 和 Windows 的工作机制有更全面的了解 可以帮助解决开发者遇到的大多数问题 由于 MSDN 库为包括 Visual C 在内的所有的 Visual studio 6 0 开发环境工具提供在线帮助 所以它在系统中作为一个应用程序独立运行 并没有同任何单个开发环境结合在一起 要从 Visual C 中访问 MSDN 一种方法是从 Visual C 的 Help 菜单中选择 Contents Search 或 Index 命令 另一种方法是在 Visual C 开发环境中直接按下 F1 键 系统都会自动运行 MSDN 帮助程序 MSDN 界面分为三个窗格 顶端的窗格包含有工具栏 左侧的窗格包含有各种信息定位方法 通过单击列表中的主题 即可浏览或查找所需的各种信息 右侧的窗格则显示所选择的主题的具 体内容 这些内容是以超文本形式存在的 其中的相关内容可以通过超文本链接连接到其他的相 关主题 图图 A 8 MSDN 界面界面 左边窗口中有四个选项卡 目录 索引 搜索和书签 用于提供四种不同的在线帮助浏览方 式 1 目录 单击目录选项卡可浏览主题的标题 该目录是依照标题和副标题的排列方式形成 一个包含了 MSDN 中所有可用信息的可扩充目录表 双击列表中的标题 就可在 MSDN 窗口的 右栏中打开该文章 2 索引 单击索引选项卡可查看索引项的列表 然后可通过该栏左边的滚动条翻阅整个索 引列表 也可通过在对话框顶部的编辑框中键人关键字来完成查找功能 找到所要的索引条目后 双击 如果该条目仅对应一篇文章 MSDN 就会立刻在其窗口右栏显示其内容 否则会出现已找 到的主题对话框 其中列出了该条目可能指向的所有文章 这时可通过双击列表中所需要主题 打开相应的一篇文章 3 搜索 单击搜索选项卡可查找到包含在某个主题中的所有词组或短语 它是一个全文本 搜索引擎 允许寻找包含指定词或短语的主题 和 MSDN 的索引选项比起来 全文本搜索所能覆 盖范围更宽 它可以提供更多的文章以供选择 4 书签 单击书签选项卡可创建或访问书签的列表 用户只需简单地标记书签中的某些主 题 即可重新访问它们 A 3 Developer Studio 文本编辑器文本编辑器 Developer Studio 提供了一个优秀的程序文本编辑器 它使应用程序的编辑修改和调试工作混 为一体 非常方便 该文本编辑器不仅可编辑程序文本 还可编辑一般的文本文件和 HTML Page 启动文本编辑器非常简单 只要建立一个新文本文件 或打开一个已存在的文本文件 文本 编辑器就会自动出现 在文本编辑器中 用一闪烁的短竖线表示编辑位置 通过键盘输入的文字在此位置插入文本 用鼠标左键点击文本中的某个字符可以改变编辑位置 文本编辑器的基本操作包括 光标向后移动一个字符 光标向前移动一个字符 光标向上移动一行 光标向下移动一行 Home 光标移动到行首 End 光标移动到行尾 Ctrl Home 光标移动到文件头 Ctrl End 光标移动到文件尾 PgUp 光标向上滚动一屏 PgDn 光标向下滚动一屏 Ctrl Y 删除行 Del 删除光标右边字符 Backspace 删除光标左边字符 Ins 插入 改写方式切换 Developer Studio 的 Edit 子菜单还提供了一批高级编辑功能 大致可分为以下几类 1 Undo 和 Redo 用于反悔对文本文件所做的修改 2 剪贴 Cut 复制 Copy 粘贴 Paste 和删除 Delete 3 查找 Find 和替换 Replace 4 书签 5 高级选项 6 断点设置 7 编程指导信息 A 4 Developer Studio 文件处理功能文件处理功能 Developer Studio 提供了很完整的文件处理功能 可处理程序文本文件 项目文件 WORD 文 档和 EXCEL 文档等 Developer Studio 的 File 子菜单共有 14 项 分为 6 组 组与组之间用横线隔开 第 1 组用于建立 打开和关闭文件处理的对象 包括项目 文件 工作区和其他文档 1 建立新对象 New 快捷键为 CTRL N 选择该菜单项 可打开一个有若干卡片的 对话框 各卡片的内容分别为 项目 Projects 用于建立项目 项目即要开发的应用程序 Developer Studio 可用于开发各 种类型的应用程序 如控制台应用程序 Win32 Console Application 32 位 Windows 应用程序 Win32 Application 和 MFC 应用向导程序 MFC AppWizard 等 对于不同类型的项目 建立 的具体文件也不同 文件 Files 用于建立各种文件 包括源程序文件 Source File 文件名后缀为 cpp 头 文件 Header File 文件名后缀为 h 文本文件 Text File 文件名后缀为 txt 位图文件 Bitmap File 文件名后缀为 bmp 等 工作区 Workspaces 每个正在开发的项目要占用一个工作区 一般来说 在建立项目的 同时即为其建立了工作区 但也可用本选项建立一个空的工作区 其他文档 Other Documents 用于建立一些文档文件 如 MS Excel 工作表 MS Excel 图 表 MS PowerPoint 演示文稿和 MS Word 排版文档等 2 打开已有对象 Open 快捷键为 CTRL O 用于打开一个已存在的项目 文件或文 档 选择该菜单项 会弹出一个文件路径对话框 用于确定要打开的内容 3 关闭文件 Close 用于关闭当前打开并激活的文件 第 2 组用于处理工作区 包括 1 打开工作区 Open Workspace 用于一个已存在的工作区 工作区的有关参数 包 括应用程序的结构体系 特别是其类 资源 文件和帮助信息等的参数 存放在后缀名为 dsw 和 mdp 的文件中 2 保存工作区 Save Workspace 用于保存当前打开的工作区文件 3 关闭工作区 Close Workspace 用于关闭当前打开的工作区文件 第 3 组用于处理当前文件 包括 1 保存文件 Save 快捷键为 CTRL S 用于保存当前正在使用的文件 2 另存文件 Save As 将当前文件换一个名字保存 原来的文件内容不变 3 保存所有文件 Save All 保存当前打开的所有文件 第 4 组用于打印当前文件 包括 1 页面设置 Page Setup 设置打印页面格式 为打印当前文件作准备 2 打印当前文件 Print 快捷键为 CTRL P 用于打印当前文件 第 5 组用于快速打开或切换文件和工作区 包括 1 最近使用过的文件 Recent Files 用于直接打开最近几次在 Developer Studio 中使用 过的文件 可在弹出的下级菜单中直接选取 2 最近使用过的工作区 Recent Workspaces 用于直接打开最近几次在 Developer Studio 中打开过的工作区 可在弹出的下级菜单中直接选取 最后 1 组只有一个菜单项 1 退出 Developer Studio Exit 选择该菜单项可以关闭当前打开的所有对象 包括项目 工作区和文件等 退出 Developer Studio 返回 Windows 操作系统界面 A 5 Visual C 程序的编译 连接和运行程序的编译 连接和运行 用于编译 连接和运行应用程序的功能集中在创建 Build 子菜单中 但其中多数功能也可 通过快捷键和工具条调用 Developer Studio 的 Build 子菜单共有 11 项 分为 4 组 组与组之间用横线隔开 第 1 组包括编译 连接等功能 编译当前项目 Compile 快捷键为 Ctrl F7 用于将源程序编译为目标代码 编译结果及编 译错误信息在输出窗口 Output 显示 编译 连接当前项目 Build 快捷键为 F7 在对当前项目的源程序编译之后 还进行连接 Link 操作 即将目标代码与系统或用户类库连接并生成可执行的程序 或动态连接库 DLL 等 重新编译 连接当前项目 Rebuild All 功能与基本相同 只是无论是否修改过 对 所有文件都重新进行编译和连接工作 以批处理方式编译 连接当前项目 Batch Build 功能与基本相同 只是同时产生调 试版和发行版执行程序 清除临时文件 Clean 用于清除上一次编译 连接时产生的临时文件和输出文件 以整理 程序目录 第 2 组用于调试程序 包括开始调试 Start Debug 和远程调试链接 Debugger Remote Connect 第 3 组用于执行当前项目的可执行程序 Execute 快捷键为 Ctrl F5 第 4 组用于设置编译和连接工作的参数 包括 设置项目的版本类型 Set Active Configuration Developer Studio 生成的可执行文件有两 种版本 一种是调试版本 Win32 Debug 内含调试代码 体积稍大 主要在编程调试过程中使 用 另一种是发放版本 Win32 Release 其中不包含调试代码 体积小 用于在程序调试结束后 提交用户 管理项目版本 Configuration 用于管理项目的调试版本和发放版本 Profile 设置 Profile 程序和显示 Profile 数据 A 6 查看和修改编译 连接错误查看和修改编译 连接错误 刚编写好的程序含有错误是正常的 即使是熟练的专业程序员也很难一次就编写出完全没有 错误的源程序来 实际上 重要的不是程序中是否有错误 而是怎样将这些错误找出来并改正之 一般来说 一段源程序从输入编辑到通过编译 往往要重复若干次编译 修改 再编译的过程 如果在编译的过程中发现了错误 则进入编辑查错状态 这时在屏幕下方的 Output 窗口中会 显示出错误的类型 错误发生的位置以及错误的原因 错误信息的格式为 行 错误有两种 一种是 Error 表示这是一个严重错误 非改不可 另一种是 Warning 表示源 程序这里有可能是错误的 也有可能不是错误 编译程序自己也拿不准 一般来说 如果只出现 警告信息 还是可以继续连接 运行程序 建议在出现编译警告时最好还是仔细检查一下 设法 消除引起警告的原因 错误发生的位置包括源程序的路径和文件名以及错误所在行 必需说明的是 编译程序的 智力 并不十分高 虽然能够查出错误 但对错误的说明可能并不十分准确 而且一个实际错误 往往会引出若干条错误说明 使人不容易摸清到底错在什么地方 错误的原因其实可能很简单 例如少写了一个括号 分号或拼错了一个单词 都可能引起一连串的错误提示 真正的错误之处 也可能在此之前的某个语句 而且指出的错误条数可能偏多 常常是由于一处出错而引发了一系 列错误提示信息 用鼠标双击一条错误信息可使文本编辑器作出反应 其左框上显示一个箭头指出对应的出错 语句 以便修改源程序 在连接阶段也可能出现一些错误提示 与编译错误提示信息不同的是连接错误不指出错误发 生的详细位置 这是因为连接的对象是目标程序 和源程序格式有很大差别 不易确定错误的准 确位置 连接阶段出现的错误一般比较少 大多数是因为在程序中调用了某个函数 而连接程序 却找不到该函数的定义 这时最有可能的是函数名字拼写错误 另外 如果程序的规模较大 需 要分为若干个源程序文件分别编译然后连接 则也可能出现全局变量重复定义或找不到等错误现 象 在找到连接错误的原因并改正以后 一定要重新编译后才能再次连接 否则 虽然源程序已 经修改 但进行连接的目标程序还是以前有错误的目标程序 再次连接仍然会产生同样的错误 A 7 运行错误的判断与调试运行错误的判断与调试 通常所说的运行错误有两种 一种是逻辑错误 即程序的实际运行结果和编程者对程序结果的 期望不符 另一种仍是程序设计上的错误 但是躲过了编译程序和连接程序的检查 通常表现为突 然死机 自行热启动或者输出信息混乱 相对于编译和连接错误来说 运行错误的查找和判断更为困难 编译和连接错误可以由编译 程序和连接程序检查 而运行错误就不同了 很少或根本没有提示信息 只能靠程序员的经验来判 断错误的性质和位置 下面简单地介绍一些常见运行错误的调试方法 逻辑错误 一种逻辑错误是由于在设计程序的算法时考虑欠周引起的 例如对边界和极端条件 未作处理等 例如以下循环 while count count count 1 程序员的构思是进行 count 次循环 但是 如果 count 中原来的值为负数时 此循环就成了一 个 死循环 而导致无法停机 显然是错误的 但是编译程序无法查出这类错误 只有到了程序运行 之后才有可能发现 再如 在利用海伦公式计算三角型面积时 首先应该确认给出的三条边长确实 可以构成一个三角形 否则计算结果是没有意义的 而在编写求解一般实系数一元二次方程的程序 时 必须在程序中设计处理复根情况的程序段 以免对负数求平方根 另一种常见的逻辑错误是由于程序输入时的打字错误造成的 例如将判断条件中的 误输 入为 将相等判断 误输入为赋值号 等 含有这类错误的程序在运行时出现的现象多种多 样 而且通常很难与错误的原因联系起来 数组下标越界错误 即使用了并不存在的数组元素 例如有程序段 int a 5 for int i 1 i 5 i a i 0 由于 5 并不存在 而上述程序段试图将数据存放到一个并不存在的数组元素中 这会引起包 括死机在内的严重运行错误 类似错误还有指针和动态存储分配引起的一些运行错误 A 8 基本调试手段基本调试手段 程序的基本调试手段有以下几种 标准数据检验 程序跟踪 边界检查和简化循环次数等 标准数据检验标准数据检验 在程序编译 连接通过以后 就进入了运行调试阶段 运行调试的第一步就是 用若干组已知结果的标准数据对程序进行检验 标准数据的选择非常重要 一是要有代表性 接近 实际数据 二是要比较简洁 容易对其结果的正确性进行分析 另外 对重要的临界数据也必须进 行检验 程序跟踪程序跟踪 对于比较复杂的大型程序来说 上述标准数据检验一次就完全通过的可能性很小 通常程序中总是存在许多各种各样的错误 还需要对程序进行细致的调试工作 程序跟踪则是最重 要的调试手段 程序跟踪的基本原理是让程序一句一句地执行 通过观察和分析程序执行的过程 中数据和程序执行流程的变化来查找错误 就 Visual C 而言 程序跟踪可以采用两种方法 一种 是直接利用 Developer Studio 中的分步执行 断点设置 变量内容显示等功能对程序进行跟踪 这 种方法在后面的编程与调试部分介绍 另一种是传统的方法 通过在程序中直接设置断点 打印重 要变量内容等来掌握程序的运行情况 例如 可以在程序中的关键部位插入这样的代码段 调试代码段 cout 100 endl cout Variable count count x x sum sum endl getch 调试代码段结束 其中的变量可以根据程序的实际情况进行设计 使用 getch 函数的目的是要程序在执行到 这一行时暂时停下来 从而可以看清楚调试代码段所显示的信息 然后选择是否让程序继续执行 该函数的原型在头文件 conio h 中 如果到这一断点时尚未发现错误 则可以按下任何一个键让程 序继续运行到下一个断点 否则可以使用组合键 Ctrl Break 键来中断程序 再使用编辑器对程序进 行修改 在程序中的所有的问题都解决了之后 再将程序中所有的调试代码段统统删去 边界检查 在设计检查用的数据时 要重点检查边界和特殊情况 例如 对于循环 while count a b c 这样的程序时 为了突出测试该段程序对某组输入数据 如 a 1 b 2 c 3 的响应情况 同时避免每次输入数据的麻烦 可以利用注解号将上述程序段落改为 cin a b c a 1 b 2 c 3 这样在调试程序时就不必每次停下来等待输入数据了 可以直接使用步进 跟踪或设置断点 等手段调试这段程序 等到程序中的所有错误全部修正以后 再恢复被修改的内容 即注解中的 内容 即可 A 10 条件编译条件编译 条件编译是编译预处理命令的一种 用于对源程序的内容进行选择性编译 例如 在调试程 序期间 常常希望记录输出一些调试用的信息 而在调试完成后 就不再需要这些输出信息了 要 解决这个问题 一种办法是逐一从源程序中删去这些输出这些调试信息的程序段落 或者将这些 程序段落用注释标记括起来 显然这样很不方便 另一种方法就是使用编译预处理中的条件编译 命令 条件编译命令的格式为 if elif elif else endif 条件编译中所使用的条件只能是由常数构成的表达式 如果该常数表达式的值不为 0 就表示 条件成立 否则表示条件不成立 一般情况下 在 if 中都是使用由 define 指令产生的符号常数进 行测试 编译预处理命令的一个常见的用途是将调试代码插入应用程序中 程序员可以定义一个叫做 DEBUG 的符号常数 值可以定义为 1 或者 0 在程序中的任何地方 都可用以下方式插入调试信息 if DEBUG 1 endif 在开发程序时 将 DEBUG 定义为 1 则插入的调试代码被编译进目标程序 可输出帮助跟踪 错误的信息 一旦程序工作正常 就可将 DEBUG 重新定义为 0 后再次编译程序 即可从目标程序 中去掉调试代码 中还有两个和 if 类似的条件编译命令 ifdef 和 ifndef 例如 ifdef DEBUG 则只要定义了 DEBUG 无论将 DEBUG 定义为什么值 包括 0 甚至什么具体值也不是 define DEBUG 则上述条件成立 而在前面没有定义 DEBUG 时 ifndef DEBUG 成立 A 11 Developer Studio 的跟踪调试功能的跟踪调试功能 调试器是 Developer Studio 中最出色的部件之一 可以帮助找到在软件开发中可能遇到的几乎 每个错误 调试器的主要调试手段有设置断点 跟踪和观察 所谓断点 即程序中的某处 在调试时使 程序执行到断点处停下来 通过观察程序变量 表达式 调试输出信息 内存 寄存器和堆栈的 值来了解程序的运行情况 或进一步跟踪程序的运行 在当前编辑位置设置一个断点最直接的方式是使用快捷键 F9 或用鼠标点击 Build MiniBar 工 具条上的手形图标 断点用编辑窗口左边框上的大红圆点表示 非常醒目 取消一个断点的方法 类似 只要在有断点的语句上重新使用快捷键 F9 即可取消已设置的断点 如果已设置好了断点 则可通过子菜单 Build Start Debug 调用调试器 该子菜单有 4 个选项 分别为 A Go 快捷键为 F5 从当前语句开始执行程序 直到遇到一个断点或程序结束 用 Go 命令启动调试器时 从头开始执行程序 B Step Into 快捷键为 F11 单步执行每一程序行 遇到函数时进入函数体内单步执 行 C Run To Cursor 快捷键为 Ctrl F10 运行程序至当前编辑位置 D Attach To Process 将调试器与当前运行的其中某个进程联系起来 这样就可以跟踪 进入进程内部 就象调试项目工作区中当前打开的应用程序一样调试运行中的进程 当被调试的程序停在某个断点上时 编辑器左边框上的对应位置会出现一个黄色箭头指示被 中断的语句 此时 Developer Studio 的版面布置会一些发生变化 如菜单栏中以调试 Debug 菜 单项代替了建立 Build 菜单项并出现了一 Debug 工具栏 调试工具栏如图 A 9 所示 图图 A 9 Developer Studio 的的 Debug 工具栏工具栏 Debug 工具栏可分为 4 个区 第 1 2 两个区中是常用的调试命令 包括 1 Restart 快捷键 Ctrl Shift F5 终止当前的调试过程 重新开始执行程序 停在程 序的第 1 条语句处 2 Stop Debugging 快捷键 Shift F5 退出调试器 同时结束调试过程和程序运行过程 3 Break Execution 终止程序运行 进入调试状态 多用于终止一个进入死循环的程序 4 Apply Code Changes 快捷键 Alt F10 当源程序在调试过程中发生改变 重新进行 编译 5 Show Next Statement 快捷键 Alt Num 显示下一语句 6 Step Into 快捷键 F11 跟踪 如果是一语句 则单步执行 如果是一函数调用 则 跟踪到函数第一条可执行语句 7 Step Over 快捷键 F10 单步执行 如果是一语句 则单步执行 如果是一函数调用 将此函数一次执行完毕 运行到下一条可执行语句 8 Step Out 快捷键 Shift F11 从函数体内运行到外 即从当前位置运行到调用该函 数语句的下一条语句 9 Run To Cursor 快捷键 Ctrl F10 从当前位置运行到编辑光标 第 3 区有一个眼镜图标 Quick Watch 快捷键为 Shift F9 用于弹出一个对话框 观察当前 编辑位置的变量的值 第 4 区有 6 个图标 分别用于激活 6 个调试器窗口 1 观察窗口 Watch 用于观察指定变量或表达式的值 可任意添加要观察的变量或表达 式 并可用标签的形式 Watch1 Watch2 Watch3 等 增加多组观察对象 2 变量窗口 Variables 用于观察断点处或其附近的变量的当前值 Variables 有 3 个标签 Auto 标签显示变量和函数返回值 Locals 标签显示当前函数的局部变量 this 标签显示 this 指针 对象 3 寄存器窗口 Register 用于观察在当前运行点的寄存器的内容 4 内存窗口 Memory 用于观察指定内存地址内容 5 调用栈窗口 Call Stack 用于观察调用栈中还未返回的被调用函数列表 调用栈给出从 嵌套函数调用一直到断点位置的执行路径 6 汇编代码窗口 Disassmbly 用于显示被编译代码的汇编语言形式 A 12 如何在程序中使用如何在程序中使用 MFC 类库类库 如果要在程序中使用 CString CTime 和 CTimeSpan 等 MFC 类 要在程序首部加上文件包含 命令 include 此外 还需在 Developer Studio 的菜单选项 project Settings 的 General 选项卡设置 Microsoft Foundation Classes 项 可选项有三种 分别为 Not Using MFC 不使用 MFC Use MFC in a Shared DLL 以动态链接库方式用 MFC 和 Use MFC in a Static Library 以静态库方法使用 MFC 后两种选项均可使用 A 13 使用使用 FileView 标签标签 FileView 标签用于显示当前项目中各项目之间的包含关系和项目中包含的所有文件 扩展顶 层文件夹就可以显示项目的所有文件 如图 A 10 所示 图图 A 10 FileView 标签标签 FileView 的操作功能 1 定位 双击某个文件名或图标就可以打开相应的源程序编辑窗口 2 添加文件

温馨提示

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

评论

0/150

提交评论