《C语言程序设计》第6章函数.ppt

上传人:sh****n 文档编号:7426381 上传时间:2020-03-21 格式:PPT 页数:91 大小:2.34MB
返回 下载 相关 举报
《C语言程序设计》第6章函数.ppt_第1页
第1页 / 共91页
《C语言程序设计》第6章函数.ppt_第2页
第2页 / 共91页
《C语言程序设计》第6章函数.ppt_第3页
第3页 / 共91页
点击查看更多>>
资源描述
第六章函数 结构化程序设计基础 6 1函数的概念 结构化程序设计要求一种自顶向下的设计方法 也就是将复杂的系统划分为相对独立的 功能较为单一的子系统的组合 每个子系统称为模块 在C语言中表现为函数 复杂问题 main a b c a1 a2 b1 b2 c1 c2 各模块之间的关系称之为接口 优点 函数实现的功能单一完整 可以独立设计 单独调试 易于维护 通用性强 例6 1 通过函数求两个数的最大值 example6 1通过函数求最大值 includeintGetMax int int 函数的原型声明 voidmain void inta b c d 说明变量 scanf d d d 函数的分类及调用过程 函数可分为标准库函数和用户自定义函数 标准库函数是C语言系统提供的一系列的实现特定功能的模块 如已经学习过的输入输出函数 数学函数 字符串处理函数等等 对于用户自定义函数 用户必须完整地定义函数的接口以及函数的实现细节 然后通过数据接口调用函数以实现所需的功能 用户自定函数的使用 应包括两个过程 函数的定义 函数定义的作用就是确定函数的名称 接口 以及内部的实现细节 函数的调用 函数的调用是根据数据接口的定义 将实际数据传递给函数 函数执行其功能得到所需结果的过程 例6 2 通过标准函数及用户定义函数实现求字符串中含有的实际字符的数量 输出结果 example6 2通过函数输出字符串的实际长度 include includeintGetStringLength char p 用户函数原型声明 voidmain void charpszStr 80 intiStrLen gets pszStr 调用字符输入函数输入字符串 iStrLen strlen pszStr 调用标准库函数求字符串长度 printf Thestringlengthis d n iStrLen gets pszStr iStrLen GetStringLength pszStr 调用用户定义函数求字符串长度 printf Thestringlengthis d n iStrLen 用户定义求字符串长度函数 函数名GetStringLength 参数指向字符的指针p 返回值字符个数 整型 intGetStringLength char p intiCount iCount 0 while p 0 iCount p returniCount 6 2函数的定义和调用 函数的基本结构 includevoidmain void inta b c scanf d d 主函数 函数体 函数的类型 返回值的类型 函数名 用标识符命名 引用函数的标志 并得到结果 函数参数说明表 定义 引用 1 函数的名称 2 函数的类型 3 函数的形式参数 4 函数体 函数定义的目的 函数定义是要确定如下四点 名称函数的类型函数的参数函数的功能 函数的定义 格式 type函数名 参数说明表 内部说明语句 功能语句 如果函数有返回值 应含有return语句 intmax intx inty intz z x y x y return z 说明 函数不能嵌套定义 但可以嵌套引用 包括引用自己 intmax intx inty intcx intc intd Error 函数如果无返回值 type应说明为空类型void 函数无参数应定义成void voidBell void printf 007 函数的调用 调用形式 函数名 实参表 一般引用方式有三种 语句形式 max a b 表达式形式 c max a b 2 函数参数 c max a max b d 例6 3 函数调用举例 通过函数求xn 在主函数中输入x及n 并调用该函数 输出结果 example6 3函数调用举例 includefloatGetPow float int 函数原型声明 voidmain void floatx y intn printf Pleaseinputx n scanf f d 返回累乘积 调用过程 voidmain void inta b c scanf d d 先计算实参的值 从右向左向函数传递调赋值给形参 2 3 ab Xy 2 3 转移在函数中运行 执行到一个return语句 将返回表达式的值 由函数名带回给调用函数 z 3 函数如果没有return语句 由最后一个 返回一个不确定的值 例6 4 定义返回两个浮点数之和的函数 在主函数中输入数据 并调用函数 输出结果 example6 4通过函数求两个浮点数之和 includefloatfAdd float float 函数原型声明 voidmain void floata b c printf Pleaesinputtwonumbera b scanf f f 关于返回值的几点说明 函数可以通过一个return语句返回一个值 也可以不返回值 此时应在定义函数时用void类型加以说明 函数中可以出现多个return语句 遇到一个return语句 则返回值 且返回调用函数 继续执行 intmax intx inty if x y returnx returny 返回值的类型应与函数的类型一致 如不一致 以函数类型为准 先转换为函数类型后 再返回 intmax void floatz returnz z先转化为整型 为了确保参数和返回值类型正确 一般须在函数调用前对其类型和参数的类型加以说明 该说明称之为原型声明 intimax int int voidmain void intx y z z imax x y 原型声明语句 加 举例 通过函数求xn includedoublepow float int voidmain void inti for i 1 i 9 i printf d f n i pow 2 5 i doublepow floatx intn inti doublep 1 for i 1 i n i p p x return p 原型声明 定义函数 调用函数 专题 函数间的数据传递 函数在调用的过程中 调用函数和被调函数存在数据的相互传递 数据的传递包括两个方面 将值传递给被调函数 将被调函数的结果返回给调用函数 调用函数 被调函数 向被调函数传递值 将结果返回给调用函数 函数间数据传递方式 通过函数参数传值或传地址 通过返回值传递结果 通过全局变量传递参数或结果 传值方式 通过实参与形参的结合 将数据值传递给形参 形参的改变不影响实参 includeintsplus int int voidmain void inta b c scanf d d 调用函数 被调函数 x y形参 a b实参变量的值 传递参数 a 2 b 3 y x 3 2 z 6 返回值 例6 5 参数值传递方式说明举例 example6 5函数参数值传递实例 includevoidExamFun int int 函数原型声明 voidmain void inta b printf 请输入两个整数a b scanf d d 传地址方式 形参定义为指针 实参为变量的地址 被调函数通过地址可以修改地址对应的变量 includevoidswap int int voidmain void inta b scanf d d 用函数实现两个变量a b值的交换 4 6 a b 2000H 2400H x y 2400H 2000H 参数变量是否可以实现交换 例6 6 采用传递地址方式 通过函数实现变量值的交换 example6 6 函数参数采用地址传递方式 通过函数实现调用函数变量的交换 includevoidExchange int int 函数原型声明 参数为指向整型的指针 voidmain void inta b printf 请输入a b scanf d d 通过间接运算 实现形参x y指向对象的交换 函数的原型声明 如果被调函数是以下三种情况 必须声明 1 被调函数定义在调用函数之后 2 被调函数是标准库函数 3 被调函数从其他文件连接加入 函数的原型声明语句可以取两种形式 只有参数类型而不带参数名的形式 带有参数名的形式 函数的原型声明的说明 函数原型声明最好写在主函数之外的程序开始处 如果程序较大 并有自己的头文件时 函数原型声明应统一写在头文件中 原则上整型函数 定义在调用语句函数之前的函数可不加原型声明 标准库函数的原型声明都包含于函数对应的头文件中 因此 使用标准库函数时 应在程序的开始包含对应的头文件 6 3变量的作用域与生存期 变量是内存数据的抽象 即将内存地址 数据表示抽象成一个符号 此外 变量还有存储类型 存储类型确定了变量在时间上的生存期和空间上的作用域 按空间的作用域可分为 全局变量 局部变量 按时间的生存期可分为 静态存储变量 动态存储变量 变量的四种存储类型 自动类型auto 寄存器类型register 静态类型static 外部类型extern 变量的说明格式 存储类型类型变量名表 确定变量在内存中的表示方法 确定变量的生存期和作用域 该项省略表示auto存储类型 auto存储类型 局部变量 定义在复合语句的开始处 块内生存 块内有效 includevoidmain void autointa b scanf d d ab的作用域 iTemp的作用域 生存期 执行到复合语句建立内存变量 执行出复合语句变量消亡 iTemp register存储类型 局部变量 作用域和生存期和auto相同 差别在于 如果CPU内部的寄存器空闲 则使用寄存器作为变量的存储单元 以提高速度 主要用于循环变量 且应该是整型和字符型 例6 7 通过函数求两个数的较小值 example6 7通过函数求两个数的较小值 includeintiGetMin int int 函数原型声明 voidmain void inta b c printf Pleaseinputtwonumbera b scanf d d 局部static 静态 存储类型 作用域 在说明的复合语句内引用 出了复合语句不可见 生存期 从程序开始运行直到程序结束 执行出 时 原值并不消失 只是不能引用 voidrow void voidmain void intb for b 1 b 9 b row voidrow void inta 1 intb for b 1 b 9 b printf 5d a b printf n a CHAP6EX6 static CHAP6EX5 说明静态变量 a的作用域 生存期从编译开始到程序结束 外部变量 extern存储类型 全局变量 外部变量是定义在任何模块之外的变量 也称为全局变量 作用域 从说明变量开始直到文件结束 生存期 在程序的整个执行过程中 任何函数对外部变量的修改都会影响其他函数对外部变量引用时的值 includevoidadd void inta b c voidmain void scanf d d 全局变量 作用域 关于全局变量的几点说明 全局变量可以通过说明改变其作用域 voidmain inti i为全局变量 voidmax inta intb 作用域 externi 新的作用域 全局变量可以被不同的文件共享 file1 cfile2 cinta externinta 文件1定义的外部变量 文件2通过说明使用文件1的外部变量 如果只希望在本文件中使用 可以加static说明 static 关于全局变量的几点说明 模块设计的原则 内聚性强 耦合性弱 全局变量的使用占用内存资源且增加模块的耦合性 因此 应尽量不使用全局变量 当模块中出现和全局变量同名的局部变量时 局部变量在模块中优先 inta voidmain void a 5 voidfun inta a 6 全局变量应用举例 用函数交换两个全局变量的值 includeinta b voidmain void scanf d d a b外部变量 a b 全局变量的副作用 includeinti voidprt void voidmain void for i 0 i 5 i prt voidprt void for i 0 i 5 i printf c printf n 函数的作用 打印五个 再回车 几次调用函数 i 0 i 0 i 0 i 0 i 0 i 1 i 2 i 3 i 4 i 5 i 5 i 5 i 5 i 5 全局变量传递参数 全局变量可以被调用函数和被调函数共享 任何函数对全局变量的修改都会影响到其他函数所见的全局变量的值 includeintc voidmain void inta b scanf d d 说明全局变量 c 6 说明 应尽量少用全局变量 应使函数内部的内聚性强 函数之间的偶合性弱 例6 8 使用全局变量 通过函数求两个浮点数的积 example6 8使用全局变量通过函数求两个浮点数的积 includefloatMul void 函数原型声明 floata b 在所有函数之外说明 a b为全局变量 voidmain void floatc printf Pleaseinputtwonumbera b scanf f f 例6 9 函数中的auto存储类别变量的性质示例 example6 9函数中auto存储类别变量的性质 includevoidMul void 函数原型声明 voidmain void intb for b 1 b 9 b Mul 循环9次调用Mul函数 voidMul void 函数定义 inta 1 具有auto存储类别的变量 inti for i 1 i 9 i printf 5d a i printf n a 例6 10 在函数中使用register存储类别以提高效率 example6 10函数中使用register存储类别求级数1 2 n includeintSer int 函数原型声明 voidmain void intn sum printf Pleaseinputn scanf d 例6 11 在函数中使用static存储类别实现输出9 9的乘法表 example6 11函数中static存储类别变量的性质 includevoidMul void 函数原型声明 voidmain void intb for b 1 b 9 b Mul 循环9次调用Mul函数 voidMul void 函数定义 staticinta 1 具有static存储类别的变量 inti for i 1 i a i printf 5d a i printf n a 静态局部变量本次调用递增 下次调用维持 例6 12 动态存储及静态存储变量的初值案例 example6 12动态存储与静态存储的初值 includeinta 全局变量为静态存储 初值为0 voidmain void autointb registerintc 动态存储变量初值随机 staticintd 静态存储初值为0 printf a d nb d nc d nd d n a b c d 例6 13 全局变量与局部变量同名的处理 example6 13全局变量与局部变量同名的处理方式示例 includeintFun int inta 2 说明全局变量 voidmain void intc a 6 局部变量a与全局变量同名 局部变量优先 printf Thisaislocation d n a c Fun a a是本函数说明的局部变量 初值为6 printf c d n c intFun intx 函数定义 printf Thisaisextern d n a 本函数a为全局变量 returna x 例6 14 全局变量在程序中的副作用 example6 14全局变量的副作用 includeinti 说明全局变量 voidPrt void 函数原型声明 voidmain void for i 0 i 5 i Prt printf End n voidPrt void 定义函数 for i 0 i 5 i printf c 循环5次 打印5个 printf n 换行 6 4数组与函数参数 问题 引用数组时只能引用数组元素 如果用参数传递数组元素 则函数需要参数的量太多 为了解决此问题 可以通过指针传递数组的地址 一维数组作为函数参数定义有三种方式 形参为指针 intave int p 形参为无下标数组 intave inta 形参为有下标数组 intave inta 10 3种数组作为函数参数 一维数组作为函数参数 二维数组作为函数参数 字符数组作为函数参数 举例 通过函数求数组元素的平均值 includefloatmean int int voidmain void intarray 10 1 2 3 4 5 6 7 8 9 10 floatav av mean array 10 printf av f n d av array 0 floatmean int data intnum inti floatavg 0 for i 0 i num i avg data avg num return avg 指针法 指针法 形参为无下标数组 无下标数组 intdata data 0 1 data i intdata 10 形参为有下标数组 形参为有下标数组 说明 三种方法的实质都是传递地址 可以混用 形参的任何改变都影响实参 函数中对数组的操作 下标不要超过数组的下标范围 chp6ex2 举例 通过函数将字符串中的大写字母转换为小写字母 includevoidStrLow char ps voidmain void charszStr 80 gets szStr StrLow szStr puts szStr voidStrLow char ps inti for i 0 ps i 0 i if ps i a Endofif Endoffor 例6 15 通过函数求数组的最大值 主函数调用并输出结果 example6 15通过函数求数组的最大值一维数组作为函数参数 includeintGetMax int int 函数原型声明 voidmain void inta 10 51 99 80 75 66 30 95 86 74 68 intiMax iMax GetMax a 10 printf nMaxofais d n iMax 函数定义 参数1 p指向整型的指针 用于传递数组的首地址 参数2 num表示数组元素的个数 返回值 数组元素的最大值 intGetMax int p intnum intmax i max p 假定第一个元素为最大值 for i 1 imax max p i returnmax 例6 16 通过函数将数组按升序排序 主函数调用并输出结果 example6 16通过函数对数组排序一维数组作为函数参数 includevoidSort int int 函数原型声明 voidmain void inti inta 10 51 99 80 75 66 30 95 86 74 68 for i 0 i 10 i printf 4d a i 输出原始数据 printf n Sort a 10 调用函数对数组排序 for i 0 i 10 i printf 4d a i 输出排序结果 printf n 函数定义 参数1 x无下标数组 用于传递数组的首地址 参数2 num数组元素的个数 返回值 无 voidSort intx intnum inti j for i 0 ix j inttemp 说明局部临时变量 用于交换 temp x i x i x j x j temp 例6 17 通过函数求3行4列二维数组所有元素的累加和 在主函数调用并输出结果 example6 17 通过函数求二维数组所有元素的累加和 二维数组作为函数参数 includeintAcc intx 4 函数原型声明 voidmain void inti j inta 3 4 1 2 3 4 5 6 7 8 9 10 11 12 intsum for i 0 i 3 i for j 0 j 4 j printf 3d a i j printf n sum Acc a 调用函数 二维数组数组名作为实参传递首地址 printf Sum 4d n sum 输出结果 函数定义 参数 x省略行数的二维数组 用于传递数组的首地址 返回值 所有元素的累加和 intAcc intx 4 形参x为指针 inti j intsum sum 0 for i 0 i 3 i for j 0 j 4 j sum x i j 通过形参表示的a i j returnsum 例6 18 通过函数将字符串中的所有小写字母转换成对应的大写字母 在主函数调用并输出结果 example6 18 通过函数将字符串中的所有小写字母转换成对应的大写字母 字符数组作为函数参数 includevoidStrUpr char 函数原型声明 参数为指向字符的指针 voidmain void charstr 80 printf InputSourceString gets str StrUpr str 调用函数 字符数组名作为实参 传递数组的首地址 printf TransformedString puts str 函数定义 函数功能 将字符串中的小写字母转换成对应的大写字母 函数名 StrUpr 函数参数 s用于传递数组的首地址 voidStrUpr char s while s 0 if s a 指针指向下一字符 6 5返回指针的函数 概念 函数可以返回一个值 也可以返回一个地址 指针 如果函数返回地址 该函数称为返回指针的函数 定义 type 函数名 形参表 int max int a int b 例 通过返回最大值的地址求最大值 includeint pMax int int voidmain void inta b p scanf d d 例 通过函数在某字符串中搜索一个特定的字符第一次出现的地址 在主函数调用并输出结果 example6 19 在字符串中查找给定的字符第一次出现的位置 返回其地址 include includechar Search char char 函数原型声明 voidmain void charc p str 80 gets str scanf c 续例 函数名 Search 函数参数1 p指向字符的指针 用于传递字符串的首地址 函数参数2 ch字符变量 用于传递待查找的字符 函数返回值 找到 返回其地址 否则 返回NULL char Search char s charch char p NULL while s 0 if s ch p s 找到 保留地址 break else s 继续 指针后移 returnp 例6 19 通过函数在某字符串中搜索一个特定的字符第一次出现的地址 在主函数调用并输出结果 example6 19 通过函数在字符串中查找给定的字符第一次出现的位置 返回其地址 include includechar Search char char 函数原型声明 voidmain void charc p str 80 gets str scanf c 函数名 Search 函数参数1 s指向字符的指针 用于传递字符串的首地址 函数参数2 ch字符变量 用于传递待查找的字符 函数返回值 找到 返回其地址 否则 返回NULL char Search char s charch char p NULL while s 0 if s ch p s 找到 保存地址 break else s 继续 指针后移 returnp 6 6指向函数的指针 概念 函数为程序模块 函数要装载到内存中 函数在内存中其首地址称为函数的入口地址 用函数名表示 C语言可以通过指针指向函数的入口地址 从而实现通过指针对函数的调用 c max a b intmax intx inty return x y x y 2400 指向函数指针的定义 type p 函数的类型 指针 函数 使用过程 定义函数和指向函数的指针 指针指向函数 p funname 通过指针引用函数 格式 p 实参表 举例 求a b的最大值 includeintlmax int int voidmain void inta b c int funp funp lmax scanf d d 说明指向函数的指针 指针指向函数 funp lmax 通过指针引用函数 lmax 举例 通过参数传递 求a b之和 之差 includeintplus int int intsub int int intfuna int int int int int voidmain void inta b c scanf d d intplus intx inty return x y intsub intx inty return x y 例6 20 通过指向函数的指针调用 求两个数较大值的函数 在主函数中调用并输出结果 example6 20通过指向函数的指针调用求两个数较大值的函数 includeintGetMax int int 函数原型声明 voidmain void inta b c int funp 说明指向函数的指针 funp GetMax 指针指向函数 printf Pleaseinputtwonumbera b scanf d d 例6 21 指向函数的指针作为函数参数 通过参数传递不同的函数入口地址 实现求两个浮点数的四则运算 在主函数调用并输出结果 example6 21 将函数的指针作为函数的参数 实现对多个函数的调用 includefloatGenFun float p float float floatx floaty floatGetAdd floatx floaty floatGetSub floatx floaty floatGetMul floatx floaty floatGetDiv floatx floaty 函数原型声明 voidmain void floata b c printf Pleaseinputtwofloatnumbera b scanf f f 分别调用GenFun 并将各函数的函数名和参数传递给GenFun c GenFun GetAdd a b 通过GenFun调用求和函数 printf a b f n c c GenFun GetSub a b 通过GenFun调用求差函数 printf a b f n c c GenFun GetMul a b 通过GenFun调用求积函数 printf a b f n c c GenFun GetDiv a b 通过GenFun调用求商函数 printf a b f n c 函数名 GenFun 功能 通过参数传递函数的入口地址 实现多个函数调用 参数 p指向函数的指针 x y浮点型 floatGenFun float p float float floatx floaty floatz z p x y 调用p指向的函数 returnz floatGetAdd floatx floaty 两个浮点数求和函数 return x y floatGetSub floatx floaty 两个浮点数求差函数 return x y floatGetMul floatx floaty 两个浮点数求积函数 return x y floatGetDiv floatx floaty 两个浮点数求商函数 return x y 6 7递归函数 概念 函数直接或间接地自我调用称为递归函数 intfun1 intx z fun1 y intfun1 intx intfun2 intt z fun2 y c fun1 a 直接引用自身 间接引用自身 递归在没有控制条件的情况下是无穷的递归 voidmain void printf n main 只有通过控制条件 使递归调用终止 才具有应用价值 voidmain void printf n ch getchar if ch 9 main 递归举例 求n n 1n 0或n 1 n n 1 n 1 f n 1n 0或n 1 nf n 1 n 1 includelonglfac long voidmain void longi x scanf ld lfac 4 4 lfac 3 3 lfac 2 2 flac 1 2 1 3 2 1 4 3 2 1 递推 回归 chp6ex7 例 通过递归求斐波那契数列 example6 23通过递归函数求斐波那契数列 includelongf intn 函数原型声明 voidmain void longlValue intn printf Pleaseinputanumber do scanf d 续例 函数名 f 功能 递归求斐波那契数列 参数 n 整型 返回值 项序为n的递归求斐波那契数列值 长整型 longf intn longy if n 0 y 0 elseif n 1 y 1 elsey f n 1 f n 2 returny 例6 22 通过递归实现求n 的函数 在主函数中输入n 并输出结果 example6 22通过递归函数求n includelongGetFact intn 函数原型声明 voidmain void longlFacValue intn printf Pleaseinputanumber do scanf d 函数名 GetFact 功能 递归求n 参数 n 整型 返回值 n 长整型 longGetFact intn longy if n 0 n 1 y 1 结束递归并开始返回 elseif n 1 y n GetFact n 1 递归调用 returny 例6 23 通过递归求斐波那契数列 斐波那契数列定义为 example6 23通过递归函数求斐波那契数列 includelongf intn 函数原型声明 voidmain void longlValue intn printf Pleaseinputanumber do scanf d 函数名 f 功能 递归求斐波那契数列 参数 n 整型 返回值 项序为n的递归求斐波那契数列值 长整型 longf intn longy if n 0 y 0 elseif n 1 y 1 elsey f n 1 f n 2 returny 6 8主函数参数 如DOS命令 COPYA S DOCC 命令 命令对象 命令参数 C支持由主函数main 在程序执行时 从操作系统接收传递的参数 并记录参数供程序处理 主函数一般有两个参数 voidmain intargc char argv 整型变量 记录包括命令行在内的字符串个数 指向字符的指针数组 记录所有参数字符串的地址 举例 回显命令行参数 includevoidmain intargc char argv inti for i 1 i argc i printf s c argv i i argc 1 n testHowareyou C argc4 例6 24 按行输出主函数参数中字符串的内容 example6 24主函数参数应用 includevoidmain intargc char argv inti for i 1 i argc i puts argv i 6 9编译预处理 C语言除了说明语句 执行语句及控制语句外 还有一类编译预处理语句 该类语句的作用是在编译时对程序作一定的处理 满足特定的处理要求 编译预处理是C语言的重要特征 编译预处理语句的语法形式 关键词参数表 编译预处理语句不用 作为结束标志 宏定义预处理 不带参数的宏定义 作用 定义常量名 提高程序的可读性 便于修改 格式 define宏名字符串 definePI3 1415926voidmain void floatr scanf f 编译时用字符串替代宏名 3 1415926 说明 宏名一般用大写 编译时用字符串无条件替代宏名 definePI3 1415926 PI r r 3 1415926 r r 宏名的有效范围 从定义到程序尾 也可以通过 undef修改定义范围 defineG9 8voidmain void undefG G的范围 可以在宏定义的字符串中使用已定义的宏名 字符串中的宏名不替换 defineR3 0 definePI3 14159 defineSPI R R printf S f S 不替换 带参数的宏定义 格式 define宏名 参数表 含参数的字符串 defineS a b a b area S 4 3 替换过程 将实际参数替换宏定义的参数 替换字符串中的参数 替换整个宏 4 3 带参的宏与函数的区别 带参宏不分配内存单元 不返回值 只是在编译时按规则替换 关于带参宏的说明 要严格按格式书写 否则会造成错误 defineS a b a bS 3 4 被替换成 a b a b 3 4 参数有可能用到表达式时 参数字符要加 defineS r PI r rS a b 替换为 PI a b a b defineS r PI r r S a b 替换为 PI a b a b 例6 25 通过宏定义将圆周率定义成宏名PI 输入一个圆柱体的半径和高 输出其体积和底面积 example6 25无参数的宏的应用 include definePI3 1415926 定义圆周率为PI voidmain void doubler h r为底半径 h为高 doublefArea fV fArea为底面积 fV为体积 printf Pleaseinputthecolumn sradius height scanf lf lf 例6 26 定义带参的宏 以实现求圆锥体的体积 输入一个圆锥体的半径和高作为宏的参数 输出其体积 example6 26定义带参的宏实现求圆锥体的体积 include definePI3 1415926 定义无参宏 defineVTAPER r h PI r r h 3 定义有参宏 voidmain void doubler h fV printf Plraseinputr hofataper scanf lf lf 文件包含 格式 include include 被包含的文件名 表示编译系统定义路径 表示用户指明路径 作用 将指定的文件的内容和当前文件一起编译 说明 一个 include只能包含一个文件 被包含文件可以嵌套包含文件 一般将宏定义及函数的原型声明放在包含文件中 被包含的文件一般扩展名为 h 称为头文件 文件包含举例 求半径为r的园面积 园周长 include my h voidmain void floatr fArea fLen scanf f include definePI3 1415926floatS float floatL float 例6 27 文件包含举例 通过两个函数分别计算一个半径为r 高为h的圆柱体的体积和表面积 在主函数输入r h 调用函数输出结果 example6 27文件包含举例 include my h 包含my h voidmain void doubler h fArea fV printf Pleaseinputr h scanf lf lf 函数定义 参数 r圆柱体的底半径 h圆柱体的高 功能 返回圆柱体的表面积 doubleColArea doubler doubleh return2 PI r r 2 PI r h 函数定义 参数 r圆柱的底半径 h圆柱的高 功能 返回圆柱体的体积 doubleColVol doubler doubleh returnPI r r h 条件编译 C语言可以通过条件控制 让编译系统编译不同的程序段 从而提高程序的移植性并方便调试 条件编译有三种形式 ifdef标识符programseg1 elseprogramseg2 endif ifndef标识符programseg1 elseprogramseg2 endif 1 2 3 if表达式programseg1 elseprogramseg2 endif 条件 满足 编译程序段1 不满足 编译程序段2 举例 通过条件编译选择求最大值或最小值 includevoidmain void inta b scanf d d endif defineMAX includevoidmain void inta b scanf d d 例6 28 利用条件编译 实现两个数求最小值或求最大值的程序 example6 28条件编译 include defineMAX 定义宏 voidmain void inta b printf Pleaseinputtwointegera b scanf d d endif 6 10模块化程序设计方法 模块化程序设计是结构化程序设计方法的重要组成部分 所谓的模块化就是通过函数将一个大而复杂的问题分解成小而简单的问题的组合 解决每个小而简单的问题相对容易 从而使整个系统的复杂度降低 模块是指实现某个特定功能的一个或几个程序单位 在C语言中表现为函数 函数可以独立设计 单独调试 从而简化了系统的实现 由于模块可以单独设计 独立编译 因此 便于调试和工程化编程 模块可以实现信息隐蔽 将模块实现的功能封闭于模块之中 对于用户只关心其与外部的接口 同时模块化也可以将错误封闭于模块之中 不至于在整个程序中扩散 模块分解的重要原则 1 提高模块的内聚性 减少模块的耦合性 通俗地说就是模块设计要尽量保证模块与模块之间除了调用之外的联系尽可能少 模块之间的联系越少 模块自身的独立性越好 2 每个模块实现的功能要单一完整 模块的规模要适度 每个模块最好只实现一个功能 不要在模块中实现复合功能 3 函数模块的规模不宜过大一般认为在50条语句以内比较适宜 分解后的每个模块应含有以下几个主要的属性 1 输入输出 反映模块与外部的数据联系 是模块的接口 2 逻辑功能 反映模块的功能 如何实现将输入数据转化为结果数据 3 内部数据 内部属性 即模块内部所需的局部数据
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!