编译原理实验总结报告

关键词: 课程

编译原理实验总结报告(共8篇)

篇1:编译原理实验总结报告

编译原理实验报告

报告完成日期 2018.5.30

一. 组内分工与贡献介绍

二. 系统功能概述;

我们使用了自动生成系统来完成我们的实验内容。我们设计的系统在完成了实验基本要求的前提下,进行了一部分的扩展。增加了声明变量类型、类型赋值判定和声明的变量被引用时作用域的判断。从而使得我们的实验结果呈现的更加清晰和易懂。

三. 分系统报告;

一、词法分析子系统

词法的正规式:

标识符

<字母>(<字母>|<数字字符>)* 十进制整数

0 |(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)* 八进制整数 0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)* 十六进制整数 0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)* 运算符和分隔符 +| * | / | > | < | = |(|)| <=|>=|==; 对于标识符和关键字: A5—〉 B5C5 B5—〉a | b |⋯⋯| y | z C5—〉(a | b |⋯⋯| y | z |0|1|2|3|4|5|6|7|8|9)C5|ε 综上正规文法为: S—〉I1|I2|I3|A4|A5 I1—〉0|A1 A1—〉B1C1|ε C1—〉E1D1|ε D1—〉E1C1|ε

E1—〉0|1|2|3|4|5|6|7|8|9 B1—〉1|2|3|4|5|6|7|8|9 I2—〉0A2 A2—〉0|B2 B2—〉C2D2 D2—〉F2E2|ε E2—〉F2D2|ε

C2—〉1|2|3|4|5|6|7 F2—〉0|1|2|3|4|5|6|7 I3—〉0xA3 A3—〉B3C3 B3—〉0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f C3—〉(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)|C3|ε

A4—〉+ |-| * | / | > | < | = |(|)| <=|>=|==; A5—〉 B5C5 B5—〉a | b |⋯⋯| y | z C5—〉(a | b |⋯⋯| y | z |0|1|2|3|4|5|6|7|8|9)C5|ε

状态图

流程图:

词法分析程序的主要数据结构与算法

考虑到报告的整洁性和整体观感,此处我们仅展示主要的程序代码和算法,具体的全部代码将在整体的压缩包中一并呈现

另外我们考虑到后续实验中,如果在bison语法树生成的时候推不出目标的产生式时,我们设计了报错提示,在这个词的位置出现错误提示,将记录切割出来的词在code.txt中保存,并记录他们的位置。

以下是我们的主要代码:

进制的识别:

结果展示:

二、语法分析子系统

根据选择的语法分析方法进行描述

我们使用了递归子程序发,并且对原有的产生式进行了改写,改写后的结果如下: P→LP1|L L→S

S→id=E|{P}|if C then S | if C then S

1else S2 | while C do S1 C→E1C’

C’→>E2|

E→int8E’| int10E’| int16E’| idE’|T E’→+T|-T||+TE’|-TE’

T→int8T’| int10T’| int16T’| idT’|F T’→*F|/F|*FT’|/FT’

F→(E)|int8|int10|int16|id

简化的语法图: S的语法图:

C的语法图:

E的语法图:

T的语法图:

F的语法图:

流程图:

语法分析子系统的主要数据结构与算法

我们采用了自动生成技术,同样在这里也是展示主要的核心功能代码,全部的代码展示在压缩包中:

我们在设计时,实现了产生式对应的字符串同时标识产生式定义的int值 辅助程序:

生成语法树的程序:

1.树节点:

2.创建新节点

3.创建实数类型新节点

4.创建标识符类型新节点

5.输出语法树 三、三地址码生成器

算法的基本思想:

我们增加了声明变量类型、类型赋值判定和声明的变量被引用时作用域的判断。从而使得我们的实验结果呈现的更加清晰和易懂。

在报错的时候,我们会呈现类型、作用域和赋值三种的问题的报错信息。

流程图:

算法展示:

四、实验体会

这次实验其实总的来说是让我们更加清晰的理解到了我们所学的内容。有时候我们上课听讲,课下复习写作业的时候,其实看似掌握了所学内容,但实际上并没有亲身体会的操作很难让我们深刻的理解其中的相关意义。通过这次实验,我们能够从根源处了解到了我们所学的内容,并且基于我们理解之后的输出。比如词法分析不能采用空格来区分单词,因为存在加减乘除等运算符和分隔符,使用空格来区分可能会造成错误的分解。又比如我们再在程序设计中,常常体会到效率的重要性。影响词法分析的效率的主要因素是各个状态的分支如何规划。如果每个进来的单词都能在最短的时间和最少的匹配次数内找到其入口,则效率将得到很大程度上的提高。所以由此我们产生了声明变量类型、赋值和作用域的想法,将其放在最后来进行判断,这样可以提高整体的执行效率。

另外,这次小组成员彼此不在一个班级,这样从某一方面来说,也加强了我们互相快速熟识并团结协作的能力,有了这种体验,我想我们在今后的生活中,面对这种情况的时候,将会变得更加有经验。

五、源程序

词法分析器: 输入结果:

输出结果:

语义分析结果:

输入:

第二组数据的输入:

输出:

三地址码的输入:

第二组数据的输入:

输出:

篇2:编译原理实验总结报告

学 生 姓 名:

学 号:

班 级:同 组 人 :

(姓名、班级、学号)

大连理工大学

Dalian University of Technology

1.3 论文正文格式 ........................................................................................................... 2

1.4 章节标题格式 ........................................................................................................... 2

1.5 各章之间的分隔符设置 ........................................................................................... 3

1.6 正文中的编号 ........................................................................................................... 3

2 词法分析程序的实现 .......................................................................................................... 4

2.1 图的格式说明 ........................................................................................................... 4

2.1.1 图的格式示例 ................................................................................................ 4

2.1.2 图的格式描述 ................................................................................................ 4

2.2 表的格式说明 ........................................................................................................... 5

2.2.1 表的格式示例 ................................................................................................ 5

2.2.2 表的格式描述 ................................................................................................ 6

2.3 公式的格式说明 ....................................................................................................... 7

2.3.1 公式的格式示例 ............................................................................................ 7

2.3.2 公式的格式描述 ............................................................................................ 7

2.4 参考文献的格式说明 ............................................................................................... 7

2.4.1 参考文献在正文中引用的示例 .................................................................... 7

2.4.2 参考文献在正文中引用的书写格式 ............................................................ 7

2.4.3 参考文献的书写格式 .................................................................................... 7

2.4.4 参考文献的书写格式示例 ............................................................................ 8

2.5 量和单位的使用 ....................................................................................................... 8

2.5.1 使用方法 ........................................................................................................ 8

2.5.2 中华人民共和国法定计量单位 .................................................................... 8

2.6 规范表达注意事项 ................................................................................................. 12

2.6.1 名词术语 ...................................................................................................... 12

2.6.2 数字 .............................................................................................................. 12

2.6.3 外文字母 ...................................................................................................... 12

2.6.4 量和单位 ...................................................................................................... 13

2.6.5 标点符号 ...................................................................................................... 13

篇3:提高编译原理实验效果研究

编译原理是计算机相关专业的一门核心课程。通过课程的学习, 使学生理解编译系统的结构、工作流程以及编译程序各组成部分的设计原理, 获得分析、设计和实现编译系统的初步能力。通过学习编译的理论和方法, 提高学生对程序设计语言、操作系统、计算机原理和体系结构等课程知识的综合理解。更重要的是编译原理这门课程能够非常好地反映计算思维的内容, 对培养学生的计算思维非常有益。

