C语言程序设计(第4章).ppt_第1页
C语言程序设计(第4章).ppt_第2页
C语言程序设计(第4章).ppt_第3页
C语言程序设计(第4章).ppt_第4页
C语言程序设计(第4章).ppt_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

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

文档简介

高级语言程序设计 第四章模块化程序设计 函数 莆田学院现代教育技术中心2004年3月制作 莆田学院现代教育技术中心2004年3月 一 模块化设计与函数 把大型软件按照规定的原则划分成一个个较小的 相对独立但又相互关联的模块 叫做模块化设计 1965年 G A Miller在他的著名文章 奇妙的数字7 2 人类信息处理能力的限度 中指出 普通人分辨或记忆同一类信息的不同品种或等级的数量一般不超过5 9项 这表明 要使人的智力能足以管理好程序 应该坚持模块化设计 正如不分段的长篇文章可能使读者感到头痛一样 大型的单模块软件不仅可读性差 可靠性也常常难以保证 C语言中 模块化设计的重要工具是 自定义函数 莆田学院现代教育技术中心2004年3月 一 模块化设计与函数 例一 参见P5例1 3 include includemain 主调函数 inta b c intmax int int 函数原型 clrscr printf Inputa b scanf d d intmax intx inty 被调函数 intz if x y z x elsez y returnz 莆田学院现代教育技术中心2004年3月 一 模块化设计与函数 本章的学习首先要讨论 什么是函数 为什么要使用函数 函数有哪些类型 如何自己定义一个函数 如何调用一个函数 函数学习的难点是什么 莆田学院现代教育技术中心2004年3月 一 模块化设计与函数 什么是函数 为什么要使用函数 函数有哪些类型 如何自己定义一个函数 如何调用一个函数 函数学习的难点是什么 什么是函数 一个独立的程序模块 可以定义自己的变量 仅在本函数内有效 拥有自己的存储空间 可以被其他函数或自身调用 主函数除外 莆田学院现代教育技术中心2004年3月 一 模块化设计与函数 什么是函数 为什么要使用函数 函数有哪些类型 如何自己定义一个函数 如何调用一个函数 函数学习的难点是什么 为什么要使用函数 便于实现模块化设计便于团队开发便于使用现有的或别人的程序模块提高编程效能在C程序设计中 通常 将一个大程序分成几个子程序模块 自定义函数 将常用功能做成标准模块 标准函数 放在函数库中供其他程序调用 如果把编程比做制造一台机器 函数就好比其零部件 可将这些 零部件 单独设计 调试 测试好 用时拿出来装配 再总体调试 这些 零部件 可以是自己设计制造 别人设计制造 现在的标准产品 莆田学院现代教育技术中心2004年3月 一 模块化设计与函数 例二 编写一个儿童算术能力测试软件 main charans y clrscr cover 调用软件封面显示函数 password 调用密码检查函数 while ans y ans Y question 调用产生题目函数 answers 调用接受回答函数 marks 调用评分函数 results 调用结果显示函数 printf 是否继续练习 Y N n ans getch printf 谢谢使用 再见 自定义函数 莆田学院现代教育技术中心2004年3月 一 模块化设计与函数 例二 编写一个儿童算术能力测试软件 main charans y clrscr cover 调用软件封面显示函数 password 调用密码检查函数 while ans y ans Y question 调用产生题目函数 answers 调用接受回答函数 marks 调用评分函数 results 调用结果显示函数 printf 是否继续练习 Y N n ans getch printf 谢谢使用 再见 定义所用函数 cover 软件封面显示函数 password 密码检查函数 question 产生题目函数 answers 接受回答函数 marks 评分函数 results 结果显示函数 这些函数现在不编程或还不会编程 可先放空 可以多人合作 每人完成若干个函数 模块化 可在另一个源程序文件中定义 Let stry 莆田学院现代教育技术中心2004年3月 一 模块化设计与函数 什么是函数 为什么要使用函数 函数有哪些类型 如何自己定义一个函数 如何调用一个函数 函数学习的难点是什么 函数有哪些类型 根据函数的来源 可分为 库函数 标准函数 由系统提供 编程时可直接使用之自定义函数由编程者自己编写 使用时要 先定义后使用 根据使用的方式 可分为 无参函数有参函数 函数内需要使用主调函数中的数据 莆田学院现代教育技术中心2004年3月 一 模块化设计与函数 什么是函数 为什么要使用函数 函数有哪些类型 如何自己定义一个函数 如何调用一个函数 函数学习的难点是什么 如何自己定义一个函数 见后 如何调用一个函数 见后 函数部分学习的难点是什么 函数的概念 形参 实参 返回值的概念 递归算法 变量的作用域和生存期 莆田学院现代教育技术中心2004年3月 一 模块化设计与函数 函数使用常识 P144一个源文件由一个或多个函数组成 可为多个C程序公用 C语言是以源文件为单位而不以函数为单位进行编译的 一个C程序由一个或多个源 程序 文件组成 可分别编写 编译和调试 C程序执行总是从main函数开始 一般情况下调用其它函数后总是回到main函数 最后在main函数中结束整个程序的运行 所有函数都是平行的 互相独立的 即在一个函数内只能调用其他函数 不能再定义一个函数 嵌套定义 一个函数可以调用其他函数或其本身 但任何函数均不可调用main函数 莆田学院现代教育技术中心2004年3月 二 函数的定义 函数定义 制造自己的函数 P1441 函数定义的一般形式 参见例一 函数返回值的数据类型函数名 类型名变量名1 类型名变量名2 声明部分处理语句 注意 无形参表的即无参函数 无函数体的为 空函数 如果函数返回值的数据类型为int 可以省略之 传统方式见P146 类型标识符 形参表 莆田学院现代教育技术中心2004年3月 二 函数的定义 把程序控制权从函数返回函数调用点有三种方法 执行到函数结束的右花括号时 如果函数没有返回值 执行到如下语句 如果函数没有返回值 return 把返回值返回调用处 见例一 return表达式 形式 return x return x y return x y x y 语句中圆括号亦可省略 莆田学院现代教育技术中心2004年3月 二 函数的定义 注意 如果函数值类型与return语句表达式值的类型不一致 以函数类型为准 数值型会自动进行类型转换 如果明确表示不需返回值 应使用void作函数返回值的数据类型 否则即使没有return语句 仍将带回一个不确定的值 见P149说明 莆田学院现代教育技术中心2004年3月 三 函数的调用 1 库函数的调用必须在源程序中用include命令将定义该库函数的头文件 包含进来 调用方式 独立语句执行某项操作 如clrscr printf Inputa b 等 表达式中作运算对象 如a sqrt x pow r 3 c exp a 等 莆田学院现代教育技术中心2004年3月 三 函数的调用 2 自定义函数自定义函数和变量一样 在其主调函数中也必须 先声明 后使用 如例一中的intmax int int 函数原型 例一中的自定义函数声明也可以用以下两种形式 P153intmax intx inty 多余 因为编译系统并不检查参数名 或intmax 编译系统将不检查参数类型和参数个数 以下情况时 被调函数在主调函数中可以不先声明 P154被调函数的返回值为整型时函数值是整型 int 或字符型 char 时 系统自动按整型说明 被调函数的定义出现在主调函数之前时在所有函数定义之前 在函数的外部已做了函数声明时调用方式同库函数 莆田学院现代教育技术中心2004年3月 三 函数的调用 3 调用外部函数 其他源文件中定义的函数 时函数说明语句extern函数名 例二 文件file1 c中main intx 80 y 90 c externmax 函数说明 c max x y 20 调用max函数 printf Maxis d n c 文件files2 c中 与file1 c同目录 externmax inta intb extern可省 floatc c a b a b returnc 注 要做一个 prj文件才能运行 莆田学院现代教育技术中心2004年3月 三 函数的调用 main f1 f x1 f2 f x2 x root x1 x2 例8 6嵌套调用关系 简化 floatf floatx floatxpoint floatx1 floatx2 y 调用f x1 f x2 floatroot floatx1 floatx2 y1 f x1 x xpoint x1 x2 y f x 4 函数的嵌套调用P155例8 6 莆田学院现代教育技术中心2004年3月 三 函数的调用 4 函数的嵌套调用P155 例8 6嵌套调用关系 示意图 莆田学院现代教育技术中心2004年3月 例8 6模块划划分情况 main 根据输入的x1 x2判断是否有根若有 调用求根函数root 输出结果 f x 根据所给x值 求y x3 5x2 16x 80返回y值 即与x对应的f x 值 xpoint 根据所给x1 x2值计算弦与x轴的交点 root x1 x2 根据所给x1 x2值求近似根 莆田学院现代教育技术中心2004年3月 补充内容 计算方法与计算机数值求解 计算方法 工程数学之一一 计算方法研究内容 高次方程求根矩阵运算求解 通常归到 线性代数 中 常微分方程数值求解线性方程组求解函数插值计算方法研究求解的算法 通过计算机程序数值求解 莆田学院现代教育技术中心2004年3月 计算方法与计算机数值求解 二 高次方程求根 近似解 基本思路方程f x 0处的x称为该方程的根解法步骤 1 初始近似值 逐步扫描法 异号必有根 2 逐步精确化 误差小于某许可值时 为所求近似根 二分法P121习题6 13 迭代法P121习题6 11 牛顿法P121习题6 12 弦截法P155例8 6 考试内容 莆田学院现代教育技术中心2004年3月 例8 6 弦截法 原理 莆田学院现代教育技术中心2004年3月 二分法 设方程f x 0在区间 a b 有一个根 取其中点x0 a b 2 如果f x0 与f a 同号 则根在x0右侧 取a x0 b不变 否则取b x0 a不变 这样就得到一个新的变小了的有根区间 a b 对此新的有根区间进行同样的处理 这样就可得到更小的有根区间 当 a b e时 对应的x0即为所求根之近似解 e为允许的误差 莆田学院现代教育技术中心2004年3月 迭代法 设有方程f x 0先设法将它化为x g x 于是得到 迭代公式 xn g xn 1 从给定的初始近似值x0出发 反复利用迭代公式求出x0 x1 x2 x3 xn 1 xn当 xn xn 1 e时 对应的xn即为所求根之近似解 e为允许的误差 例 求方程x3 x 1 0在x 1 5附近的一个根 步骤 将方程改造为迭代公式用x0 1 5代入 求得x1 1 35721再代入 求得x2 1 33086直到 xn xn 1 e为止 e为允许的误差 莆田学院现代教育技术中心2004年3月 牛顿法 又称 牛顿切线法 求值速度更快 设有方程f x 0若已知它在x0附近有根 由其切线方程y f x0 f x0 x x0 可得到 迭代公式 xn 1 xn f xn f xn 从给定的初始近似值x0出发 反复利用迭代公式求出x0 x1 x2 x3 xn 1 xn当 xn xn 1 e时 对应的xn即为所求根之近似解 e为允许的误差f x 为方程f x 的一阶导数 斜率 莆田学院现代教育技术中心2004年3月 四 函数的递归调用 1 递归的概念P158直接递归调用调用函数的过程中又调用该函数本身间接递归调用调用f1函数的过程中调用f2函数 而f2中又需要调用f1 以上均为无终止递归调用 为此 一般要用if语句来控制使递归过程到某一条件满足时结束 莆田学院现代教育技术中心2004年3月 四 函数的递归调用 2 递归算法类似于数学证明中的反推法 从后一结果与前一结果的关系中寻找其规律性 归纳法可以分为 递推法从初值出发 归纳出新值与旧值间直到最后值为止存在的关系 要求通过分析得到 初值 递推公式编程 通过循环控制结构实现 循环的终值是最后值 递归法从结果出发 归纳出后一结果与前一结果直到初值为止存在的关系 要求通过分析得到 初值 递归函数编程 设计一个函数 递归函数 这个函数不断使用下一级值调用自身 直到结果已知处 选择控制结构 莆田学院现代教育技术中心2004年3月 四 函数的递归调用 2 递归算法 其一般形式是 在主函数中用终值n调用递归函数 而在递归函数中 递归函数名f 参数x if n 初值 结果 else结果 含f x 1 的表达式 返回结果 return f x f x 1 main f n f x 1 f x 2 f x 2 f x 3 f x0 f x0 莆田学院现代教育技术中心2004年3月 例一 P160例8 8 用递归法求n 分析比较 实际上 递归程序分两个阶段执行 回推 调用 欲求n 先求 n 1 n 2 1 若1 已知 回推结束 递推 回代 知道1 2 可求出 3 n 莆田学院现代教育技术中心2004年3月 程序如下 main intn floats floatfac clrscr printf Inputn scanf d floatfac intx intf if x 0 x 1 f 1 elsef fac x 1 x returnf 莆田学院现代教育技术中心2004年3月 例二 有5个人 第5个人说他比第4个人大2岁 第4个人说他对第3个人大2岁 第3个人说他对第2个人大2岁 第2个人说他比第1个人大2岁 第1个人说他10岁 求第5个人多少岁 P158例8 7 通过分析 设计递归函数如下 10 n 1 age n age n 1 2 n 1 莆田学院现代教育技术中心2004年3月 age intn intc if n 1 c 10 elsec age n 1 2 returnc main clrscr printf d age 5 程序如下 请看看单步运行的情况 莆田学院现代教育技术中心2004年3月 age 5 c age 4 2 returnc age intn intc if n 1 c 10 elsec age n 1 2 returnc 递归过程跟踪分析 P159图8 11P160图8 12 age 4 c age 3 2 returnc age 3 c age 2 2 returnc age 2 c age 1 2 returnc age 1 c 10returnc c 10 c 12 c 14 c 16 c 18 莆田学院现代教育技术中心2004年3月 例三 在屏幕上显示杨辉三角形 11112113311464115101051 莆田学院现代教育技术中心2004年3月 递归函数 1 y 1或y x c x y c x 1 y 1 c x 1 y 程序如下 main inti j n clrscr printf Inputn scanf d 11112113311464115101051 intc intx inty intz if y 1 y x return1 else z c x 1 y 1 c x 1 y returnz 莆田学院现代教育技术中心2004年3月 例四 Fibonacci数列问题 1 n 1 递归函数 fib n 1 n 2 fib n 1 fib n 2 n 1 程序如下 fib intn intf if n 1 n 2 f 1 elsef fib n 1 fib n 2 return f main inti s 0 clrscr for i 1 i 12 i s s fib i printf n 12 s d s 结果 n 12 s 376 莆田学院现代教育技术中心2004年3月 例五 运行下列程序 当输入字符序列AB CDE并回车时 程序的输出结果是什么 includerev charc c getchar if c printf c c else rev printf c c main rev 结果 BA rev c A rev 输出 A rev c B rev 输出 B rev c 输出 莆田学院现代教育技术中心2004年3月 例六 反向输出一个整数 非数值问题 非数值问题的分析无法象数值问题那样能得出一个初值和递归函数式 但思路是相同的 分析方法 简化问题 设要输出的正整数只有一位 则 反向输出 问题可简化为输出一位整数 对大于10的正整数 逻辑上可分为两部分 个位上的数字和个位以前的全部数字 将个位以前的全部数字看成一个整体 则为了反向输出这个大于10的正整数 可按以下步骤 a 输出个位上的数字 b 将个位除外的其他数字作为一个新的整数 重复a步骤的操作 其中b问题只是对原问题在规模上进行了缩小 递归 所以 可将反向输出一个正整数x的算法归纳为 if x为一位整数 输出x else 输出x的个位数字 对剩余数字组成的新整数重复 反向输出 操作 莆田学院现代教育技术中心2004年3月 程序如下 includevoidmain voidprintn intx intn printf Inputn scanf d 例六 反向输出一个整数 非数值问题 反向输出整数x voidprintn intx 若x为一位整数 if x 0 莆田学院现代教育技术中心2004年3月 例七 汉诺塔 TowerofHanoi 问题 也是一个非数值问题 P161例8 9 分析方法 简化问题 设盘子只有一个 则本问题可简化为a b 对于大于一个盘子的情况 逻辑上可分为两部分 第n个盘子和除n以外的n 1个盘子 如果将除n以外的n 1个盘子看成一个整体 则要解决本问题 可按以下步骤 a 将a杆上n 1个盘子借助于b先移到c杆 a c n 1 a c b b 将a杆上第n个盘子从a移到b杆 a bc 将c杆上n 1个盘子借助a移到b杆 c b n 1 c b a 莆田学院现代教育技术中心2004年3月 五 变量的存储类型 模块化设计要求研究不同模块 函数 源文件 间变量的关系 变量两大属性 数据类型 存储类别 1 数据类型 复习 通过变量说明 定义 来规定其数据类型 格式数据类型关键字变量名如chara intb c floatx y 为什么使用变量前要先对其数据类型进行 说明 好比看电影前先买票订座 预留存储空间 如char型为1个字节 int型为2个字节 确定存储方式 如char型存放ASCII值 int型存放补码值 莆田学院现代教育技术中心2004年3月 复习 数据存储形式字符型按ASCII码存储 其余以补码存储 一个变量的数据类型定义后 就规定了该变量只能存储相应类型的数据 如定义intx 则x只能存放整型数 如果x 3 14159 会被自动转为整型存放 莆田学院现代教育技术中心2004年3月 五 变量的存储类型 变量两大属性 数据类型 存储类别 2 存储类别P172规定了变量在计算机内部的存放位置 决定变量的 寿命 何时 生 何时 灭 一个完整的变量说明格式如下 存储类别数据类型变量名如staticintx y C程序的存储类别有 register型 寄存器型 auto型 自动变量型 static型 静态变量型 extern型 外部变量型 莆田学院现代教育技术中心2004年3月 C程序的变量存储位置 变量的生存期静态存储区中的变量 与程序 共存亡 动态存储区中的变量 与函数 共存亡 寄存器中的变量 同动态存储区 莆田学院现代教育技术中心2004年3月 C程序的变量存储类别 变量的生存期静态存储区中的变量与程序 共存亡 动态存储区中的变量与函数 共存亡 寄存器中的变量同动态存储区 register型 寄存器型 变量值存放在运算器的寄存器中 存取速度快 一般只允许2 3个 且限于char型和int型 通常用于循环变量 在微机的TurboC中实际上自动转为auto型 auto型 自动变量型 变量值存放在主存储器的动态存储区 堆栈方式 优点 同一内存区可被不同变量反复使用 以上两种变量均属于 动态存储型 即调用函数时才为这些变量分配单元 函数调用结束其值自动消失 莆田学院现代教育技术中心2004年3月 C程序的变量存储类别 变量的生存期静态存储区中的变量与程序 共存亡 动态存储区中的变量与函数 共存亡 寄存器中的变量同动态存储区 static型 静态变量型 变量值存放在主存储器的静态存储区程序执行开始至结束 始终占用该存储空间 extern型 外部变量型 同上 其值可供其他源文件使用以上两种均属于 静态存储 性质 即从变量定义处开始 在整个程序执行期间其值都存在 都可用 未说明存储类别时 函数内定义的变量默认为auto型函数外定义的变量默认为extern型 莆田学院现代教育技术中心2004年3月 六 局部变量与全局变量P168 1 局部变量 函数内部或复合语句内定义的变量 auto 默认 所在函数调用结束时 其值自动消失局部变量register如不赋初值 取不确定值为初值static所有函数调用结束 其值仍保留如不赋初值 取初值为0 数值型 或空格 字符型 所有形参都是局部变量 局部变量只在本函数或本复合语句内才能使用 在此之外不能使用 视为不存在 main函数也不例外 莆田学院现代教育技术中心2004年3月 main inta 2 i clrscr for i 0 i 3 i printf 4d f a f inta intb 0 staticintc 3 b c returna b c 例一 求程序运行结果 变量跟踪main f函数aibcf a 200 14710 15820 169 结果 789 如果去掉static呢 结果 777 莆田学院现代教育技术中心2004年3月 main intk 4 m 1 p clrscr p func k m printf d p p func k m printf d p func inta intb staticintm 0 i 2 i m 1 m i a b returnm 例二 求程序运行结果 变量跟踪main func函数kmabmi41410 82 341418 173 12 结果 8 17 如果去掉static呢 结果 8 8 莆田学院现代教育技术中心2004年3月 includemain inta 3 b 2 c 1 intb 5 c 12 c b 2 printf a d b d c d n a b c a c printf a d b d c d n a b c 例二 求程序运行结果 结果 a 3 b 5 c 2a 5 b 2 c 1 莆田学院现代教育技术中心2004年3月 六 局部变量与全局变量P169 2 全局变量 在函数之外定义的变量 extern 默认 允许本源文件中其他函数及其他源文件使用全局变量static只限本源文件中使用 所有全局变量加不加static 都属于静态存储 如不赋初值 取初值为0 数值型 或空格 字符型 注意与函数内部定义的static型局部变量的区别 莆田学院现代教育技术中心2004年3月 2 全局变量 在函数之外定义的变量 有效作用范围 从定义变量位置开始直到本源文件结束如果需要将全局变量的作用范围扩展至整个源文件 法1全部在源文件开头处定义法2在引用函数内 用extern说明法3在源文件开头处 用extern说明 例三 求程序运行结果externintx y main clrscr printf x d y d n x y intx 100 y 200 结果 x 100 y 200 去掉第一行试试 如果要将全局变量作用范围扩展到其他源文件 只需在使用这些变量的文件中对变量用extern加以说明 莆田学院现代教育技术中心2004年3月 inta 3 b 5 max inta intb intc c a b a b returnc main inta 8 printf d n max a b 例四 求程序运行结果 如果主函数中没有inta 8 结果 结果 5 如果让主函数中inta 4或a 1 结果 结果 均为5 莆田学院现代教育技术中心2004年3月 voidnum externintx y inta 15 b 10 x a b y a b intx y main inta 7 b 5 x a b y a b num printf d d n x y 例五 求程序运行结果 如果第二行不加上extern呢 结果 5 25 结果 12 2 莆田学院现代教育技术中心2004年3月 inta fun inti a 2 i returna main inta 10 clrscr printf d d n fun a a 例六 求程序运行结果 结果 20 10 莆田学院现代教育技术中心2004年3月 七 编译预处理 编译预处理 P187 宏定义 文件包含 条件编译 编译 C编译系统对源程序进行 词法和语法分析 代码生成 优化 OBJ文件 编译预处理 编译前对源程序进行一些预加工 改善程序设计环境 模块化设计 编译预处理命令均以 开头 未尾不加分号可出现在程序的任何位置 其作用范围 出现点至所在源程序未尾 莆田学院现代教育技术中心2004年3月 C语言程序的加工过程 莆田学院现代教育技术中心2004年3月 七 编译预处理 1 宏定义格式 define宏名宏体宏名和宏体均为字符串 前者必须符合标识符命名规则 预处理时在程序中用宏体替换宏名 注意 可以用 undef宏名终止该宏名的作用范围 P189 莆田学院现代教育技术中心2004年3月 七 编译预处理 定义符号常量 例一 defineM3 defineN M 1 defineNNN N 2main clrscr printf NN d NN printf 5 NN d n 5 NN 结果 NN 8 5 NN 40 讨论 如果第二行改为 defineNM 1 结果 NN 6 5 NN 18 莆田学院现代教育技术中心2004年3月 七 编译预处理 定义符号常量 例二 defineOK1main printf OK d n OK 结果 OK 1 讨论 程序中用双括号括起来的字符串中的字符即使与宏名相同 也不进行替换 莆田学院现代教育技术中心2004年3月 七 编译预处理 带参数的宏定义格式 define宏名 参数表 宏体 例二 definePI3 14159 defines r PI r rmain floata 1 sum sum s a printf r 0f s f n a sum 结果 r 1 s 3 141590 莆田学院现代教育技术中心2004年3月 七 编译预处理 带参数的宏定义 例三 definePT5 5 defines A PT A Amain inta 1 b 2 printf 4 1f n s a b 结果 9 5 讨论 注意s a b 不是函数 它不做任何计算 如果是函数 则s a b 为s 3 结果49 5 s a b 5 5 1 2 1 2 9 5 莆田学院现代教育技术中心2004年3月 七 编译预处理 带参数的宏定义 例四 选择正确答案 include stdio h defineSUM y 1 ymain intx 2 printf d n SUM 5 x A 10B 11C 12D 15 结果 B 莆田学院现代教育技术中心2004年3月 2 文件包含P194 include标准方式只按标准方式 系统存放C库函数头文件所在目录 查找所要包含的文件对TC 默认只在 tc include目录下查找 include 先在源文件所在目录找指定头文件 若无再按标准方式找 更保险 莆田学院现代教育技术中心2004年3月 文件包含命令的处理过程 首先寻找所要求包含的文件 如果找到 就用这个文件的全部内容取代当前文件里的这个包含命令行 被替换进来的文件里仍然可以有文件包含等预处理命令行 这些预处理也会被处理 莆田学院现代教育技术中心2004年3月 文件包含示意图 include include 源程序area c 用户编写 头文件stdio h 系统提供 头文件math h 系统提供 area exe 可执行程序 stdio hmath harea c 编译 连接 第一章例一中 area c文件本身只有12行 stdio h有187行 math h有107行 实际上stdio h本身还包括一个24行的头文件stdarg h 文件包含 是在编译后连接时 包含 进可执行程序的 比较 area c1kb area obj1kb area exe26kb stdarg h stdio hstdarg hmath harea c 莆田学院现代教育技术中心2004年3月 3 条件编译P196 根据条件决定是否编译某一组语句 常用形式 如果标识符被定义过 如果标识符未被定义过 ifdef标识符 ifndef标识符程序段1程序段1 编译此程序段 else else else部分可省略 程序段2程序段2 反之 编译此程序段 endif endif 此处指标识符用 define等命令定义过 莆田学院现代教育技术中心2004年3月 3 条件编译P196 if表达式 如果表达式为真 程序段1 编译程序段1 else程序段2 否则 编译程序段2 endif 如果用 if表达式程序段1else程序段2 亦可实现以上功能 但程序段1 2均要编译 如果它们比较大 生成的exe文件就很大 莆田学院现代教育技术中心2004年3月 3 条件编译P196 例一 defineDEBUG0main inta 10 b 20 c clrscr c a b ifdefDEBUGprintf a d b d n a b endifprintf c d n c 结果 a 10 b 20c 0 讨论 如果 defineDEBUG呢 结果不变 如果没有 define行呢 只输出c 0 莆田学院现代教育技术中心2004年3月 课堂提问 1 如何判断一个变量是局部变量还是全局变量 2 定义一个变量时 如果没有规定存储类型 其默认的存储类型是什么 3 如果程序中有这样一个语句staticintx 出现在程序的不同位置其含义是否相同 其初值是多少 莆田学院现代教育技术中心2004年3月 课堂提问 4 以下程序运行时出错提示为 undefinedsymbol x infunctionmain如何改正 程序 main x 2 printf d n x intx 法1 将intx 放到主函数之内法2 将intx 放到主函数之上法3 在主函数之内加一语句e

温馨提示

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

评论

0/150

提交评论