C语言程序设计:第4章 模块化设计与应用_第1页
C语言程序设计:第4章 模块化设计与应用_第2页
C语言程序设计:第4章 模块化设计与应用_第3页
C语言程序设计:第4章 模块化设计与应用_第4页
C语言程序设计:第4章 模块化设计与应用_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

1、第4章 模块化设计与应用主要内容:模块化程序设计模块化程序设计函数定义函数定义函数声明函数声明 函数调用函数调用函数的传递参数函数的传递参数函数的返回值函数的返回值预处理预处理模块化分模块化分4.1 模块化程序设计方法 4.1.1模块化程序设计思想将整个系统进行分解成若干功能独立的,分别设将整个系统进行分解成若干功能独立的,分别设计、编程和测试的模块。计、编程和测试的模块。特点:特点:v程序员能单独地负责一个或几个模块的开发。程序员能单独地负责一个或几个模块的开发。v开发一个模块不需要知道系统其它模块的内开发一个模块不需要知道系统其它模块的内 部结构和编程细节。部结构和编程细节。v模块之间的接

2、口尽可能简明,模块应尽可能模块之间的接口尽可能简明,模块应尽可能 彼此隔离。彼此隔离。v具有可修改性具有可修改性v具有易读性具有易读性 v具有易验证性具有易验证性模块化分方法:自上向下,逐步分解,分而治之模块化分方法:自上向下,逐步分解,分而治之 4.1 模块化程序设计方法4.1.2模块规划实例块规划实例 例例4-1 4-1 简单计算器问题描述:完成一个简单简单计算器问题描述:完成一个简单的的计算器计算器程序。要求能够完成如下的常用运算程序。要求能够完成如下的常用运算:加、减、乘、除、取余、倒数、以:加、减、乘、除、取余、倒数、以e e为底的为底的对数、以对数、以1010为底的对数、开平方、指

3、数运算、为底的对数、开平方、指数运算、正弦、余弦、正切、二、八、十、十六进制之正弦、余弦、正切、二、八、十、十六进制之间的相互转换、位运算符运算、位段位运算、间的相互转换、位运算符运算、位段位运算、求求pi()pi()和阶乘。和阶乘。 问题分析1.模块分类2.模块功能细化六则运算对数运算以10为底的运算以e为底的运算4.1.2模块规划实例解决方案解决方案4.1 模块化程序设计方法简单计算器简单计算器对对数数运运算算六六则则运运算算幂幂运运算算三三角角运运算算阶阶乘乘进进制制转转换换Pi位位运运算算以以e为为底底以以10为为底底开开方方指指数数运运算算余余弦弦正正切切正正弦弦二二转转八八十十十十

4、六六八八转转二二十十十十六六十十转转二二八八十十六六十十六六转转二二八八十十位位运运算算符符运运算算位位段段位位运运算算 例例4-2 4-2 学生成绩档案管理学生成绩档案管理问题描述:完成一个综合的学生成绩档案管理问题描述:完成一个综合的学生成绩档案管理系统。要求能够管理系统。要求能够管理N N个学生的个学生的3 3门功课门功课( (英语英语、高数和、高数和C C语言语言) )的成绩,需要实现以下功能:的成绩,需要实现以下功能:读入读入/ /存储学生信息、录入存储学生信息、录入/ /修改修改/ /删除学生基删除学生基本信息、录入本信息、录入/ /修改成绩、按学号修改成绩、按学号/ /姓名查询、

5、姓名查询、排序、浏览、统计每门课的优、良、中等、及排序、浏览、统计每门课的优、良、中等、及格、不及格人数。格、不及格人数。 4.1 模块化程序设计方法 问题分析问题分析1.模块分类2.模块功能细化学生信息维护学生成绩维护学生信息录入、修改、查询等解决方案解决方案学生成绩档案管理学生成绩档案管理学学生生成成绩绩管管理理学学生生档档案案管管理理查查询询统统计计录录入入成成绩绩修修改改成成绩绩读读入入学学生生信信息息录录入入学学生生信信息息修修改改学学生生信信息息删删除除学学生生信信息息存存储储学学生生信信息息按按学学号号查查询询按按姓姓名名查查询询浏浏览览排排序序4.2 函数v从用户角度从用户角度

