C程序设计基础.ppt_第1页
C程序设计基础.ppt_第2页
C程序设计基础.ppt_第3页
C程序设计基础.ppt_第4页
C程序设计基础.ppt_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

Chap5函数 5 1计算圆柱体积5 2数字金字塔5 3复数运算 本章要点 函数的作用 如何确定函数功能 怎样定义函数 如何调用函数 定义函数与声明函数有何区别 什么是函数的参数 怎样确定函数的参数 在函数调用时 参数是如何传递数据的 变量与函数有什么关系 如何使用局部变量和全局变量 什么是静态变量 5 1计算圆柱体积 5 1 1程序解析5 1 2函数的定义5 1 3函数的调用5 1 4函数程序设计 5 1 1程序解析 计算圆柱体积 例5 1 输入圆柱体的高h和半径r 求圆柱体积 volume r2 h 要求定义和调用函数cylinder r h 计算圆柱体的体积 定义函数cylinder 如下 doublecylinder doubler doubleh return3 1415926 r r h 计算圆柱体积 includeintmain void doubleheight radius volume doublecylinder doubler doubleh 函数声明 printf Enterradiusandheight scanf lf lf 例5 1程序 运行结果 Enterradiusandheight 3 010Volume 282 743 5 1 2函数的定义 函数是指完成一个特定工作的独立程序模块 函数分类从函数定义的角度 自定义函数 用户定义 和系统库函数 系统定义 从主调与被调函数之间数据传送的角度 有参函数和无参函数从有无返回值的角度 有返回值函数和无返回值函数main 也是一个函数 C程序由一个main 或多个函数构成 5 1 2函数的定义 1 函数定义的一般格式 函数类型函数名 形式参数说明表 函数首部 函数体 函数体 函数类型 指函数返回值的类型 如 intfloatdoublecharvoid等 缺省为int 无返回值的函数 函数类型应使用void 函数名 函数的名称 即一个自定义标识符 形参说明表 说明形式参数 格式为 类型1形参1 类型2形参2 类型n形参n 函数体 用大括号括起来的若干语句 体现函数的实现过程 5 1 2函数的定义 2 有返回值的函数的定义函数的返回值是通过函数中用return语句实现 return表达式 或return 表达式 return语句的功能是结束本函数的执行 将表达式的值返回给主调函数 只能返回一个值 如果表达式缺省 则无直接的返回值 如果函数类型和return语句中表达式的值类型不一致 则以函数类型为准 函数终止执行有两种情况 一是遇到return语句或其他终止函数执行的语句 二是执行到函数体的右大括号 5 1 2函数的定义 有返回值函数的函数类型应定义为要返回的运算结果的值类型 一般不能是void 有返回值函数中至少有一条 也可以有多条含有返回值表达式的return语句 例如 判断一个整数是否为素数的函数prime intprime intm inti if m 2 return0 for i 2 i m i if m i 0 return0 return1 5 1 2函数的定义 3 无返回值的函数的定义无返回值函数的函数类型应定义为void 表示无返回值 不应缺省 因为缺省默认为int 无返回值函数中可以没有 也可以有不含返回值表达式的return语句 无返回值函数虽然不直接返回一个值 但它的作用通常以屏幕输出等方式或其他途径体现 5 1 3函数的调用 1 函数调用的形式函数调用的一般形式为 函数名 实参表 实参可以是常量 变量和表达式 实参的类型 个数和顺序应与定义时的形参一致 2 函数调用的过程当主调函数 如main 函数 执行到某个函数调用 主调函数就暂停执行 将实参的值传递给形参并转而执行该被调函数 该被调函数执行完后 将返回主调函数 再从原先暂停的位置继续执行 5 1 3函数的调用 3 参数传递函数定义时的参数称为形式参数 简称形参 doublecylinder doubler doubleh 函数调用时的参数称为实际参数 简称实参 volume cylinder radius height 形参 必须是变量 用于接受实参传递过来的值 相同变量名的实参变量与形参是不同的变量 它们分别只有效于各自所在的主调函数和被调函数 实参 可以是常量 变量或表达式 包括有返回值函数调用表达式 5 1 3函数的调用 函数调用时 发生参数传递 即把实参的值复制给对应的形参 参数传递是一种单向的值的传递 因此 函数执行中形参值的改变不会影响实参的值 4 函数结果返回函数返回的两种情况完成确定的运算 有一个运算结果返回给主调函数 完成指定工作 没有确定的运算结果需返回给主调函数 5 1 3函数的调用 函数结果返回的形式 return表达式 return 表达式 例5 2 定义判断奇偶数的函数even n 当n为偶数时返回1 否则返回0 inteven intn if n 2 0 return1 elsereturn0 5 1 3函数的调用 5 函数原型声明调用函数必须遵循 先定义或声明后调用 的原则 要调用库函数 就用 include命令把包含该库函数原型声明的头文件包含在源程序前部 函数定义在先调用在后 就不需函数声明 函数定义在后调用在先 就必须先行函数声明 函数声明的一般形式 函数值类型函数名 形参说明表 其中的形参说明表可以与定义时的相同 也可以缺省其中的形参名 5 1 4函数程序设计 例5 3 输入精度e 使用格雷戈里公式求 的近似值 精确到最后一项的绝对值小于e 要求定义和调用函数funpi e 求 的近似值 分析 与 例4 1 使用格雷戈里公式求 的近似值 的差别是 精度需输入 要定义和调用函数funpi e 例5 3程序 includeintmain void doublee pi doublefunpi double printf Entere scanf lf doublefunpi doublee intden 1 f 1 doubleitem sum 0 do item 1 0 den sum sum f item f f den den 2 while item e returnsum 4 运行结果 Entere 0 0001pi 3 1414 5 1 4函数程序设计 例5 4 求100以内的全部素数 每行输出10个 要求定义和调用函数prime m 判断m是否为素数 当m为素数时返回1 否则返回0 分析 与 例4 10 求100以内的全部素数 的差别仅是要求定义和调用函数prime for m 2 m 100 m if prime m 0 printf d m includeintmain void intcount m prime int count 0 for m 2 m 100 m if prime m printf 5d m count if count 10 0 printf n return0 例5 4程序 intprime intm inti if m 2 return0 for i 2 i m i if m i 0 return0 return1 运行结果 2357111317192329313741434753596157717379838997 5 2数字金字塔 例5 5 输出5行的数字金字塔 5 2 1程序解析5 2 2不返回结果的函数5 2 3结构化程序设计思想 5 2 1程序解析 例5 5 输出5行的数字金字塔 分析 外循环 控制输出行数 行号从1开始 内循环1 输出每行前导的空格 个数为 总行数 行号 内循环2 输出每行的数字 该数字及个数为行号 每行最后须换行 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 例5 5程序 includevoidpyramid intn 函数定义 inti j for i 1 i n i 循环行数次 for j 1 j n i j 输出每行前导空格 printf for j 1 j i j 输出每行的数字 printf 2d i 每个数字宽2左对齐 printf n 换行 intmain void pyramid 5 用实参5调用函数 return0 5 2 2不返回结果的函数 无返回值函数的函数类型应定义为void 表示无返回值 不应缺省 因为缺省默认为int 无返回值函数中可以没有 也可以有不含返回值表达式的return语句 无返回值函数虽然不直接返回一个值 但它的作用通常以屏幕输出等方式或其他途径体现 由于函数没有返回结果 函数调用不可能出现在表达式中 通常以独立的调用语句方式 如pyramid 5 5 2 3结构化程序设计思想 结构化程序设计是一种程序设计技术C语言是结构化程序设计语言结构化程序设计强调程序设计的风格和程序结构的规范化 提倡清晰的结构 它的基本思路是将一个复杂问题的求解过程划分为若干阶段 每个阶段要处理的问题都容易被理解和处理 按自顶向下的方法对问题进行分析 模块化设计和结构化编码等3个步骤 5 2 3结构化程序设计思想 1 自顶向下的分析方法把大的复杂的问题分解成小问题后再解决 面对一个复杂的问题 首先进行上层 整体 的分析 按组织或功能将问题分解成子问题 如果子问题仍然很复杂 再做进一步分解 直到处理对象相对简单 容易处理为止 当所有的子问题都得到了解决 整个问题也就解决了 每一次分解都是对上一层的问题进行细化和逐步求精 最终形成一种类似树形的层次结构 来描述分析的结果 5 2 3结构化程序设计思想 一个学生成绩统计程序的例子 5 2 3结构化程序设计思想 2 模块化设计将模块组织成良好的层次系统顶层模块调用其下层模块以实现程序的完整功能 每个下层模块再调用更下层的模块 从而完成程序的一个子功能 最下层的模块完成最具体的功能 遵循模块独立性的原则 即模块之间的联系应尽量简单模块用函数实现 一个模块只完成一个指定的功能 模块之间只通过带参数的函数进行调用 5 2 3结构化程序设计思想 3 结构化编码经模块化设计后 每一个模块都可以独立编码 编程时应选用顺序 选择和循环三种控制结构对变量 函数 常量等命名时 要见名知意 有助于对变量含义或函数功能的理解 在程序中增加必要的注释 增加程序的可读性 要有良好的程序视觉组织 利用缩进格式程序要清晰易懂 语句构造要简单直接程序有良好的交互性 输入有提示 输出有说明 5 3复数运算 例5 6 分别输入2个复数的实部与虚部 用函数实现计算2个复数之和与之积 5 3 1程序解析5 3 2局部变量和全局变量5 3 3变量生命周期和静态局部变量 5 3 1程序解析 例5 6 分别输入2个复数的实部与虚部 用函数实现计算2个复数之和与之积 分析 若2个复数分别为 c1 x1 y1i c2 x2 y2i则 c1 c2 x1 x2 y1 y2 ic1 c2 x1 x2 y1 y2 x1 y2 x2 y1 i includefloatreal imag 全局变量 用于存放函数结果 intmain void floati1 i2 r1 r2 两个复数的实 虚部变量 voidcomplex prod floatr1 floati1 floatr2 floati2 voidcomplex add floatr1 floati1 floatr2 floati2 printf Enter1stcomplexnumber realandimaginary scanf f f 例5 6程序 例5 6程序 complex prod r1 i1 r2 i2 求复数之积 printf productofcomplexis f fi n real imag return0 voidcomplex add floatr1 floati1 floatr2 floati2 real r1 r2 imag i1 i2 voidcomplex prod floatr1 floati1 floatr2 floati2 real r1 r2 i1 i2 imag r1 i2 r2 i1 运行结果 Enter1stcomplexnumber realandimaginary 11Enter2ndcomplexnumber realandimaginary 23additionofcomplexis 1 000000 4 000000iproductofcomplexis 5 000000 1 000000i includefloatresult real result imag 全局变量 用于存放函数结果 intmain void floatimag1 imag2 real1 real2 两个复数的实 虚部变量 函数声明 voidcomplex prod floatreal1 floatimag1 floatreal2 floatimag2 voidcomplex add floatreal1 floatimag1 floatreal2 floatimag2 printf Enter1stcomplexnumber realandimaginary scanf f f 例5 6程序 运行结果 Enter1stcomplexnumber realandimaginary 11Enter2ndcomplexnumber realandimaginary 23additionofcomplexis 1 000000 4 000000iproductofcomplexis 5 000000 1 000000i 例5 6程序 voidcomplex add floatreal1 floatimag1 floatreal2 floatimag2 result real real1 real2 result imag imag1 imag2 voidcomplex prod floatreal1 floatimag1 floatreal2 floatimag2 result real real1 real2 imag1 imag2 result imag real1 imag2 real2 imag1 5 3 2局部变量和全局变量 局部变量在函数内定义的变量 包括形参 作用范围 本函数内部在复合语句内定义的变量作用范围 复合语句内部函数调用结束或复合语句执行完毕 为其局部变量分配的内存便释放 但静态局部变量除外 使用局部变量可以避免各函数间的变量相互干扰 尤其是同名变量 5 3 2局部变量和全局变量 当函数的局部变量和复合语句的局部变量同名时 则在复合语句的局部变量的作用范围内由复合语句的局部变量起作用 函数的局部变量被 屏蔽 即不起作用 5 3 2局部变量和全局变量 示例 在复合语句中定义局部变量 includeintmain void inta b 2 a 1 a a b intb 10 b a b a a b printf a d b d n a b printf a d b d n a b return0 运行结果 a 16 b 13a 16 b 2 a 1 2 3 b 10 b 3 10 13 a 3 13 16 5 3 2局部变量和全局变量 全局变量在函数外部定义的变量 不从属于任一函数 全局变量的作用范围是从定义处起始到所在程序文件的结束 全局变量和局部变量同名时 则在局部变量的作用范围内由局部变量起作用 全局变量被 屏蔽 即不起作用 例5 7 全局变量定义 例5 7程序 include stdio h intx intfun intx 4 returnx intmain void inta 1 x a a fun intb 2 b a b x x b printf d d a x return0 运行结果 47 x 0a 1x 4b 2 1 4 6 7 5 3 2局部变量和全局变量 例5 8 用函数实现财务现金记账 先输入操作类型 1收入 2支出 0结束 再输入操作金额 计算现金剩余额 经多次操作直到输入操作为0结束 要求定义并调用函数 其中现金收入与现金支出分别用不同函数实现 分析 设变量cash保存现金余额值 由于它被主函数 现金收入与现金支出函数共用 任意使用场合其意义与数值都是明确和唯一的 因此令其为全局变量 includefloatcash 定义全局变量 保存现金余额 voidincome floatnumber 定义计算现金收入函数 cash cash number 改变全局变量cash voidexpend floatnumber 定义计算现金支出函数 cash cash number 改变全局变量cash intmain void intchoice floatvalue 函数声明 voidincome floatnumber expend floatnumber cash 0 初始金额 0 printf Enteroperatechoice 0 end 1 income 2 expend scanf d 输入操作类型 例5 8程序 while choice 0 若输入0 循环结束 if choice 1 choice 2 printf Entercashvalue 输入操作现金额 scanf f 例5 8程序 运行结果 Enteroperatechoice 0 end 1 income 2 expend 1Entercashvalue 1000currentcash 1000 000000Enteroperatechoice 0 end 1 income 2 expend 2Entercashvalue 456currentcash 544 000000Enteroperatechoice 0 end 1 income 2 expend 0 5 3 2局部变量和全局变量 讨论全局变量比局部变量自由度大 更方便 引起注意对于规模较大的程序 过多使用全局变量会带来副作用 导致各函数间出现相互干扰 如果整个程序是由多人合作开发 各人都按自己的想法使用全局变量 相互的干扰可能会更严重 因此在变量使用中 应尽量使用局部变量 从某个角度看使用似乎受到了限制 但从另一个角度看 它避免了不同函数间的相互干扰 提高了程序质量 5 3 3变量生存周期和静态局部变量 变量生存周期变量从定义开始分配存储单元 到运行结束存储单元被回收 整个过程称为变量的生存周期 变量的存储类别动态存储 程序运行期间按运行的需要动态地分配和释放存储空间 此类局部变量用auto关键字定义 一般都缺省 称自动局部变量 静态存储 程序运行期间分配固定的存储空间 此类局部变量用static关键字定义 称静态局部变量 全局变量默认为静态的 5 3 2变量生存周期和静态局部变量 变量的存储类别与其生存周期相关静态存储的变量的生存

温馨提示

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

评论

0/150

提交评论