编译原理是一门原理性课程, 专业性较强, 内容较为抽象难懂, 涉及到的基础知识比较多, 如形式语言与自动机、 数据结构、离散数学、编程语言等, 使得学生学习的畏难情绪比较严重。同时, 编译原理课程也是一门需要理论和实践相结合的课程。单纯靠课堂讲解理论知识是不够的, 必须借助于实验来加深和巩固对理论知识的理解。通过实验, 可以提高学生的编程能力, 培养学生分析问题和解决问题的能力, 也可以让他们学到很多程序调试技巧和设计大型程序一般的原则, 如模块接口的协调, 数据结构的合理选择等知识。但是, 昆明学院编译原理的实验课时 (8个学时) 较少, 教学重理论轻实验。实验只能用Lex和Yacc等自动生成工具来完成词法分析和语法分析, 或者让学生简单编写一个词法分析程序。学生的知识是离散的, 达不到理想的教学效果。

针对这些问题, 笔者进行了一些提高编译原理实验效果的探索。

2实验教学的改革措施

为了提高教学效果, 对编译原理的实验教学采取了一些新的尝试。

2.1实验学时

在试点班把实验学时增加到36学时。因为实验的最终目标是制作完成一个编译器原型或核心部分, 这是一个比较难的任务, 必须在掌握理论的前提下, 应用模块设计、 算法、编程、程序调试等多方面知识才能完成, 所以学时量一定要足够。

2.2实验内容

对于实验内容也进行了如下调整。

2.2.1实验语言的选择

采用Pascal语言作为样本, 对其进行简化。字符集包括大小写字母、数字和运算符、分隔符等, 有整型、实型、字符型等多种数据类型, 有变量声明和常量说明, 包括顺序、 选择和循环三种语句结构。涉及下列语法成分:数据类型、 算术表达式、布尔表达式、说明语句、赋值语句、控制流语句 (if语句、while语句、for语句) 以及复合语句。这样做的好处在于既让简化的语言具有一般高级语言的共同特征, 使得编译器的制作不是一般性, 又适当降低了实验难度, 避免学生因为实验太难而失去兴趣。

2.2.2实验内容的调整

实验一、词法分析器的设计

实验内容:手工编写词法分析程序。

实验要求:从左到右逐个字符地对源程序进行扫描, 删除空白符 (空格、回车符和制表符) , 按照规则拼单词识别出各个具有独立意义的单词, 存放到数组中。能对源程序进行分析, 列表打印源程序, 打印出每个单词。若源程序有错误, 则定位错误, 并指出错误原因。

实验二、语法分析器的设计

实验内容:根据语言文法建立LR分析表, 编写语法分析程序, 读取它从左到右依次对词法分析得到的结果数组, 判断是否符合语法规则, 并给出语法分析过程和结果。

实验要求:用LR分析方法编写一个语法分析程序, 使之与词法分析器结合, 能够根据语言的上下文无关文法, 识别输入的单词序列是否符合文法。能对任何TPL语言源程序进行分析。

实验三、语义分析

实验内容:在语法分析程序中添加语义分析功能, 审查源程序是否有语义错误, 若程序语义正确, 则语义分析结果生成四元式代码, 否则给出错误位置和原因。

实验要求:能对任何源程序的语法分析结果进行语义分析, 输出语义分析过程。若程序语义正确, 则语义分析结果生成四元式代码, 否则给出错误位置和原因。

虽然编译原理的实验分成了三个, 但三个实验是紧密联系的, 最终制作完成一个小型编译器。

2.3教学方法

2.3.1结合编译器实例教学

在开始实验前几周, 先给学生一个Toy L语言的编译器范例, 里面包括Toy L语言文本, 介绍语言的特点、组成、 EBNF描述的形式体系、语法规则、语义以及程序结构的规定, 还包括Toy L语言的编译器设计说明书以及编译器源程序。 让学生在课余时间阅读Toy L语言文本和编译器设计说明书, 了解编译器的组成部分, 编写用例测试编译器的运行结果。 这样可以降低学习难度, 增强学生的自信心, 为学好这门课排除了心理障碍, 也可以加深对理论知识的理解。在实验开始时, 选择Pascal语言的子集作为实践课程的分析对象, 要求写出这种语言的编译程序。Pascal语言的子集在组成、语法规则和程序结构上与范例有所不同, 这就要求学生不能完全照抄范例的代码, 必须理解原理性的知识才能编写出新的代码。

2.3.2启发式教学

在教学过程中, 采用启发式教学方法。提出具有启发意义的问题, 学生主动思考解决问题的方法, 充分调动学生的积极性。例如, 在讲词法分析时, 主要内容包括词法分析程序的功能, 描述单词符号的工具, 用有穷自动机来识别正规文法所定义的语言和正规式等内容。理论学习完后如何实现?这对学生是一个考验。首先根据词法规则写出正规文法, 然后将正规文法转换为状态图, 每个规则转化为一个图, 合并后成为一个完整的状态图。这时启发学生:写程序之前要先做设计, 用什么工具?是流程图。使用图形表示算法的思路是一种极好的方法, 因为图形生动形象、易于理解。在写词法分析器时, 状态图是不是也可以看成是一种流程图?根据这个整体DFA状态转换图, 就可以用直接编写出识别该语言所有单词的词法分析程序。

2.3.3分层次教学

对于学有余力的同学, 除了完成基本实验内容以外, 在实验难度和程序质量上有更高要求。例如在语法分析实验中, 语法规则包含赋值语句、控制语句的源程序的语法, TPL语言对应的文法产生式有29条, 其中赋值语句对应6条产生式, 布尔表达式对应7条产生式, 控制结构对应16条产生式。为了方便构造LR分析表, 把所有产生式进行简化, 即把超过1个长度的终结符和非终结符均简化为1个长度。对于一般同学的要求为, 可以在控制结构中的while循环语句产生式和for循环语句产生式中各选一种来进行简化并构造DFA; 要求学有余力的同学, 对两种循环语句的产生式都要进行简化并构造DFA。虽然只是加了一种循环语句, 但是工作量大了很多。另外, 要求部分学生的编译器能准确报告程序出错位置、出错种类和建议修改方式等。分层次教学充分考虑到学生的发展差异, 能够因材施教, 有利于学生的个性发展。

3结语

实验是编译原理课程非常重要的组成部分, 是理论联系实际的桥梁。提高编译原理实验课程的教学质量, 需要不断探索, 从实验课时、内容及教学方法等方面进行不断思考和总结, 从而提升学生的专业综合能力, 激发学生的学习兴趣。

参考文献

[1]吕映芝, 张素琴, 蒋维杜.编译原理 (第2版) [M].北京:清华大学出版社, 2013.

[2]刘坤起, 李慧琪, 孙长圣, 等.“编译程序设计原理”课程教学之思考[J].工业与信息化教育, 2013 (12) :64-67.

篇4:编译原理实验总结报告

1.实验名称:一个简单语言词法分析器设计

2.实验内容

(1)阅读并理解教材第三章词法分析p42“简单语言”词法分析构造实例

(2)完善P45给出的“简单语言”词法分析程序,使得该程序能够在计算机上运行,完

全达到词法分析器的设计基本要求:

① 读入“简单语言”源程序

②滤掉“简单语言”源程序中的“空白”字符

③滤掉“简单语言”源程序中的“注释”字符

④能够识别出“简单语言”源程序中的合法“单词”并输出识别出的一个个“单词”符号序列。

⑤ 识别出的一个个“单词”符号要求为二元组形式: 指出单词类别属性,标识符自身值,常数值.3.提交实验报告

 “简单语言”词法分析程序“源程序”文件

 “简单语言”词法分析程序“源程序”可执行文件

篇5:编译原理期末总结复习

1.什么是编译程序?

答:编译程序是一种将高级语言程序(源程序)翻译成低级语言(目标程序)的程序 。

将高级程序设计语言程序翻译成逻辑上等价的低级语言(汇编语言,机器语言)程序的翻译程序。

2.请写出文法的形式定义?

答:一个文法G抽象地表示为四元组 G=(Vn,Vt,P,S)

– 其中Vn表示非终结符号

– Vt表示终结符号,Vn∪Vt=V(字母表),Vn∩Vt=φ

– S是开始符号,

– P是产生式,形如:α→β(α∈V+且至少含有一个非终结符号,β∈V*)