6、l标准函数(标准函数(库函数库函数):由系统提供由系统提供l用户自定义函数用户自定义函数v从函数形式从函数形式l无参函数无参函数l有参函数有参函数函数分类函数分类4.2.1 函数的定义一般形式:一般形式: 函数类型函数类型 函数名函数名(数据类型数据类型 参数参数1, 数据类型数据类型 参数参数2, )函数体函数体函数的唯一标识函数的唯一标识, 符合符合标识符命名规则标识符命名规则 函数定义不允许嵌套 函数函数返回值返回值类型类型缺省缺省intint类型类型无返回值无返回值voidvoid类型类型float max(float x, float y) return x y ? x : y;4.

7、2.2 函数的声明 函数类型函数类型 函数名函数名(数据类型数据类型 参数名参数名1, 数据类型数据类型 参数参数名名2, ); 不能略掉 ;函数声明一般形式:函数声明一般形式:函数声明举例函数声明举例 (1)void main() float max(float x, float y); /函数声明函数声明 float a, b, c; c = max(a, b);float max(float x, float y) return x y ? x : y;主调函数中对被主调函数中对被调用函数的说明调用函数的说明函数声明举例函数声明举例 (2)float max(float x, float

8、 y); / 函数声明void main()/ 不需要再次声明float max(float, float) float a, b, c; c = max(a, b);float max(float x, float y) return x y ? x : y;在所有函数定义之在所有函数定义之前前, 进行函数声明进行函数声明函数声明举例函数声明举例 (3)float max(float x, float y)/* 函数定义具有声明作用函数定义具有声明作用 */ return x y ? x : y;void main() /* 不需要再次声明float max(float,float) */

9、float a, b, c; c = max(a, b);当被调用的函当被调用的函数定义出现在数定义出现在主调函数之前主调函数之前函数声明举例函数声明举例 (4)当被调用函数的函当被调用函数的函数类型为数类型为int型时型时main() int a,b,c; scanf( %d, %d, &a, &b); c=max(a,b); /*函数调用 */ printf(max is %d,c);int max (int x, int y) int z; z=xy?x:y; return(z);4.2.3 函数的调用函数名函数名(实参表列实参表列);说明说明(1) (1) 在主调函数中

10、调用一个函数时,函数名后面括在主调函数中调用一个函数时,函数名后面括号中的参数号中的参数( (可以是一个表达式可以是一个表达式) )称为称为“实际参数实际参数”( (简称简称“实参实参”) )。(2) (2) 实参必须在类型上按顺序与形参一一对应和匹实参必须在类型上按顺序与形参一一对应和匹配。如果类型不匹配,配。如果类型不匹配,C C编译程序将按赋值兼容的编译程序将按赋值兼容的规则进行转换。规则进行转换。 (3) (3) 调用函数时,函数名称必须与具有该功能的自调用函数时,函数名称必须与具有该功能的自定义函数名称完全一致。定义函数名称完全一致。main() int a,b,c; a=4;b=5

11、; c=max(a,b); /*函数调用 */ printf(max is %d,c);4.2.3 函数的调用 函数调用方式:函数调用方式:(1)函数表达式函数表达式 例例: m=max(a,b)*2;(2) 函数语句函数语句 例例:printf(“Hello,World!n”);(3) 函数实参函数实参 例例:m=max(a,max(b,c);4.2.4 函数的传递参数函数的传递参数 在主调函数和被调用函数之间的数据传递是通过函在主调函数和被调用函数之间的数据传递是通过函数的参数进行的。数的参数进行的。c=max(a,b);(main 函数)(max 函数)max(int x, int y)

12、 int z; z=xy?x:y; return(z); max(int x, int y) int z; z=xy?x:y; return(z);main() int a,b,c; scanf(%d,%d,&a,&b); c=max(a,b); printf(Max is %d,c);形参形参实参实参参数传递参数传递单向值传递单向值传递只能把实参的“值传递”给形参不能把形参的值传递给实参,即对形参的值所作的改变不能带回给实参实参和形参是不同的变量实参和形参是不同的变量具有不同的存储空间形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放在函数没有被调用时,

13、函数中的形参只是一个符在函数没有被调用时,函数中的形参只是一个符号,系统并不为之分配内存空间,号,系统并不为之分配内存空间,只有该函数被只有该函数被调用时调用时,才会为之分配存储空间,并且在调用结,才会为之分配存储空间,并且在调用结束后,形参所占的内存也被释放。束后,形参所占的内存也被释放。 例例4-5 定义一个有两个参数函数定义一个有两个参数函数Swap,函数,函数Swap能够完成对这两个参数的值的交换。能够完成对这两个参数的值的交换。 由此可以看出,虽然在函数Swap()中,变量nNum1和nNum2的值已经交换,但并没有影响到主函数中的nNumber1和nNumber2的值,此时仍然输出

14、为nNumber1=4,nNumber2=7。这里,请读者思考一下:有没有办法使最后的输出结果为nNumber1=7,nNumber2=4呢?请到后面的第6章中找答案。对于主调函数和被调用函数之间的数据传递是通过函数参数实现的,实参变量对形参变量的数据传递是单向传递,即只由实参传给形参,而不能由形参传回来给实参的内容已讲述完毕。但读者可能希望通过函数调用使主调函数能得到一个被调用函数的执行结果,这又该如何实现呢?参数传递举例参数传递举例void swap(int x, int y)int t;t=x; x=y; y=t;main()int a=1, b=4;swap(a, b);1a4b1x4

15、y41返回语句返回语句v形式:形式: return(表达式表达式); 或或 return 表达式表达式; 或或 return;v功能:使程序控制从功能:使程序控制从被调用函数被调用函数返回到调用函数中,同返回到调用函数中,同时把返回值带给调用函数时把返回值带给调用函数v说明:说明:l函数中可有多个函数中可有多个returnreturn语句语句l若无若无returnreturn语句,遇语句,遇 时,时,自动自动返回调用函数返回调用函数l若若函数类型函数类型与与returnreturn语句中表达式值语句中表达式值的类型不一致,的类型不一致,按前者为准,自动转换按前者为准,自动转换-函数调用转换函数

16、调用转换lvoidvoid型函数型函数不返回值,定义函数类型为空类型不返回值,定义函数类型为空类型例例: : 无返回值函数无返回值函数 void swap(int x,int y ) int temp; temp=x; x=y; y=temp; 4.2.5 函数的返回值函数的返回值4.3预处理预处理命令是由ANSI统一规定的,但不是C语言本身的组成部分,不能直接对它们进行编译。4.3.1文件包含所谓所谓“文件包含文件包含”是指一个源文件将另外一是指一个源文件将另外一个或多个源文件的全部内容包含到本文件之个或多个源文件的全部内容包含到本文件之中。它是中。它是C预处理程序的一个重要功能,其预处理程

17、序的一个重要功能,其一般形式为:一般形式为: #include 文件名文件名 或或 #include 4.3预处理文件包含命令的功能是把指定的文件包含命令的功能是把指定的文件文件插入该命令行位置取代插入该命令行位置取代该命令行,从而把指定的文件和当前的源程序文件连成一个该命令行,从而把指定的文件和当前的源程序文件连成一个源文件。源文件。4.3.2宏定义在在C语言源程序中允许用一个标识符来表示一语言源程序中允许用一个标识符来表示一个字符串,个字符串, 称为称为“宏宏”。被定义为。被定义为“宏宏”的标识的标识符称为符称为“宏名宏名”。在编译预处理时,对程序中所。在编译预处理时,对程序中所有出现的有

18、出现的“宏名宏名”,都用宏定义中的字符串去替,都用宏定义中的字符串去替换,换, 这称为这称为“宏替换宏替换”或或“宏展开宏展开”。在。在C语言语言中,中,“宏宏”分为有参数和无参数两种。分为有参数和无参数两种。 1. 不带参数的宏定义不带参数的宏定义#define 标识符标识符 字符串字符串不是语句,而是一种编译预处理命令#include #define PI 3.14159#define R 5.3main()printf(area = %fn, PI * R * R);printf(circumference = %fn, 2 * PI * R);2005年4月(填空题)(7)以下程序运行

19、后的输出结果是 【7】 。#define S(x) 4*x*x+1main() int i=6,j=8; printf(“%dn”,S(i+j);4.4应用实例 例例4-6 简单计算器简单计算器 问题描述:采用函数调用方式完成简单计算器程序的问题描述:采用函数调用方式完成简单计算器程序的六则运算模块、幂运算、三角函数模块和求六则运算模块、幂运算、三角函数模块和求pi。 问题分析问题分析使用计算器前先要进行功能选择,将功能选择定义为一个函数。由于幂运算模块又被分解成了两个功能小模块(开方、指数运算),因此需要设计类似于主菜单的二级菜单,方便选择功能。由于三角函数模块又被分解成了三个功能小模块(正

20、弦、余弦、正切),因此也需要设计类似于主菜单的二级菜单,方便选择功能。然后先定义三个函数分别实现这三个功能小模块,再在二级菜单中调用它们。本小节只定义两个函数分别实现正弦、余弦,余下的正切将在第6章实现。求pi模块不用再继续分解了,只要定义一个函数即可。 程序实现程序实现其他代码详见书4.4应用实例 例例4-7 学生成绩档案管理。学生成绩档案管理。 问题描述:问题描述: (1)在第在第4.1节里,把学生成绩档案管理规划成节里,把学生成绩档案管理规划成了四大功能模块,除了四大功能模块,除统计模块统计模块外其它三个模块还外其它三个模块还被进一步分解被进一步分解(如图如图4-2所示所示)。现在需要设计一个。现在需要设计一个“主菜单主菜单”和三个和三个“二级菜单二级菜单”供供“用户用户”选择选择功能。定义四个函数分别实现这四个功能。定义四个函数分别实现这四个“菜单菜单”。 (2)输入输入N个学生个学生1门课程的成绩,按课程统计门课程的成绩,按课程统计各级别各级别(优、良、中、及格和不及格优、良、中、及格和不及格)人数并输出人数并输出。并要求按上面的。并要求按上面的“主菜单主菜单”选择选择“统计模块统计模块”可以得到统计数据。定义一个函数实现此功能。可以得到统计数据。定义一个函数实现此功能。 例例4-7 学生成绩档案管理。学生成绩档案管理。 问题描述:问题描

温馨提示

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

评论

0/150

提交评论