程序设计实践7w-工程、预处理和EGG库.ppt_第1页
程序设计实践7w-工程、预处理和EGG库.ppt_第2页
程序设计实践7w-工程、预处理和EGG库.ppt_第3页
程序设计实践7w-工程、预处理和EGG库.ppt_第4页
程序设计实践7w-工程、预处理和EGG库.ppt_第5页
已阅读5页,还剩82页未读 继续免费阅读

下载本文档

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

文档简介

提纲 使用工程组织多个源文件预处理命令Egg图形库说明 2 模块化和工程 模块的定义一般把用一个名字就可调用的一段程序称为 模块 如子程序 函数等 模块的基本属性 功能 描述该模块实现什么功能逻辑 描述模块内部怎么做状态 该模块使用时的环境和条件除了基本属性 还需描述模块的内部和外部特性模块的外部特性 模块的模块名 参数表模块的内部特性 完成其功能的程序代码和仅供该模块内部使用的数据通常是先确定模块的外部特性 再确定其内部特性 1 使用工程组织多个源文件 函数是最小的模块 若干个紧密相关的函数可以组成更大的模块 源文件 一条好的原则就是保持模块的紧凑性 即在同一个源文件中只包含那些在逻辑上与其相关的函数 1 使用工程组织多个源文件 模块化 把程序划分成独立命名且可独立访问的模块 每个模块完成一个子功能 所有模块集成起来构成的整体可完成用户的所有需求 模块化意义降低了系统的复杂性 使系统容易修改和重用 推动系统各部分的并行开发 提高开发效率 复杂问题较小问题高层模块 从整体上把握问题 隐蔽细节 分解 1 使用工程组织多个源文件 使用工程来组织多个源文件 将功能紧密相关的若干个函数组成单独的源文件 对应于每一个提供通用功能的源文件 建立头文件 include ListNode h 自定义的头文件 该文件在工程所在目录下 include E temp MyType h 自定义的头文件 该文件不在工程所在目录下 include标准库函数头文件 1 使用工程组织多个源文件 实例 猴子选大王源文件的分割头文件的使用使用工程组织多个源文件 在DEV C 集成开发环境中 1 创建工程文件 dev 文件 新建 工程 在弹出窗口中选择ConsoleApplication2 往项目中增加源文件 c 工程 新建单元新建一个源文件加到项目中或者工程 添加将已有的一个源文件加到项目中3 编译 链接 运行 查看结果运行 编译编译项目中所有源文件或者运行 编译当前文件编译当前源文件或者运行 编译运行编译项目中所有源文件 链接 运行 DEV C 下工程的创建 一 新建工程1 点击菜单 文件 新建 工程 DEV C 下工程的创建 2 在弹出窗口的Basic页中选择ConsoleApplication 输入工程名称 选择是c工程 点击确定 DEV C 下工程的创建 3 此时弹出对话框 要求指定工程存放路径 如G temp testProject 选择好路径后点击保存 DEV C 下工程的创建 4 此时系统自动加入main c文件如下 里面代码是系统自动生成的 DEV C 下工程的创建 二 往工程中增加已创建的其他文件将linkNode h link c和link h三个文件拷贝到工程所在目录G temp testProject下然后点击菜单工程 添加 DEV C 下工程的创建 在弹出的对话框中选择要添加的源文件 然后点击打开 DEV C 下工程的创建 此时在工程管理 Project 页中出现了加入这3个文件 DEV C 下工程的创建 在工程管理页中鼠标左键点击link c 则右边的代码区出现该文件的源代码 DEV C 下工程的创建 DEV C 下工程的创建 保存main c在右边的代码区选择main c 然后Ctrl S进行保存 此时弹出对话框 询问保存的目录 三 编译文件若选择编译 Ctrl F9 则编译当前工程中的所有文件 若只是想单独编译一个文件 则选择编译当前文件 Shift Ctrl F9 DEV C 下工程的创建 DEV C 下工程的创建 编译成功后 在工程所在目录G temp testProject中包含文件如下 双击 exe即可运行程序 也可使用Execute菜单下的Run菜单运行程序 dev是工程文件 双击该文件即可在DevC 环境中打开工程 四 在当前工程中新建一个文件如果要新建文件并将其添加到工程中 则选择菜单工程 新建单元 DEV C 下工程的创建 此时将加入一个文件 未命名3 选择保存时 指定该文件的名字和保存路径 一般和工程在同一路径下 如下图所示 DEV C 下工程的创建 五 从工程中移除一个文件 如下图所示 注意 此时该文件在磁盘里还是存在 只是不包含在当前工程中了 DEV C 下工程的创建 DEV C 下工程的创建 注意 添加一个已存在的文件到工程中时 该文件也可以不位于工程所在路径下 假设工程位于D temp project目录下 要加入工程的linkNode h link h和link c位于其他目录 则编译后工程所在目录如下 并没有将上述三个文件复制到工程目录下 其时在文件 dev中记录着上述3个文件的磁盘路径 在VC6开发环境中 1 点击File New弹出菜单 如下图 VC6环境下工程的创建 2 选择Projects选项卡 选择Win32ConsoleApplication 在Projectname文本框输入工程名 如elevator 在Location文本框选择路径如 如C test 见下图 点击OK VC6环境下工程的创建 3 点击Finish 如下图 VC6环境下工程的创建 4 点击OK 如下图 VC6环境下工程的创建 5 把所有源文件例elevator c elevator h文件拷贝到工程所在目录下 如C TEST VC6环境下工程的创建 6 点击左下角的FileView 如下图红色圈所示 再鼠标右键点击SourceFiles 如下图红色箭头所示 选择AddFilestoFolder 选择文件将elevator c加入到SourceFiles目录 鼠标右键点击HeaderFiles 选择AddFilestoFolder 选择文件将elevator h加入到HeaderFiles目录 结果如下图 VC6环境下工程的创建 7 选择主菜单Project Settings 工程 设置 出对话框 如下图 VC6环境下工程的创建 VC6环境下工程的创建 8 点击左边树状导航栏elevator 点击右边选项卡Link 找到Object librarymodules 文本框 在最后添加两项Msimg32 lib egg lib 如图 点击OK 9 这样就可以编写自己的主程序了 比如在SourceFile目录下建立main c文件 main c应包含前面的elevator h 如下图 VC6环境下工程的创建 提纲 使用工程组织多个源文件预处理命令Egg图形库说明 预处理指令 include预处理指令 define 符号常量预处理指令 define 宏条件编译 提纲 预处理指令 define 宏 define用来定义符号常量 用符号表示的常量 宏 用符号定义的操作 宏宏用来替代一个字符串 类似于符号常量 宏在预处理时被替换字符串取代 不带参数的宏 预处理程序就像处理符号常量一样处理不带参数的宏 带参数的宏 先用替换文本取代参数 然后再把宏展开 预处理指令 define 宏 带参数的宏定义格式 define标识符 形式参数表 字符串形式参数表由逗号分割开的标识符组成 这些标识符在字符串中出现 如 definePI3 14159 常量定义 defineCIRCLE AREA x PI x x defineMAX x y x y x y defineNUL x y x y 预处理指令 define 宏 宏调用格式 标识符 实在参数表 如 area CIRCLE AREA 3 4 宏在预处理时被展开 1 替换参数 文件中如果出现宏调用CIRCLE AREA 3 4 则字符串中的x都用3 4替代 2 用字符串取代程序中的宏调用 语句area CIRCLE AREA 3 4 在预处理时将被展开成area 3 14159 3 4 3 4 3 14159 3 4 3 4 预处理时被展开 预处理指令 define 宏 需要注意的是 在宏名和括起参数的括号之间绝对不能有空格 此外 为了避免在翻译宏时产生歧义 宏体和参数也应该用括号括起来 例如 象下例中这样定义宏CIRCLE AREA是不正确的 defineCIRCLE AREA x PI x x如 inta 3 b 4 语句area CIRCLE AREA a b 将被展开成3 14159 a b a b 预处理指令 define 宏 使用宏还是函数宏与函数相比有一个明显的优势 即它比函数效率更高 并且更快 因为宏可以直接在源代码中展开 而调用函数还需要额外的开销 但是 宏一般比较小 无法处理大的 复杂的代码结构 而函数可以 此外 宏需要逐行展开 因此宏每出现一次 宏的代码就要复制一次 这样你的程序就会变大 而使用函数不会使程序变大 条件编译使编译器能够按照不同条件编译不同的程序部分 产生不同的目标代码文件 两种条件编译 使用常量表达式判断 使用宏定义名判断 条件编译 条件编译 1 使用常量表达式判断 共3种 if整型常量表达式文本1 else其他文本 endif if整型常量表达式文本1 endif 第1种情况 第2种情况 首先求常量表达式的值 然后根据常量表达式值是否为0进行下面的条件编译 在第2种情况中 如果该表达式的值非0 则编译文本1 否则编译其他文本 if整型常量表达式1文本1 elif整型常量表达式2文本2 else其他文本 endif 第3种情况 条件编译 让编译器不编译某一段代码 if0不编译的代码 endif以后若想让编译器编译该段代码 只需要将0改成1 条件编译 2 使用宏定义名判断 ifdef标识符文本1 else文本2 endif ifndef标识符文本1 endif 如果定义了标识符为宏 即使宏体为空 则为真 编译 ifdef后面的文本 否则编译 else后面的文本 ifdef标识符文本1 endif 条件编译 ifdef标识符是 ifdefine 标识符 的缩写 ifndef标识符是 if define 标识符 的缩写 条件编译 调试阶段 若想打印变量的值 则代码如下 defineDEBUG 定义宏 宏体为空 ifdefDEBUGprintf variablex d n x printf variabley d n y endif完成调试后 可以去掉 define指令 这样就会在编译过程中忽略上述两条printf语句 条件编译 include defineDEBUG 定义宏main intage charname 20 printf inputyourage n scanf d 条件编译 ifdefDEBUGprintf inputageis d n age endif undefDEBUG 取消宏定义 ifdefDEBUGprintf inputnameis s n name endifsystem pause return0 inputyourage30inputyournamejohninputageis 30请按任意键继续 条件编译 怎样避免多次包含同一个头文件 在创建一个头文件时 你可以用 define指令为它定义一个唯一的标识符名称 你可以通过 ifndef指令检查这个标识符名称是否已被定义 如果已被定义 则说明该头文件已经被包含了 就不要再次包含该头文件 反之 则定义这个标识符名称 以避免以后再次包含该头文件 猴子选大王NodeType h ifndef NODETYPE H define NODETYPE HstructlistNode intdata structlistNode nextPtr typedefstructlistNodeLISTNODE typedefLISTNODE LISTNODEPTR endif include NodeType h include NodeType h main c 编译遇到第1条include指令 由于 NODETYPE H未被定义 因此该头文件被包含 NODETYPE H被定义 编译遇到第2条include指令时 由于 NODETYPE H已定义 因此该头文件将不再被包含 其他预处理指令 error program运算符 和 行号 line预定义的符号常量宏assert 提纲 使用工程组织多个源文件预处理命令Egg图形库说明 图形库函数EGG简介 可以把代码编译成库供其他人员调用 其他人员看不到源代码 两种库 静态链接库和动态链接库静态链接库在链接 link 的时候被连接到 exe文件 LIB中的代码被包含到 exe文件中了 导致应用程序比较大 当 LIB版本升级时 需要对调用该LIB的程序重新编译 exe 图形库函数EGG简介 DLL DynamicLinkLibrary 动态链接库DLL是一个包含可由多个程序同时使用的代码和数据的库 例如 在Windows操作系统中 Comdlg32DLL执行与对话框有关的常见函数 因此 每个程序都可以使用该DLL中包含的功能来实现 打开 对话框 事先不被连接到 exe文件 在运行期才会被调用 1 exe 调用 调用 2 exe 图形库函数EGG简介 动态链接库是分两步链接进程序中的 首先 在编绎的时候 链接器查找出程序需要的所有符号 函数 变量等等 然后链接进程序当中或者程序的另一个共享链接库当中 动态链接库中的目标文件并没有固化进可执行文件 替代的是 当程序运行的时候 由系统的一个程序 叫做动态装载器dynamiclibraries 检查程序需要哪些动态链接库 然后把它们装入内存并且与内存中的程序关联 图形库函数EGG简介 DLL的优点使用较少的资源当多个程序使用同一个函数库时 DLL可以减少在磁盘和物理内存中加载的代码的重复量 这不仅可以大大影响在前台运行的程序 而且可以大大影响其他在Windows操作系统上运行的程序 推广模块式体系结构DLL有助于促进模块式程序的开发 简化部署和安装当DLL中的函数需要更新或修复时 部署和安装DLL不要求重新建立程序与该DLL的链接 此外 如果多个程序使用同一个DLL 那么多个程序都将从该更新或修复中获益 当您使用定期更新或修复的第三方DLL时 此问题可能会更频繁地出现 图形库函数EGG简介 Egg提供2个静态链接库和1个头文件 egg lib 静态链接库eggd lib 静态链接库egg h 图形库函数EGG简介 EGG绘图功能 绘制直线绘制曲线 正圆和椭圆 绘制字符串贴图 bmp文件设置画笔的颜色和线条粗细移动画面的某些部分 动画 图形库函数EGG简介 坐标系统 采用我们最熟悉的平面直角坐标系 左下角是坐标原点 X坐标向右递增 Y坐标向上递增 单位是厘米 坐标原点 图形库函数EGG简介 画笔当前位置在Egg中有一个画笔 尽管我们看不到它 但它确确实实存在 画笔指向位置的坐标就是画笔的当前位置 简称画笔位置 所有绘图操作都是从画笔位置开始落笔绘图 按照绘图要求移动画笔 并把最后提笔结束的位置作为新的画笔位置 画笔的初始位置是画面的左上角 并非坐标原点 左下角 画笔初始位置 画笔相关函数 图形库函数EGG简介 初始化只要调用一个函数 EggStart 就完成所有初始化Egg平台的工作 voidEggStart doublefWidth doublefHeight 参数 绘图窗口的宽和高 单位厘米 你不需要考虑Egg的结束问题 只要程序正常退出 Egg占用的所有资源都会被自动释放 图形库函数EGG简介 直线voidDrawLine doubledx doubledy 从画笔当前位置 按照参数指定的位移画一条直线 位移可以为正 沿X Y坐标的正方向绘制 也可为负 沿X Y坐标的负方向绘制 voidline void EggStart 5 5 初始化DrawLine 5 5 绘制直线WaitForExit 等待用户关闭窗口 图形库函数EGG简介 正圆曲线voidDrawArc doubler doubledStart doubledSweep r 曲线所在圆的半径 单位厘米 dStart 曲线开始点在圆周上的角度 即画笔在圆周上的角度 dSweep 曲线沿圆周按逆时针方向扫过的角度 DrawArc 2 45 90 图形库函数EGG简介 DrawArc 2 45 90 圆半径为2的圆可以有多个 但是画笔位置在圆周上角度为45的圆只有一个 画笔位置 圆半径以及角度唯一确定一个圆 voidyuan1 void EggStart 4 4 OffsetPen 4 2 相对移动DrawArc 2 0 360 WaitForExit voidyuan1 void EggStart 4 4 OffsetPen 4 1 相对移动DrawArc 2 0 360 WaitForExit voidyuan1 void EggStart 4 4 OffsetPen 2 2 相对移动DrawArc 2 0 360 WaitForExit 图形库函数EGG简介 椭圆曲线voidDrawEllipticalArc doublerx doublery doubledStart doubledSweep 参数dStart和dSweep的含义与DrawArc完全相同 rx是该椭圆在x轴的半径 ry是在Y轴的半径 图形库函数EGG简介 字符串voidDrawString char pString 例如 要输出 HelloWorld 使用如下代码 DrawString HelloWorld 字符串的左上角位于当前的画笔位置 输出后画笔位置移动到字符串的右上角 HelloWorld 图形库函数EGG简介 贴图Egg支持 bmp文件的贴图 使用下面函数 voidDrawBitmap char lpszFilename 参数是bmp文件名 例如要贴当前目录下的 beauty bmp 文件 可以使用下面语句 DrawBitmap beauty bmp 位图的左上角位于画笔当前位置 贴图后 画笔当前位置移动到位图的右上角 图片 voidyuan1 void EggStart 4 4 OffsetPen 2 2 DrawArc 2 0 360 MovePen 2 2 DrawString hello DrawBitmap pic bmp WaitForExit 图形库函数EGG简介 画笔颜色和宽度函数SetPen 改变画笔的颜色和宽度 从此都用指定的颜色和宽度绘画各种图形 文字 直到下次调用相关函数为止 voidSetPen unsignedlongcolor doublefWidth fWidth是宽度 单位厘米 color是颜色 取值见具体宏定义 如果只想单独改变颜色或宽度 可以调用voidSetPenColor unsignedlongcolor voidSetPenWidth doublefWidth 动画实现盘子 白色窗口egg 任何图形都是画在一个egg上 每个egg都是相对独立的 可以绘画 移动任何一个egg 而不会影响其它的egg 只能以egg为单位进行移动 egg的大小与调用EggStart 时指定的大小一致 并且覆盖整个盘子 盘子是Egg图形窗口的昵称 但它初始状态是透明的 可以画多个egg 当两个蛋重合 后下的蛋会覆盖先下的蛋 使用ChangeEggLayer 可以改变egg的层次 调整互相之间的覆盖关系 如何下蛋 每次调用LayEgg 都会生成一个新的egg 并把这个egg的句柄返回给你 HEGGLayEgg void 执行完EggStart 后 便已经偷偷建立了一个egg 所有的绘图操作 都是在这个egg上进行的 当LayEgg 后 再执行绘图操作 就是在新的egg上绘图了 如何设置活动蛋 绘图是在活动蛋上进行的 如果想回头在旧egg上绘图 可以使用voidSetActiveEgg HEGGhEgg 函数将旧的egg变成活动蛋因此 需要把每次LayEgg 的返回值 egg的句柄 保存下来 从而将旧蛋变成活动蛋 include egg h defineNUMBER OF EGG5intmain void HEGGhEggs NUMBER OF EGG inti EggStart 10 5 for i 0 i NUMBER OF EGG i hEggs i LayEgg DrawArc i 1 180 180 WaitForExit 等待用户关闭窗口return0 如何动蛋voidMoveEgg doublex doubley voidOffsetEgg doubledx doubledy 这里的 x y 是egg左上角在盘子内的坐标 dx dy 是在盘子坐标系内的位移 需要特别注意的是 在egg上绘画时 所采用的坐标系是每个egg自己的独立坐标 而不是盘子坐标 也就是说 绘画时 不需要考虑egg在盘子内的位置 egg自己的左下角永远是坐标原点 画5个能分别动起来的半圆voiddonghua1 void HEGGhEggs NUMBER OF EGG inti EggStart 10 5 画5个不同半径的半圆for i 0 i NUMBER OF EGG i hEggs i LayEgg DrawArc i 1 180 180 让5个半圆分别移动i 0 while WaitFor 100 SetActiveEgg hEggs i OffsetEgg NUMBER OF EGG i 1 0 1 0 if i NUMBER OF EGG 1 i elsei 0 画5个能同时动起来的半圆voiddonghua2 void HEGGhEggs NUMBER OF EGG inti EggStart 10 5 SetAutoUpdate 0 设置不自动更新屏幕for i 0 i NUMBER OF EGG i hEggs i LayEgg DrawArc i 1 180 180 Update 也可以不要i 0 while WaitFor 100 定时器SetActiveEgg hEggs i OffsetEgg NUMBER OF E

温馨提示

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

评论

0/150

提交评论