3.语法分析阶段的功能是什么?

答:在词法分析的基础上,根据语言的语法规则,将单词符号串分解成各类语法短语(例:

程序、语句、表达式)。确定整个输入串是否构成语法上正确的程序。

4.局部优化有哪些常用的技术?

答:优化技术1—删除公共子表达式

优化技术2—复写传播

优化技术3—删除无用代码

优化技术4—对程序进行代数恒等变换(降低运算强度)

优化技术5—代码外提

优化技术6—强度削弱

优化技术7—删除归纳变量

优化技术简介——对程序进行代数恒等变换(代数简化)

优化技术简介——对程序进行代数恒等变换(合并已知量)

5.编译过程分哪几个阶段?

答:逻辑上分五个阶段:词法分析、语法分析、语义分析与中间代码生成、代码优化、目

标代码生成。每个阶段把源程序从一种表示变换成另一种表示。

6. 什么是文法?

答:文法是描述语言的语法结构的形式规则。是一种工具,它可用于严格定义句子的结构;

用有穷的规则刻划无穷的集合;文法是被用来精确而无歧义地描述语言的句子的构成方式;文法描述语言的时候不考虑语言的含义。

7. 语义分析阶段的功能是什么?

答:对语法分析所识别出的各类语法范畴分析其含义,进行初步的翻译(翻译成中间代码);

并对静态语义进行审查。

8.代码优化须遵循哪些原则?

答:等价原则:不改变运行结果

有效原则:优化后时间更短,占用空间更少

合算原则:应用较低的代价取得较好的优化效果

9.词法分析阶段的功能是什么?

答:

逐个读入源程序字符并按照构词规则切分成一系列单词

任务:读入源程序,输出单词符号

— 滤掉空格,跳过注释、换行符

— 追踪换行标志,指出源程序出错的行列位置

— 宏展开,……

10.什么是符号表?

答:符号表在编译程序工作的过程中需要不断收集、记录和使用源程序中一些语法符号

的类型和特征等相关信息。这些信息一般以表格形式存储于系统中。如常数表、变量名表、数组名表、过程名表、标号表等等,统称为符号表。对于符号表组织、构造和管理方法的好坏会直接影响编译系统的运行效率。

11.什么是属性文法?

答:是在上下文无关文法的基础上,为每个文法符号(含终结符和非终结符)配备若干个属

性值,对文法的每个产生式都配备了一组属性计算规则(称为语义规则)。在语法分析过程中,完成语义规则所描述的动作,从而实现语义处理。

12.什么是基本块

答:是指程序中一顺序执行的语句序列,其中只有一个入口语句和一个出口语句,入口

是其第一个语句,出口是其最后一个语句。

13.代码优化阶段的功能是什么?

答:对已产生的中间代码进行加工变换,使生成的目标代码更为高效(时间和空间)。

14.文法分哪几类?

答:文法有四种:设有G=(Vn,Vt,P,S),不同类型的文法只是对产生式的要求不同:

0型文法(短文文法): G的每个产生式αβ满足:α∈V+且α中至少含有一个非终结符,β∈V*

1型文法(上下文有关文法):如果G的每个产生式αβ均满足|β|>=|α|,仅当Sε除外,但S不得出现在任何产生式的右部

2型文法(上下文无关文法):G的每个产生式为Aβ, A是一非终结符,β∈V*

3型文法(正规文法):G的每个产生式的形式都是:AαB或Aα,其中A,B是非终结符,α是终结符串。(右线性文法)。

15.循环优化常用的技术有哪些?

答:代码外提;强度削弱;删除归纳变量。

16.什么是算符优先文法?

答:算符文法G的任何终结符a,b之间要么没有优先关系,若有优先关系,

至多有

中的一种成立,则G为一算符优先文法。

二、计算题

(一)推导、最左推导、最右推导和语法树,复习表达式文法及相关例题。

1. 表达式的推导

例: G = ({E}, {i, +, *, (, ) } , P , E)

P: E E+E | E*E | (E) | i

答:表达式(i)和(i+i)*i的推导:

E (E) (i)

E E*E (E)*E (E + E)*E (i + E)*E (i + i)*E (i + i)*i

E E*E E*i (E)* i (E + E)*i (E+ i)*i (i + i)*i

(i+i)*i的最左推导过程:

E E*E (E)*E (E + E)*E (i + E)*E (i + i)*E (i + i)*i

(i+i)*i的最右推导过程:

E E*E E*i (E + E)*i (E+ i)*i (i + i)*i

2.语法树

例:对文法G = ({E}, {i, +, *, (, ) } , P , E)

P: E E + E | E * E | ( E ) | i

答: 句子(i+i)*i 的语法树:

例: G = ({E}, {i, +, *, (, ) } , P , E)

P: E E + E | E * E | ( E ) | i

答:句子 ( i * i + i)的语法树:

(1) E (E) (E + E) (E * E + E) (i * E + E) (i *i + i)

(二)给定语言求文法

(三)逆波兰式

篇6:编译原理知识点总结

编译原理是大学计算机专业的必修科目,也是计算机的基础知识,学好编译原理,有助于更好的进行编程的操作,下面是编译原理知识点总结,一起来看看吧!

编译原理知识点总结

一 编译器

简单讲,编译器就是将“高级语言”翻译为“机器语言(低级语言)”的程序。一个现代编译器的主要工作流程:源代码 (source code) → 预处理器

(preprocessor) → 编译器 (compiler) → 汇编程序 (assembler) → 目标代码 (object code) → 链接器(Linker) → 可执行程序 (executables)

二 工作原理

编译是从源代码(通常为高阶语言)到能直接被计算机或虚拟机执行的目标代码(通常为低阶语言或机器语言)的翻译过程。然而,也存在从低阶语言到高阶语言的编译器,这类编译器中用来从由高阶语言生成的低阶语言代码重新生成高阶语言代码的又被叫做反编译器。

也有从一种高阶语言生成另一种高阶语言的编译器,或者生成一种需要进一步处理的的中间代码的编译器(又叫级联)。

典型的编译器输出是由包含入口点的名字和地址, 以及外部调用(到不在这个目标文件中的函数调用)的机器代码所组成的目标文件。一组目标文件,不必是同一编译器产生,但使用的编译器必需采用同样的输出格式,可以链接在一起并生成可以由用户直接执行的可执行程序

三 编译器的发展史

(1) 20世纪50年代

