C语言第4章人民邮电出版社张小东.ppt_第1页
C语言第4章人民邮电出版社张小东.ppt_第2页
C语言第4章人民邮电出版社张小东.ppt_第3页
C语言第4章人民邮电出版社张小东.ppt_第4页
C语言第4章人民邮电出版社张小东.ppt_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

语 言 程 序 设 计 与 应 用 样 章 第 4 章 模 块 化 设 计 与 应 用 C 第4章 模块化设计与应用 主要内容 模块化程序设计 函数定义 函数调用 函数声明 函数的传递参数 函数的返回值 预处理 模块化分 语 言 程 序 设 计 与 应 用 样 章 第 4 章 模 块 化 设 计 与 应 用 C 4.1 模块化程序设计方法 4.1.1模块化程序设计思想 将整个系统进行分解成若干功能独立的,能分别设计 、编程和测试的模块。 特点: v 程序员能单独地负责一个或几个模块的开发。 v 开发一个模块不需要知道系统其它模块的内部结构和编 程细节。 v 模块之间的接口尽可能简明,模块应尽可能彼此隔离。 v 具有可修改性 v 具有易读性 v 具有易验证性 模块化分方法:自上向下,逐步分解,分而治之 语 言 程 序 设 计 与 应 用 样 章 第 4 章 模 块 化 设 计 与 应 用 C 4.1 模块化程序设计方法 4.1.2 模块规划实例 例4-1 简单计算器问题描述:完成一个简单的计算器程序。要 求能够完成如下的常用运算:加、减、乘、除、取余、倒数、以e 为底的对数、以10为底的对数、开平方、指数运算、正弦、余弦 、正切、二、八、十、十六进制之间的相互转换、位运算符运算 、位段位运算、求pi()和阶乘。 问题分析 1.模块分类 2.模块功能细化 六则运算 对数运算 以10为底的运算 以e为底的运算 语 言 程 序 设 计 与 应 用 样 章 第 4 章 模 块 化 设 计 与 应 用 C 4.1.2 模块规划实例 解决方案 解决方案 4.1 模块化程序设计方法 六 则 运 算 对 数 运 算 幂 运 算 Pi 阶 乘 以 e 为 底 以 10 为 底 开 方 指 数 运 算 三 角 运 算 余 弦 正 弦 正 切 二 转 八 十 十 六 八 转 二 十 十 六 十 转 二 八 十 六 十 六 转 二 八 十 进 制 转 换 位 运 算 位 运 算 符 运 算 位 段 位 运 算 简单计算器 语 言 程 序 设 计 与 应 用 样 章 第 4 章 模 块 化 设 计 与 应 用 C 例4-2 学生成绩档案管理 问题描述:完成一个综合的学生成绩档案管理系统。要求能够管 理N个学生的3门功课(英语、高数和C语言)的成绩,需要实现以下 功能:读入/存储学生信息、录入/修改/删除学生基本信息、录入 /修改成绩、按学号/姓名查询、排序、浏览、统计每门课的优、 良、中等、及格、不及格人数。 4.1 模块化程序设计方法 问题分析 1.模块分类 2.模块功能细化 学生信息维护 学生成绩维护 学生信息录入、修 改、查询等 语 言 程 序 设 计 与 应 用 样 章 第 4 章 模 块 化 设 计 与 应 用 C 解决方案 学 生 成 绩 管 理 学 生 档 案 管 理 查 询 统 计 读 入 学 生 信 息 录 入 学 生 信 息 修 改 学 生 信 息 删 除 学 生 信 息 录 入 成 绩 修 改 成 绩 存 储 学 生 信 息 按 学 号 查 询 按 姓 名 查 询 浏 览 排 序 学生成绩档案管理 语 言 程 序 设 计 与 应 用 样 章 第 4 章 模 块 化 设 计 与 应 用 C 4.2 函数 库函数;自定义函数 4.2.1 函数的定义 一般形式: 函数类型 函数名(数据类型 参数1, 数据类型 参数2, ) 函数体 函数运行完毕后返回值 的类型,无加void 函数的唯一标识符 合标识符命名规则 参数表没有加 void 函数定义不允许嵌套 语 言 程 序 设 计 与 应 用 样 章 第 4 章 模 块 化 设 计 与 应 用 C 4.2 函数 问题分析 (1) 在计算机中只能求出近似值 (2) 通过截取所给公式的前n项来实现所要求的精度。n的大小由截 取的条件决定,此处定为取到某一项的绝对值小于10-6为止 (3) 正负号交替;分母依次相差为2;可以用循环结构实现求和运算 例4-3(a) 定义一个函数,实现用公式 求的值。 语 言 程 序 设 计 与 应 用 样 章 第 4 章 模 块 化 设 计 与 应 用 C 解决方案 程序实现 /* 定义一个函数 */ /* purpose: 定义一个函数,求Pi的近似值 author : gcy created: 2008/08/12 14:58:22 */ #include float SelPi(void) /求pi int nSign=1; float fNumber=1.0,fTerm=1,fPi=0; while(fabs(fTerm)1e-6) fPi=fPi+fTerm; fNumber=fNumber+2; nSign=-nSign; fTerm=nSign/fNumber; return(4*fPi); 语 言 程 序 设 计 与 应 用 样 章 第 4 章 模 块 化 设 计 与 应 用 C 4.2 函数 4.2.2 函数的调用 1. 函数声明 函数类型 函数名(数据类型 参数名1, 数据类型 参数名2, ); 在主调函数之前,需对被调函数进行声明 说 明 以下三种形式可以不用函数声明 (1) 当被调用函数的函数定义出现在主调函数之前时。 (2) 如果在所有函数定义之前,在函数外部(例如文件或程序开始处)预先 对各个函数进行了声明,则在主调函数中可以省去对被调用函数的说明。 (3) 若被调用函数的函数类型为int型时。 语 言 程 序 设 计 与 应 用 样 章 第 4 章 模 块 化 设 计 与 应 用 C 4.2 函数 4.2.2 函数的调用 2. 函数调用 函数名(实参表列); 说 明 (1) 在主调函数中调用一个函数时,函数名后面括号中的参数(可以是一个 表达式)称为“实际参数”(简称“实参”)。 (2) 实参必须在类型上按顺序与形参一一对应和匹配。如果类型不匹配,C 编译程序将按赋值兼容的规则进行转换。 (3) 如果实参表中包括多个参数表达式,对实参的求值顺序随系统而异。有 的系统按自左向右顺序求实参的值,有的系统则相反,这一点读者尤其要注 意。 (4) 调用函数时,函数名称必须与具有该功能的自定义函数名称完全一致。 #include void main() float SelPi(void);/函数声明 printf(“pi=%.5fn“,SelPi(); 语 言 程 序 设 计 与 应 用 样 章 第 4 章 模 块 化 设 计 与 应 用 C 4.2 函数 4.2.2 函数的调用 2. 函数调用 注意: 在C语言中,可以用以下几种方式调用函数: (1) 函数表达式。函数作为表达式的一项,出现在表达式中,以函数 返回值参与表达式的运算。这种方式要求函数是有返回值的。读者可 以尝试一下把此例中的函数调用方式改成此种方式。 (2) 函数语句。C语言中的函数可以只进行某些操作而不返回函数值, 这时的函数调用可作为一条独立的语句。 (3) 函数实参。函数作为另一个函数调用的实际参数出现。这种情况 是把该函数的返回值作为实参进行传送,因此要求该函数必须是有返 回值的。此例中的函数调用就属于此种方式。 语 言 程 序 设 计 与 应 用 样 章 第 4 章 模 块 化 设 计 与 应 用 C 4.2 函数 4.2.2 函数的调用 3.函数的参数 在主调函数和被调用函数之间的数据传递是通过函数的参 数进行的,实际上这也是数据共享的一种形式。实参变量 对形参变量的数据传递是单向传递 例4-4 用迭代公式为: ,求 。 问题分析 (1) 从数学的角度来说,可以一直迭代下去。但用计算机求解则不可 以,并且大多数情况下得到的都是近似值。 (2) 需要一个条件限制迭代次数,这里采用前后两次求出的的差的绝 对值小于所给的精度10-6这一限制条件。 (3) 迭代公式是很容易用循环结构实现的。 语 言 程 序 设 计 与 应 用 样 章 第 4 章 模 块 化 设 计 与 应 用 C 解决方案 程序实现 语 言 程 序 设 计 与 应 用 样 章 第 4 章 模 块 化 设 计 与 应 用 C 程序实现 说 明 (1) 可以证明这个迭代公式对于任 意初值x00都是收敛的。大家不妨尝试 一下,只需要具备数列收敛的相关知识 即可。该公式来源于牛顿迭代法。具体 推导过程,可以参考“数值分析”或“ 计算方法”的方面的书籍。 (2) 程序中定义了函数 SelSquareRoot(float fRadicand),指 定了一个浮点类型的形式参数 fRadicand,此时的fRadicand并没有实 际的意义;在语句printf(“%f的平方根 为 :%fn“,fRadic,SelSquareRoot(fRadic );当中,将实际的参数fRadic赋给了 形参fRadicand,相当于fRadicand =fRadic,并且通过函数调用,开始执 行函数SelSquareRoot ()。 (3) 由于主调函数main()放在被调 用函数SelSquareRoot ()之后,所以这 里可以不进行函数声明。 语 言 程 序 设 计 与 应 用 样 章 第 4 章 模 块 化 设 计 与 应 用 C 4.2.2 函数的调用 3.函数的参数 注意: (1) 在函数没有被调用时,函数中的形参只是一个符号, 系统并不为之分配内存空间,只有该函数被调用时,才会 为之分配存储空间,并且在调用结束后,形参所占的内存 也被释放。 (2) 在内存中,实参单元与形参单元是不同的单元。 (3) 实参可以是常量、变量或表达式,但要求它们有确定 的值,也就是说,在调用函数时必须给形参赋以确定的值 。 (4) 在被定义的函数中,必须指定形参的类型,并且实参 与形参的类型应一致,否则将发生类型“不匹配的错误”。 (5) 形参在获得值之后便与实参相脱离,此后无论形参发 生了怎样的改变,都不会影响到实参。 语 言 程 序 设 计 与 应 用 样 章 第 4 章 模 块 化 设 计 与 应 用 C 例4-5 定义一个有两个参数函数Swap,函数Swap能够 完成对这两个参数的值的交换。 语 言 程 序 设 计 与 应 用 样 章 第 4 章 模 块 化 设 计 与 应 用 C 由此可以看出,虽然在函数Swap()中,变量 nNum1和nNum2的值已经交换,但并没有影响到 主函数中的nNumber1和nNumber2的值,此时仍 然输出为nNumber1=4,nNumber2=7。这里,请 读者思考一下:有没有办法使最后的输出结果为 nNumber1=7,nNumber2=4呢?请到后面的第6章 中找答案。 对于主调函数和被调用函数之间的数据传递是通 过函数参数实现的,实参变量对形参变量的数据 传递是单向传递,即只由实参传给形参,而不能 由形参传回来给实参的内容已讲述完毕。但读者 可能希望通过函数调用使主调函数能得到一个被 调用函数的执行结果,这又该如何实现呢? 语 言 程 序 设 计 与 应 用 样 章 第 4 章 模 块 化 设 计 与 应 用 C return ( 返回表达式 ); 4. 函数返回值 函数的返回值是通过函数中的return语句获得的。return语句将被调函数 中的一个确定值带回主调函数中去。return语句的一般格式是: 注意: (1) return语句的功能:返回主调函数,并将“返回表达式”的值带给主调函数。 (2) 函数的返回值可以有一个以上的return语句,哪一个return语句起作用要看使 用的具体环境。 (3)函数的返回值是确定的。这里包含两层意思,一是函数值的类型确定。二 是函数的返回值确定,即在return语句中的表达式的值必须确定。 (4)调用函数中无return语句,并不是不返回一个值,而是一个不确定的值。 为了明确表示不返回值,可以用“void”定义成“无(空)类型”。为了使程序具 有良好的可读性并减少出错,凡不要求返回值的函数都应定义为 空类型,而不使 用系统的缺省处理。 (5)在定义函数时,对函数类型的说明,应与return语句中返回值表达式的 类型一致。如果不一致,则以函数类型为准。系统将缺省函数类型按整型(int)来 处理 语 言 程 序 设 计 与 应 用 样 章 第 4 章 模 块 化 设 计 与 应 用 C 5. 函数调用的执行过程 语 言 程 序 设 计 与 应 用 样 章 第 4 章 模 块 化 设 计 与 应 用 C 4.3预处理 预处理命令是由ANSI统一规定的,但不是C语 言本身的组成部分,不能直接对它们进行编译 。根据预处理命令对程序作相应的处理,使程 序不再包括预处理命令,再由编译程序对预处 理后的源程序进行通常的编译处理,得到可执 行的目标代码。 C语言提供了多种预处理功能,合理地使用预 处理功能编写的程序便于阅读、修改、 移植和 调试,也有利于模块化程序设计。 语 言 程 序 设 计 与 应 用 样 章 第 4 章 模 块 化 设 计 与 应 用 C 4.1 模块化程序设计方法 4.3.1文件包含 所谓“文件包含”是指一个源文件将另外一个或多个源文件的全 部内容包含到本文件之中。它是C预处理程序的一个重要功能, 其一般形式为: #include “文件名“ #include (1) 在文件头部的被包含的文件称为“头文件”或“标题文件”,常以 “.h”为后缀(h为head的缩写)。 (2) 一个#include命令只能指定一个被包含文件, (3) 文件包含允许嵌套, (4) 文件包含命令的功能是把指定的文件插入该命令行位置取代该 命令行,从而把指定的文件和当前的源程序文件连成一个源文 件。 说 明 语 言 程 序 设 计 与 应 用 样 章 第 4 章 模 块 化 设 计 与 应 用 C 4.3.1文件包含 (5) 包含命令中的文件名可以用双引号括起来,也可以用尖括号括起来, (6) 如果文件1包含文件 2,而文件2中要用到文件3的内容,则可在文件1中用 两个#include命令分别包含文件2和文件3,且文件3应出现在文件2之前, 即在文件1中定义。 (7)如果需要修改一些常数,不必修改每个程序,只需修改一个文件(头部文件) 即可。 (8)使用“文件包含”命令,还可以减少编程人员的重复劳动。 4.3.2宏定义 在C语言源程序中允许用一个标识符来表示一个字符串, 称为“ 宏”。被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序 中所有出现的“宏名”,都用宏定义中的字符串去替换, 这称为“宏替 换”或“宏展开”。在C语言中,“宏”分为有参数和无参数两种。 1. 不带参数的宏定义 #define 标识符 字符串 语 言 程 序 设 计 与 应 用 样 章 第 4 章 模 块 化 设 计 与 应 用 C (1) 宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串 取代宏名,这只是一种简单的替换,字符串中可以包含任何字 符,可以是常数,也可以是表达式,预处理程序对它不作任何 检查。如有错误,只能在编译已被宏展开后的源程序时发现。 (2) 宏定义不是说明或语句,在行末不必加分号,如加上分号则连 分号也一起置换。 (3) 宏定义必须写在函数之外,其作用域为定义命令之后到本源程 序结束。 (4) 源程序中若宏名在引号里,则预处理程序不对其作宏替换,而 把宏名当作字符串处理。 (5) 宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏 名。在宏展开时由预处理程序层层替换。如, (6) 习惯上宏名用大写字母表示,以便于与变量区别,但也允许用 小写字母。 (7) 对“输出格式”作宏定义,可以减少书写麻烦。 说 明 语 言 程 序 设 计 与 应 用 样 章 第 4 章 模 块 化 设 计 与 应 用 C #define 宏名(形参表) 字符串 2. 带参数的宏定义 C语言允许宏带有参数。 带参宏调用的一般形式为: 宏名(实参表) ; 语 言 程 序 设 计 与 应 用 样 章 第 4 章 模 块 化 设 计 与 应 用 C 对于带参的宏定义有以下问题需要说明: (1) 带参宏定义中,宏名和形参表之间不能有空格出现。 (2) 带参宏定义中,形式参数不分配内存单元,因此不必作类型定义 。而宏调用中的实参有具体的值。要用它们去代换形参,因此必 须作类型说明。这是与函数中的情况不同的。在函数中,形参和 实参是两个不同的量,各有自己的作用域,调用时要把实参值赋 予形参,进行“值传递”。而在带参宏中,只是符号替换,不存在 值传递的问题。 (3) 在宏定义中的形参是标识符,而宏调用中的实参可以是表达式。 (4) 在宏定义中,字符串内的形参通常要用括号括起来以避免出错。 (5) 带参的宏和带参函数很相似,但有本质上的不同,除上面已谈到 的各点外,把同一表达式用函数处理与用宏处理两者的结果也可 能是不同的。 (6) 宏定义也可用来定义多个语句,在宏调用时,把这些语句又替换 到源程序内。 说 明 语 言 程 序 设 计 与 应 用 样 章 第 4 章 模 块 化 设 计 与 应 用 C 4.4应用实例 例4-6 简单计算器 问题描述:采用函数调用方式完成简单计算器程序的 六则运算模块、幂运算、三角函数模块和求pi。 问题分析 (1)使用计算器前先要进行功能选择, 将功能选择定义为一个函数。 (3) 由于幂运算模块又被分解成了两个功能小模块(开方、指数运算) ,因此需要设计类似于主菜单的二级菜单,方便选择功能。 (4) 由于三角函数模块又被分解成了三个功能小模块(正弦、余弦、 正切),因此也需要设计类似于主菜单的二级菜单,方便选择功能。然 后先定义三个函数分别实现这三个功能小模块,再在二级菜单中调用它 们。本小节只定义两个函数分别实现正弦、余弦,余下的正切将在第6 章实现。 (5) 求pi模块不用再继续分解了,只要定义一个函数即可。 语 言 程 序 设 计 与 应 用 样 章 第 4 章 模 块 化 设 计 与 应 用 C 程序实现 其他代码详见书 语 言 程 序 设 计 与 应 用 样 章 第 4 章 模 块 化 设 计 与 应 用 C 4.4应用实例 例4-7 学生成绩档案管理。 问题描述: (1)在第4.1节里,把学生成绩档案管理规划成了四大功 能模块,除统计模块外其它三个模块还被进一步分解(如

温馨提示

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

评论

0/150

提交评论