IBM的John Backus带领一个研究小组对FORTRAN语言及其编译器进行开发。但由于当时人们对编译理论了解不多,开发工作变得既复杂又艰苦。与此同时,Noam Chomsky开始了他对自然语言结构的研究。他的发现最终使得编译器的结构异常简单,甚至还带有了一些自动化。Chomsky的研究导致了根据语言文法的难易程度以及识别它们所需要的算法来对语言分类。正如现在所称的Chomsky架构(Chomsky Hierarchy),它包括了文法的四个层次:0型文法、1型文法、2型文法和3型文法,且其中的每一个都是其前者的特殊情况。2型文法(或上下文无关文法)被证明是程序设计语言中最有用的,而且今天它已代表着程序设计语言结构的标准方式。分析问题(parsing problem,用于上下文无关文法识别的`有效算法)的研究是在60年代和70年代,它相当完善的解决了这个问题。现在它已是编译原理中的一个标准部分。

有限状态自动机(Finite Automaton)和正则表达式(Regular Expression)同上下文无关文法紧密相关,它们与Chomsky的3型文法相对应。对它们的研究与Chomsky的研究几乎同时开始,并且引出了表示程序设计语言的单词的符号方式。

人们接着又深化了生成有效目标代码的方法,这就是最初的编译器,它们被一直使用至今。人们通常将其称为优化技术(Optimization Technique),但因其从未真正地得到过被优化了的目标代码而仅仅改进了它的有效性,因此实际上应称作代码改进技术(Code Improvement Technique)。

当分析问题变得好懂起来时,人们就在开发程序上花费了很大的功夫来研究这一部分的编译器自动构造。这些程序最初被称为编译器的编译器(Compiler-compiler),但更确切地应称为分析程序生成器(Parser Generator),这是因为它们仅仅能够自动处理编译的一部分。这些程序中最著名的是Yacc(Yet Another Compiler-compiler),它是由Steve Johnson在1975年为Unix系统编写的。类似的,有限状态自动机的研究也发展了一种称为扫描程序生成器(Scanner Generator)的工具,Lex(与Yacc同时,由Mike Lesk为Unix系统开发)是这其中的佼佼者。

在70年代后期和80年代早期,大量的项目都贯注于编译器其它部分的生成自动化,这其中就包括了代码生成。这些尝试并未取得多少成功,这大概是因为操作太复杂而人们又对其不甚了解。

(2) 国内编译器的研发历史

我国编译器研发工作起步并不算晚,早在60年代初期,董韫美院士和杨芙清院士就分别在中科院和北大领导研究组开发编译器,那时面向的高级语言是ALGOL和FORTRAN,目标机是国产机。

在改革开放前,由于国家需要,中科院、国防科大、江南计算所、北大等单位一直在研制国产计算机,包括大型机和高性能计算机(如向量机、并行机),相应的也在研制高级语言编译器。中科院计算所以董韫美院士领导的研究组先后开发了119机、109机的类 ALGOL语言编译器BCY。国防科大开发了向量编译器和向量识别器。

70年代中科院计算所张兆庆教授研究组(以后称ACTGroup)开始在国产机上研制FORTRAN语言编译器,先后参与了众多的院级和国家级科研攻关项目,主持开发了013,757,KJ8920等国产大型机系统中的FORTRAN语言编译器,所研制的编译器支持了数百万行应用软件的运行。

90年代以来ACTGroup承担科学院重大项目,国家攻关项目,863项目,以及国际合作项目,先后开发了共享内存多处理机的并行识别器,分布式内存多处理机的并行识别器, SIMD芯片和VLIW芯片的并行优化C编译器。将编译技术与图形学结合,ACTGroup还推出了集成化、可视化的并行编程环境。ACTGroup在先进编译技术和并行编程环境方面的研究工作获国内外专家高度评价,国际著名学者评价此研究组居编译领域的世界先进行列。

(3) 研究现状

编译器设计最近的发展包括:首先,编译器包括了更加复杂算法的应用程序它用于推断或简化程序中的信息;这又与更为复杂的程序设计语言的发展结合在一起。其中典型的有用于函数语言编译的Hindley-Milner类型检查的统一算法。其次,编译器已越来越成为基于窗口的交互开发环境(Interactive Development Environment,IDE)的一部分,它包括了编辑器、连接程序、调试程序以及项目管理程序。这样的IDE标准并没有多少,但是对标准的窗口环境进行开发已成为方向。另一方面,尽管近年来在编译原理领域进行了大量的研究,但是基本的编译器设计原理在近中都没有多大的改变,它现在正迅速地成为计算机科学课程中的中心环节。

在九十年代,作为GNU项目或其它开放源代码项目的一部分,许多免费编译器和编译器开发工具被开发出来。这些工具可用来编译所有的计算机程序语言。它们中的一些项目被认为是高质量的,而且对现代编译理论感性趣的人可以很容易的得到它们的免费源代码。

大约在,SGI公布了他们的一个工业化的并行化优化编译器Pro64的源代码,后被全世界多个编译器研究小组用来做研究平台,并命名为Open64。Open64的设计结构好,分析优化全面,是编译器高级研究的理想平台。

(4)国内编译器开发的现状

90年代以来,国内主要以研制并行机为主,相应的并行编译器研制也在国内开展起来。代表性的成果有:上海复旦大学朱传琪教授研究组研制的面向共享存储并行机的并行优化编译器AFT达到世界领先水平。

篇7:编译原理课程和助教工作总结

时间如流水般,转眼,一学期将至,每个人为了能交上一份满意的答卷,无时无刻不在倾注着汗水,挥洒着热泪。掩卷长思,细细品味,这学期的点点滴滴不禁又浮上心头,现在让我们一起回顾一下,希望可以对今后的教学工作有所帮助。

编译原理是我们北京师范大学信息科学与技术学院计算机专业本科生的专业必修课,它旨在介绍编译程序构造的一般原理和基本方法,其内容主要包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成等。这门课程关注的是编译器方面的产生原理和技术问题,似乎和计算机的基础领域不沾边,但是编译原理课程是所有计算机专业学生应该习得的一门重要课程,因为虽然在将来并不是所有人都会从事编译方面的工作,但是通过编译原理的学习之后,可从许多不同的角度来观察编译器的结构,编译器的物理结构、操作的顺序等等,会涉及到数据结构、计算机组成原理等课程,所以同学们在理论、技术和方法上都能得到系统而有效的训练,而且有利于将来希望从事软件开发的学生的相关素质和能力的进一步提高,更能够让每个学生更清楚的了解和熟悉一段程序从源代码到可执行文件之间具体的转换过程,这样能够更好的理解代码的编译和计算机内部的工作原理,对学生以后计算机相关的学习乃至工作从业都会有非常大的帮助。

编译原理这门课程是计算机专业课程中偏难的一门课,不管是在平时的课堂教学上,还是在上机实验的过程中,学生都会产生很多困惑之处,在这些方面我们的编译原理助教就承担了相当重要的工作和任务:

每周课堂随堂听课,跟进教学进度,并且上课之前做好复习工作,对每节课同学们可能会产生的问题提前做好归纳,以便更好的在课余时间跟同学们讨论,给同学们提供答疑解惑的机会;

能动手编写代码完成变异原理实验是本课程技能培养的重要一环,在每周的上机实验时,助教帮助同学们进行分组,以小组合作的方式来完成每次的实验任务,依照课程进度循序渐进的给同学们分派布置实验任务,在实验课上跟同学们随时交流,一同调试代码,一对一的解答实验疑惑等,并且协助同学们理解实验原理和内容,辅助同学们能够顺利完成上机实验,通过上机实验的手动操作,同学们也可以更直接、更具体的理解编译程序代码过程中一些具体的原理和方法;实验课我选取的是基于C++或者是基于flex和bison的实验,助教会主动和实验课本的作者老师联系沟通,获得更多实验相关的资料,比如书上给出代码的电子版和用例测试等。

助教在课后会主动收集同学们课堂上课或者实验过程中遇到的问题向我反映,这样可以及时发现同学们在课堂中理解较为模糊甚至有偏差的地方,并在课堂或者实验课上进行一个集中的讲解,更利于同学们的学习;

每次课结束之后,我会布置课后作业来让同学们对课堂教学内容进行巩固和查漏补缺,助教认真批改同学们的课后作业、所交的实验报告和运行的代码,做好每位同学的评分与登记,对课后作业、实验报告和代码中关键性的错误做出标记,并要求学生改正。登记课后成绩时,按10分制来决定,登记实验成绩时按照20分制来决定。在每次批改作业结束后,助教会及时整理,汇总学生的成绩和作业实验中出现的问题,助教通过批改课后作业和实验来了解同学们真实的学习情况,从而能够更好的辅助教学工作的进行。

平时为了同学们能获得更好的学习体验,会进行一些与国外教授的视频课程或者相关活动等,助教会组织同学们进行视频授课前的预习工作,同大家一起讨论上课形式,提出可能遇到的问题等等,在课前会负责批教室,布置桌椅场地,设置视频授课环境,调试摄像头、话筒和音响等相关的设备,为进行正常的视频授课或其他活动做准备。

对自己的要求:

一、师德方面:加强修养,塑造“师德”,我始终认为作为一名教师应把“师德”放在一个极其重要的位置上,因为这是教师的立身之本。“学高为师,身正为范”,这个道理古今皆然。从踏上讲台的第一天,我就时刻严格要求自己,力争做一个有崇高师德的人,为每一个学生“传道授业解惑”。

二、认真备课,不但备学生而且备教材备教法,根据教材内容及学生的实际,设计课的类型,拟定采用的教学方法,并对教学过程的程序及时间安排都作了详细的安排,认真写好教案。每一课都做到“有备而来”,每堂课都在课前做好充分的准备,并制作各种有利于吸引学生注意力的有趣教具,课后及时对该课作出总结,并认真搜集每课书的知识要点,归纳总结。

三、增强上课技能,提高教学质量,使讲解清晰化,条理化,准确化,生动化,做到线索清晰,言简意赅,深入浅出。在课堂上特别注意调动学生的积极性,让学生多动手,从而加深理解掌握知识。加强师生交流,充分体现学生的主动作用,让学生学得容易,学得轻松,学得愉快;注意精讲精练,在课堂上老师讲得尽量少,学生动口动手动脑尽量多;同时在每一堂课上都充分考虑每一个层次的学生学习需求和学习能力,让各个层次的学生都得到提高。

四、认真批改作业:布置作业做到精读精练。有针对性,有层次性。同时对学生的作业批改及时、认真,分析并记录学生的作业情况,将他们在作业过程中出现的问题作出分类总结,进行透切的评讲,并针对有关情况及时改进教学方法,做到有的放矢。对学生:

篇8:编译原理实验总结报告

方法1

int WINAPI WinMain(//主函数

HINSTANCE hInstance,// handle to current instance HINSTANCE hPrevInstance, // handle to previous instance

LPSTR lpCmdLine,// command line

int nCmdShow

// show state)

WNDCLASS wndcls;//创建一个窗口对象

wndcls.cbClsExtra=0;//窗口类附加字节,为该类窗口所共享。通常0。

wndcls.cbWndExtra=0;//窗口附加字节。通常设为0。

wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);//背景

wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);/光标

wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);//位图(图标)

wndcls.hInstance=hInstance;//当前应用程序事例句柄。

wndcls.lpfnWndProc=WinSunProc;// 窗口过程函数(回调函数)

wndcls.lpszClassName=“Weixin2003”;// 窗口名//类的名字

wndcls.lpszMenuName=NULL;//菜单名

wndcls.style=CS_HREDRAW | CS_VREDRAW;//窗口的类型

RegisterClass(&wndcls);//注册窗口

HWND hwnd;

hwnd=CreateWindow(“Weixin2003”,“

京”,WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL);//定义窗口句柄并创建窗口

ShowWindow(hwnd,SW_SHOWNORMAL);//显示窗口

UpdateWindow(hwnd);//更新窗口

MSG msg;//定义消息对象

/*做消息循环*/while(GetMessage(&msg, //接收消息的窗口句柄。//从消息队列中取出一条消息 NULL, //消息标识。0,0))//做消息循环

{

TranslateMessage(&msg);//进行消息(如键盘消息)转换

DispatchMessage(&msg);/分派消息到窗口的回调函数处理,}

return 0;}

//回调函数原形为LRESULT CALLBACK WindowProc();

LRESULT CALLBACK WinSunProc(//对消息的响应函数(回调函数)

HWND hwnd,// handle to window

UINT uMsg,// message identifier

WPARAM wParam, // first message parameter LPARAM lParam

// second message parameter){

switch(uMsg){

case WM_CHAR:break;

case WM_LBUTTONDOWN:

MessageBox(hwnd,“mouse clicked”,“weixin”,0);

HDC hdc;

hdc=GetDC(hwnd);

TextOut(hdc,0,50,“计算机编程语言培训”,strlen(“计算机编程语言培训”));

ReleaseDC(hwnd,hdc);

break;

case WM_PAINT:

HDC hDC;

PAINTSTRUCT ps;

hDC=BeginPaint(hwnd,&ps);

TextOut(hDC,0,0,“维新培训”,strlen(“维新培训”));

EndPaint(hwnd,&ps);

break;

case WM_CLOSE:

if(IDYES==MessageBox(hwnd,“是否真的结束?”,“weixin”,MB_YESNO))

{DestroyWindow(hwnd);}

break;

case WM_DESTROY:

PostQuitMessage(0);

break;

default:

return DefWindowProc(hwnd,uMsg,wParam,lParam);

}

总结:创建一个完整的窗口需要经过下面四个操作步骤: 一,设计一个窗口类;如:WNDCLASS wndcls;二,注册窗口类;

如:RegisterClass(&wndcls);

三,创建窗口;

如:CreateWindow(),CreateWindowEX();四,显示及更新窗口。如:ShowWindow(),UpdateWindow();二:VC++掌握的基础

①使用VC编程除了良好的C基础外还需要掌握两方面: ②消息本身。不同消息所代表的用户操作和应用程序的状态。

③对于某个特定的消息来说,要让OS执行某个特定的功能去响应消息。

二.1消息的分类:标准消息,命令消息,通告消息。

[标准消息]:除WM_COMMAND之外,所有以WM_开头的消息。

[命令消息]:来自菜单、加速键或工具栏按钮的消息。这类消息都以WM_COMMAND呈现。

通过标识(ID)来区分不同的命令消息;在SDK中,通过消息的wParam参数识别。

[通告消息]:由控件产生的消息,如按钮的单击。

1)从CWnd派生的类,可以接收到[标准消息] [命令消息]和[通告消息]。2)从CCmdTarget派生的类,只能可以接收到[命令消息]和[通告消息]。

三:两种函数调用约定(__stdcall 和 __cdecl)

#define CALLBACK

__stdcall

//__stdcall 标准调用预定,是PASCAL 调用约定,象DELPHI使用的就是标准调用约定

#define WINAPIV

__cdecl // __cdecl 是C 语言形式的调用约定。

主要区别:函数参数传递顺序 和 对堆栈的清除上。

问题:除了那些可变参数的函数调用外,其余的一般都是__stdcall约定。但 C/C++编译默然的是__cdecl约定。所以如果在VC等环境中调用__stdcall约定的函数,必须要在函数声明的时加上__stdcall 修饰符,以便对这个函数的调用是使用__stdcall约定(如使用DELPHI编写的DLL时候)。(VC中可通过这途径修改:project|settings..|c/c++|...)

四:关于DC句柄获取(CpaintDC/CclientDC/CwindowDC在创建时默认)

(调用这些函数)a)使用BeginPaint(),EndPaint()对。注意只能在响应WM_PAINT消息时使用。

b)使用GetDc(),ReleaseDC()对。注意他们不能在响应WM_PAINT中使用。MFC中的运用为① HDC hdc=::GetDc(m_hWnd);::ReleaseDC(m_hWnd,hdc);获得全局DC。

② CDC *pDC=GetDC();ReleaseDC(pDC);

③ CClientDC dc(this);(自动调用GetDc(),ReleaseDC()); ④ CWindowDC dc(this);(自动调用GetDc(),ReleaseDC());

五:MFC程序框架的剖析

①寻找WinMain

人口:路径:visual c++安装目录下的:vc98|MFC|SRC|APPMODUL.CPP:

寻找CWinApp构造函数:MFC|SRC|APPCORE.CPP: ②MFC程序

线

CTEApp

theApp-> CWinApp::CWinApp()->_tWinMain(){//进入程->AfxEndDeferRegisterClass(LONG fToRegister)-> PreCreateWindow(创建、显示和更新窗口)pThread->Run(消息循环)-> PumpMessage(//取消息并处理)

类的运行顺序为:C*APP->CmainFram->C*View->C*Doc

六:消息映射的三步骤:

①在头文件中声明消息响应函数原型。如:afx_msg void OnLButtonDown(UINT nFlags, CPoint point);

②在源文件中进行消息映射。如:ON_WM_LBUTTONDOWN()③源文件中进行消息响应函数的定义。如:void CDrawView::OnLButtonDown(UINT nFlags, CPoint point){}

七:使用画笔、画刷、字体的步骤:(包括设计绘图模式SetROP2()

①CPen pen(PS_DOT,1,RGB(0,255,0));//构造画笔对象② CClientDC dc(this);③ CPen *pOldPen=dc.SelectObject(&pen);//将画笔选入DC后就可以作画了④dc.SelectObject(pOldPen);CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));//构造透明画刷对象

FromHandle()将对象句柄转换为对象指针GetStockObject()取得一个以预定义的画笔、画刷、字体的句柄.类为Cpen Cbrush CFont

设计绘图模式: dc.SetROP2(R2_BLACK);(查MSDN).八:创建插入符:CDC类(文字等的输出类)

CClientDC dc(this);TEXTMETRIC tm;dc.GetTextMetrics(&tm);// 获取当前字体信息的度量

CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);ShowCaret();// void CreateCaret(CBitmap* pBitmap);//创建位图插入符

//static void PASCAL SetCaretPos(POINT point);//设计插入符号的位置

九:创建路径层:

BOOL BeginPath();//在这作图定义路径层剪切区域BOOL EndPath();

BOOL SelectClipPath(int nMode);//调用这个函数来使当前路径层剪切区域与新剪切区域进行互操作。

应用:当作图的时候,如果想要在整幅图形其中的某个部分和其它部分有所区别,我们可以把这部分图形放到路径层当中,然后指定调用指定互操作模式调用SelectClipPath(int nMode)函数来使路径层和覆盖在其上新绘图剪切区域进行互操作,达到特殊效果。

十:设置定时器

①SetTimer(1,100,NULL);//放置定时1器并发送WM_TIMER消息

②作WM_TIMER消息响应并对Void OnTimer(UINT nIDEvent)编写代码。

十一:CMenu类

CMenu 类重要函数:CMenu*GetMenu得到窗口菜单栏对象指针。

CMenu::GetSubMenu获得指向弹出菜单对象指针

// SetMenu(CMenu* pMenu)设置新菜单或移除菜单 DrawMenuBar()//重绘菜单

//其它菜单的功能设计用MSDN查函数

十二:创建自定义菜单

①CMenu menu;//

象②menu.LoadMenu(IDR_MAINFRAME);③SetMenu(&menu);

④menu.Detach();// 这里menu对象作为一个局部对象。使用Detach()从menu对象中分离窗口菜单句柄,从而当menu对象析构的时候窗口菜单资源不随之销毁。也可将menu;定义为全局对象。

十三:对弹出式菜单项的命令更新

①给菜单项添加UPDATE_COMMAND_UI消息响应②在响应函数中调用CcmdUI类的成员函数。十四:向系统添加(右键弹出式)菜单(上下文菜单)

1系统添加法:

① Project->Add to Project->Components and Controls->Visual C++ conpenets->pop-upMenue->Insert->选择类(不能选CmainFram)其中系统增加的内容:A一个菜单资源;B,在派生View类中增加了OnContextMenu()函数

2系统添加法:①用资源管理器添加一个菜单资源②在鼠标右键消息响应函数中,加载菜单资源,并获得要显示的子菜单指针,并用该指针调用TrackPopupMenu函数便完成任务 代码如下:CMenu menu;

menu.LoadMenu(IDR_MENU1);CMenu *pPopup=menu.GetSubMenu(0);

ClientToScreen(&point);//将一个坐标点或一个矩形区域坐标转换成屏幕坐标。

pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,this);//在指定位置以指定的方式显示弹出菜单。也可对菜单项做消息响应。

2动态添加菜单法:①在CmainFram类的OnCreate()中创建Cmenu对象调用其成员函数添加、插入、删除子菜单、菜单项②手动给动态菜单项添加响应函数一:在Resource.h中可以添加资源的ID二:在头文件中写消息函数原型三在代码文件中添加消息映射和添加消息响应函数(注意手动添加要放在ClassWizard的规定的外面)

十五:集合类:

COBArray,CStringArray,CDWordArray,CPtrArray,CStringArray,CUIntArray,CWordArray

十六:在CMainFrame中截获对菜单命令的处理

由于CWnd::OnCommand 是个虚函数,可以在框架类中重写OnCommand函数,从而可以截获菜单消息使它不再往下(VIEW类)路由。例:

BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam){ int MenuCmdId=LOWORD(wParam);//取命令ID CMenu2View *pView=(CMenu2View*)GetActiveView();//获取当前VIEW类指针

if(MenuCmdId>=IDM_PHONE1 && MenuCmdIdm_strArray.GetSize())//消息范围判断

{CClientDC dc(pView);

dc.TextOut(0,0,pView->m_strArray.GetAt(MenuCmdId-IDM_PHONE1));return TRUE;//函数返回,避免调用CFrameWnd::OnCommand函数,在CFrameWnd::OnCommand中截获的消息会交由VIEW类处理}

return CFrameWnd::OnCommand(wParam, lParam);

//调用基类OnCommand函数,在CFrameWnd::OnCommand中截获的消息会交由VIEW类处理}

十七:对话框类CDialog

1.重要函数与成员变量

一:每个窗口类创建的对象的同时都拥有一个窗口句柄m_hWnd的成员变量。二:GetDlgItem(IDC)== 关联一个变量; 通过控件ID 获得控件对象指针 三:GetWindowText(CString& rString)/ /获得窗口、安键文本(char类型)四:int atoi(const char *string);itoa()// 把一个字符串与INT 类型的数值转为 五

GetDlgItemText(IDC_EDIT1,ch1,10)==GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,10);在一个窗口控件中直接读取文本到字符数组中

六:INT GetDlgItemInt()//获得控件文本,并转换成数值类型 七:SetFocus()设计窗口、控件的焦点。GetFocus()

八;if(IDOK==dlg.DoModal())创建对话框后会等待用户作选择,就是DoModal、create的值。

九:对编辑框Edit控件写入内容后会发送EN_change消息,2.

问控件的六种方法:

一:GetDlgItem(IDC_EDIT2)->Get(Set)WindowText(ch2,10);二:Get(Set)DlgItemText(IDC_EDIT2,ch2)

三:Get(Set)DlgItemInt(IDC_EDIT2)

四:每个控件关联一个变量,直接对变量进行操作。调用UpdateData()对控件取设计值。

或:变量.GetWindowText(ch1,10);取得数据

五:通过SDK函数或变量的成员函数发送WM消息完成消息任务: ::SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd,WM_GETTEXT,10,(LPARAM)ch1);

m_edit1.SendMessage(WM_GETTEXT,10,(LPARAM)ch1);六:直接给ID控件发送消息:

SendDlgItemMessage(IDC_EDIT1,WM_GETTEXT,10,(LPARAM)ch1);

十八:创建扩展窗口(收缩、扩展窗口)

①创建一个图表框通过ID获得其矩形的位置,并通过CRect对象记录其矩形位置。

GetDlgItem(IDC_)->GetWindowRect(&rectSeparator);GetWindowRect(&rectLarge);

②创建两个CRect对象通过点的付值记录其矩形位置收缩、扩展时的矩形位置。③SetWindowPos(NULL,0,0,rectSmall.Width(),rectSmall.Height(),SWP_NOMOVE 置窗口大小与位置

| SWP_NOZORDER);//设

//获得窗口大小十九:设计焦点事件(Tab Stop)

先对改变焦点事件做消息响应(如对回车ID_OK的响应)后

① GetFocus()->GetNextWindow()->SetFocus();//对最后一个不能判断。

②GetFocus()->GetWindow(GW_HWNDNEXT)->SetFocus();/对最后一个不能判断。

③GetNextDlgTabItem(GetFocus())->SetFocus();//最好

回车事件为窗口缺损消息由ONOK()响应,可通过对控件属性设计为缺损做消息响应以接收这个消息。廿:查看/改变对话框控件排列的秩序

在对话框资源界面中:Layout->Tab Order->改顺序。

廿一:逃跑按钮的巧妙实现

①创建多个Cbutton控件,并建立基于Cbutton类,类中包含一个本类的成员变量。

②将控件关联成这个类的一个变量,同时使自己的成员变量指向下个控件 ③ShowWindow(SW_HIDE);使自己隐藏,通过其成员变量m_pBtn->ShowWindow(SW_SHOW)使对方显示

廿二:如何制作属性页对话框和向导对话框CpropertySheet类CpropertyPage类

①创建属性页:insert->Resource->Dailog->选择后三个之一(如IDD_PROPPAGE_LARGE).②为各页添加控件并为各页创建以CpropertyPage(属性表单页类)为基类的属性表单页类.③以CPropertySheet为基类创建属性表单类,并在表单类中添加各表单页的对象。要加头文件。

④在表单类的构造函数中用AddPage(&m_prop1);添加各表页。

⑤在View中做消息响应做显示触发器。编代码:⑤.1构造表单对象(设计表单名)⑤.2调用propSheet.DoModal()或Create()显示页面。(注: 创建向导对话框在⑤.2前调用SetWizardMode()

⑥设计各页(上一步、下一步等)限制用户在不满足设定的条件时切换到其他属性页和向导页。:⑥.1 在各页中添加OnSetActive()虚函数⑥.2用表单指针调用SetWizardButtons()来设计。如:((CPropertySheet*)GetParent())->

SetWizardButtons(PSWIZB_NEXT);其响应函数为虚函数OnWizardNext/Back/Finish(查看MSDN)return –1不进入下一页。廿三:单选按钮操作方法:

①对所有单选按钮的第一个按钮属性设为Group,并为它们关联一个int类型的变量(使用时可按其编号访问)

②选择后(要按下一步或ok键)对按键作消息响应,用UpdateDate()对所选取值。

③对适当事件作消息响应通过一新的int类型的变量取这个关联的变量。

④使用选择值时作消息响应,通过变量作switch()case选择,通过str+=“程序员”等方式取值并将选择输出。

⑤使用完后在使用类的构造函数中对数组初始化

廿四:复选按钮操作方法:

①对所有复选按钮都关联一个Bool类型的变量(使用时可按其编号访问)

②选择后(要按下一步或ok键)对按键作消息响应,用UpdateDate()对所选取值。(就一个函数)

③对适当事件作消息响应通过Bool类型数组记录每个关联变量的值。

④使用选择值时作消息响应,通过Bool类型数组多次if(m_bLike[0])判断,通过str+=“程序员”等方式取值并将选择输出。

⑤使用完后在使用类的构造函数中用memset()对数组初始

廿五: 组合框操作方法:CcomboBox类

①做OnInitDialog()虚函数消息响应通过AddString()初始化选项值。

并通过((CComboBox*)GetDlgItem(IDC_COMBO2))->SetCurSel(0);负索引号值。

②对适当事件作消息响应通过引号。

int index=((CComboBox*)GetDlgItem(IDC_COMBO2))->GetCurSel();取得索

((CComboBox*)GetDlgItem(IDC_COMBO2))->GetLBText(index,m_strSalary);通过索引号将值存入字符串中。③对适当事件作消息响应通过新的CString类型变量记录这个字符串。

④使用选择值时作消息响应,通过CString类型变量以str+=“程序员”等方式直接使用。⑤使用完后在使用类的构造函数中对数组初始化

廿六:列表框操作方法:ClistBox类

①对所有复选按钮都关联一个CString类型的变量.并做OnInitDialog()虚函数消息响应通过AddString()初始化选项值。

((CListBox*)GetDlgItem(IDC_LIST1))->AddString(“北京”);

②对适当事件作消息响应通过新的CString类型变量记录关联变量的选择值。

③使用选择值时作消息响应,通过CString类型变量以str+=“程序员”等方式直接使用。④使用完后在使用类的构造函数中对数组初始化。

廿七:解决添加类成功后ClassWizard找不到其.h//.cpp文件

①在本工程目录下删除.CLW 文件;.CLW 为管理类信息的文件。②在工程中View->ClassWizard->是(输入这个文件名.CLW)

廿八:修改MFC AppWizard向导生成的框架程序窗口的大小和标题:在CMainFrame类中

在CMainFrame类中一法:在PreCreateWindow()中(窗口创建前)查MSDN的Frame-window styles

cs.cx=300;cs.lpszName=“http://”;

二法:在CMainFrame类的OnCreate()中:(窗口创建后)调用SetWindowLong()

SetWindowLong(m_hWnd,GWL_STYLE,WS_OVERLAPPEDWINDOW);

SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE)& ~WS_MAXIMIZEBOX);廿九:修改MFC AppWizard向导生成的框架程序窗口的图标:在CMainFrame类中

PreCreateWindow()一:中同窗口的创建相同:WNDCLASS wndcls;->设计->注册->修改

二cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW CS_VREDRAW,0,0,LoadIcon(NULL,IDI_WARNING));OnCreate()中三

OnCreate()中

加载系统图标:SetClassLong(m_hWnd,GCL_HICON,(LONG)LoadIcon(NULL,IDI_ERROR));

四:加载自定义图标: m_hIcons[0]=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));

SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hIcons[0]);

三十:修改MFC AppWizard向导生成的框架程序窗口的背景、光标:在CView类中

PreCreateWindow()中一法:cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW, LoadCursor(NULL,IDC_CROSS),(HBRUSH)GetStockObject(BLACK_BRUSH),0);OnCreate()

:SetClassLong(m_hWnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(BLACK_BRUSH));SetClassLong(m_hWnd,GCL_HCURSOR,(LONG)LoadCursor(NULL,IDC_HELP));

背景

光标

卅一获得当前应用程序实例句柄的方法:

一:AfxGetInstanceHandle()二:theApp.m_hInstance三:AfxGetApp()->m_hInstance,卅一:.工具栏按钮编程和手动添加工具栏

CToolBar类 对菜单进行消息响应,对常用菜单在Resource的ToolBar中设计工具栏按钮,将其ID设计于菜单栏ID相同

手动添加工具栏查看MSDN的CToolBar类。也可查看CMainFrame::OnCreate()函数。

卅二:向应用程序导入图标资源:

将图标资源copy到本工程的.res目录下,insert->rousert->import导入图标资源

卅三:对菜单进行消息响应使自定义工具栏显示和隐藏:m_newToolBar为工具栏类对象。

1法:if(m_newToolBar.IsWindowVisible()){m_newToolBar.ShowWindow(SW_HIDE);} else{m_newToolBar.ShowWindow(SW_SHOW);}

RecalcLayout();

DockControlBar(&m_newToolBar);// 工具栏停靠函数 2法:ShowControlBar(&m_newToolBar,!m_newToolBar.IsWindowVisible(),FALSE);

卅四:对状态栏的状态指示器编程(编写时钟显示)CstatusBar类

①在String Table资源中加入ID资源并在CmainFrame的头文件中建立一个CstatusBar类对象。

②在CmainFrame类.cpp的static UINT indicators[]结构第一个ID后添加这个ID.就可显示这个String。

③在OnCreate()通过Cstring对象格式化记录要输出的内容。这里是时间.CTime t=CTime::GetCurrentTime();CString str=t.Format(“%H:%M:%S”);④ 通过

CSize sz=dc.GetTextExtent(str);取得屏幕输出要的宽度。

Int index=m_wndStatusBar.CommandToIndex(IDS_TIMER)//通过ID取得索引号并通过索引号设计窗格宽度 类对象.SetPaneInfo(1,IDS_TIMER,SBPS_NORMAL,sz.cx);⑤类对象.SetPaneText(1,str);输出内容。

⑥在OnPaint()中重写代码,当窗口重绘时再只显示。

卅五:对状态栏的指示行的编程 ①在响应的类中作消息响应。并编代码。②通过Cstring对象格式化记录要输出的内容如

CString str;

str.Format(“x=%d,y=%d”,point.x,point.y);③显示(有四种方法)一:((CMainFrame*)GetParent())->m_wndStatusBar.SetWindowText(str);m_wndStatusBar为CstatusBar类对象

二:((CMainFrame*)GetParent())->SetMessageText(str);

三:((CMainFrame*)GetParent())->GetMessageBar()->SetWindowText(str);四str);

AFX_IDW_STATUS_BAR为系统准备的状态栏ID号;

:GetParent()->GetDescendantWindow(AFX_IDW_STATUS_BAR)->SetWindowText(卅六:进度栏的编写:CprogressCtr类

①在头文件中建立一个CprogressCtrr类对象。并在OnCreate()中通过对象创建一个进度栏。②

卅七:发送自定义消息:

①在头文件中定义消息宏:#define UM_PROGRESS

WM_USER+1 ②作消息映射③在要响应消息处通过SendMessage(UM_PROGRESS)或PostMessage(UM_PROGRESS)发送消息调用函数做要做的任务。SendMessage(UM_PROGRESS)发送消息马上调用函数

ostMessage(UM_PROGRESS)发送消息到消息队列中,并继续运行进程。

卅八:为应用程序添加启动画面

①1系统添加法:① Project->Add to Project->Components and Controls->Visual C++ conpenets->Splash Screen->Insert->选择类(不能选CmainFram)

②在Ontimer()中对显示时间做设计。如果手动添加可参看这个方法。

卅九:使用标准颜色对话框,标准字体对话框(CcolorDialog类,CfontDialog类)

颜色对话框:①做消息响应并建立控件对象,CColorDialog dlg;②创建颜色对话框并通过对象的数据成员m_cc指向的结构取的选择的颜色dlg.m_cc.Flags|=CC_RGBINIT | CC_FULLOPEN;//设计标记if(IDOK==dlg.DoModal()){

COLORREF m_clr=dlg.m_cc.rgbResult;}通过rgbResult的记录输出客户的选择。就可以在画笔、画刷、字体设计颜色。

字体对话框(雷同):①做消息响应并建立控件对象,CFontDialog dlg;②创建字体对话框并通过对象的数据成员m_cf指向的结构变量lpLogFont的字体值初始化自定义字体CFont m_font.CreateFontIndirect(dlg.m_cf.lpLogFont);就可为DC加载字体③为联系创建字体,要对m_font资源做判断,如果存在就释放资源在创建。

if(m_font.m_hObject)m_font.DeleteObject();查MSDN的类和它们的成员变量看事例。

四十:改变对话框的背景色,控件字体色、背景色(Cbutton除外)。

①做WM_CTLCOLOR消息响应,并创建一个CBRUSH对象,return这个对象来改变对话框的背景色 ②通过pWnd->GetDlgCtrlID()==ID—做判断,/用

pDC

调用SetTextColor(RGB(255,0,0));

SetBkMode(TRANSPARENT);SetBkColor(RGB(0,0,255));改变控件字体色、背景色,背景模式。

泗一:改变CButton控件字体色、背景色

①在工程中加入一个以CButton为基类的新类。并重载虚函数DrawItem();②在函数体中加入MSDN中CButton类的DrawItem()的示例代码。(改变背景色要自写代码)。

③在CButton控件中关联这个新类的变量,同时将控件属性Styles->Ower Draw选择上就可以改变字体色。改变背景色代码:有别人写的CSXBtn类和CButtonST类,以备:加载到工程中。

用CSXBtn类雷同上,CButtonST类如下:

①加载CButtonST到工程中,在CButton控件中关联这个新类的变量,重载:OnInitDialog()调用下面的函数

BOOL CSettingDlg::OnInitDialog()

{CDialog::OnInitDialog();m_btnST.SetActiveBgColor(RGB(0,0,255));m_btnST.SetActiveFgColor(RGB(255,0,0));}

泗二:在窗口中显示一幅位图。四步:

1、准备一副位图,响应WM_ERASEBKGND消息。

2、创建位图 bitmap.GetBitmap(&bmp);}

3、创建兼容DC CDC dcCompatible;dcCompatible.CreateCompatibleDC(pDC);

4、将位图选到兼容DC中

dcCompatible.SelectObject(&bitmap);在GetClientRect(&rect)取的客户矩形。

5、将兼容DC中的位图贴到当前DC中。pDC->BitBlt(rect.left,rect.top,rect.Width(), {或pDC->StretchBlt();} rect.Height(),&dcCompatible,0,0,SRCCOPY);

6、return TRUE;后也可在OnDraw()中又重绘。CBitmap

bitmap;

bitmap.LoadBitmap(IDB_BITMAP1);

{BITMAP

bmp;泗三:图形的保存和重绘

一法::

①在工程中添加一普通类,添加多个成员变量以保存图形的各要素,并添加带这几个参数的构造函数来初始化对象

②在绘图的View中建立CptrArray(或别的集合类)对象,在绘图函数中建立这个普通类的对象,没次绘图都记录这些数据并用

Add()添加到集合类对象中以保存图形。③在OnDraw()中用GetSize()取数组个数做循环,嵌套switch用GetAt(i)取图形类型重绘图形。for(int i=0;im_nDrawType)case X:}

二法:利用兼容DC实现图形的保存和重绘

①在View类中建一个CDC m_dc对象,在绘图响应函数中通过它建立一个兼容DC对象,并建一个兼容位图对象记录要保存的图片,将兼容位图选入兼容DC中,if(!CDC m_dcCompatible.m_hDC){ m_dcCompatible.CreateCompatibleDC(&dc);CRect rect;GetClientRect(&rect);CBitmap bitmap;

bitmap.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());m_dcCompatible.SelectObject(&bitmap);

m_dcCompatible.BitBlt(0,0,rect.Width(),rect.Height(),&dc,0,0,SRCCOPY);/*将原始设备颜色和象素拷贝到兼容DC中*/m_dcCompatible.SelectObject(pBrush);} ②可以用兼容DC在绘图函数中作图。③在重绘函数

OnDraw()中通过兼容DC将记录的兼容位图拷贝到矩形空间。CRect rect;GetClientRect(&rect);

pDC->BitBlt(0,0,rect.Width(),rect.Height(),&m_dcCompatible,0,0,SRCCOPY);三法:CmetaFileDC 类: 查MSDN的介绍有步骤。

泗四:文件的操作,增加“打开、保存”文件对话框,注册表的读写

文件的操作:Cfile类 “打开、保存”文件对话框:CfileDialog类和m_ofn成员函数OPENFILENAME结构。

注册表的读写:查MSDN的Registry Functions

泗五:使用CArchive类对文件串行化(查MSDNCArchive类)①创建一个文件对象用于保存数据,同时创建一个CArchive ar 对象。

②通过ar>>将要输入的数据保存到文件中。同样也可通过ar<<将文件中的数据输出。

泗六:修改文挡标题的方法:

①法:在C*Doc类的OnNewDocument()中调用SetTitle()。注:在文挡、视图、框架创建是调用OnNewDocument(),所以可以添加代码设计它们。

②法:在资源String Table的IDR_MAINFRAME的第一二个n间修改字符。注:IDR_MAINFRAME包含的内容:主窗口名、文挡名、文挡类等。(查MSDN的CDOCTemplate::GetDOCString())

泗七:新类的串行化和文挡对图形的串行化处理过程:永久保存图形绘制图形:

第一步:实现新类对串行化的支持:(查MSDNCArchive类对CObject的串行化)①建立一个记录图形各要素的新类,并以CObject为基类。

②在新类中覆盖void Serialize(CArchive& ar)虚函数,并通过CArchive& ar对象实现存取。

③在新类头文件中加

DECLARE_SERIAL(新类名)的宏。

④在新类实现文件中加IMPLEMENT_SERIAL(新类名, CObject, 1)的宏。⑤在新类中重载一个不带参数的构造函数。(有初始化要素的构造函数)后这个类就支持串行化了。串行化完成。

注:本文为网友上传,旨在传播知识,不代表本站观点,与本站立场无关。若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:66553826@qq.com

上一篇:编译原理复习总结 下一篇:通信原理总结