版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第7章 函 数 7.1 模块化程序设计的概念 7.2 库函数7.3 函数的定义和调用 7.4 函数的返回值及其类型 7.5 函数调用时参数间的传递 7.6 函数的嵌套调用 7.7 函数的递归调用 7.8 局部变量和全局变量7.9 静态存储变量和动态存储变量 7.10 内部函数和外部函数7.11 程序举例 第7章 函 数 7.1 模块化程序设计的概念 7.1 模块化程序设计的概念 模块化程序设计,是将一个大型程序按照其功能分解成若干个相对独立的功能模块,然后再分别进行设计,最后把这些功能模块按照层次关系进行组装。基本思想是“自顶向下、逐步求精”。 C语言程序是一个函数式的程序结构,即C语言程序的
2、全部功能都是由函数实现的,而每个函数对应一个独立的模块,通过函数间调用来实现程序的总体功能。如图7.1所示,是一个程序中函数调用示意图。7.1 模块化程序设计的概念 模块 在C语言中,函数分为主函数、库函数、用户自定义函数三种。程序的执行由主函数开始,然后调用其它函数,最终返回主函数结束。 main函数 a函数 b函数 c函数 d函数 e函数图7.1 函数调用示意图 在C语言中,函数分为主函数、库函数、 7.2 库函数 C语言提供了丰富的标准函数,即库函数。 7.2.1 C语言常用库函数 1) 数学函数 调用数学库函数时,要求程序在调用数学库函数前应包含下面的头文件: # include ma
3、 7.2 库函数 C语言提供 2) 字符函数和字符串函数 调用字符函数时,要求程序在调用字符函数前应包含下面的头文件: # include ctype.h 调用字符串函数时,要求在源文件中应包含下面的头文件: # include string.h 2) 字符函数和字符串函数 3) 输入输出函数 调用输入输出函数时,要求在源文件中应包含下面的头文件: # include stdio.h 4) 动态分配函数和随机函数 调用动态分配函数和随机函数时,要求在源文件中应包含下面的头文件: # include stdlib.h 3) 输入输出函数7.2.2 标准库函数的调用 前面讲到,调用C语言标准库函数
4、时必须在源程序中用include命令。 include命令的格式是: # include 或 # include 头文件名7.2.2 标准库函数的调用 前面7.3 函数的定义和调用 由用户编写的函数称为自定义函数。 7.3.1 函数的定义 函数定义的一般格式如下: 类型说明符 函数名(类型名 形式参数1 , 类型名 形式参数2 , ) /* 函数的首部 */ 说明部分 /* 函数体 */ 语句部分 7.3 函数的定义和调用 由用户编写的 7.3.2 函数的调用 1. 函数调用的一般形式 函数调用的一般形式为: 函数名(实参表) ; 如果是调用无参函数,则实参表可以没有,但括号不能省略。如果实参
5、表列包含多个实参,则各实参间用逗号隔开。实参与形参的个数应相等,类型应一致。实参与形参按顺序对应,一一传递数据。 7.3.2 函数的调用 2. 函数调用的方式 按函数在程序中出现的位置来分,有3种函数调用方式。 1) 函数语句 函数语句的调用,是指把被调函数作为一个独立的语句直接出现在主调函数中。 2) 函数表达式 被调函数出现在主调函数中的表达式中,这种表达式称为函数表达式。在被调函数中,必须有一个函数返回值,返回主调函数以参加表达式的运算。 2. 函数调用的方式 3) 函数参数 函数参数的调用,是指被调函数作为另一个函数的参数时的调用,而另一个函数则是被调函数的主调函数。嵌套调用,如图7.
6、2所示。 main函数 printf函数 max函数图7.2 函数嵌套调用 3) 函数参数 main函数 prin 3. 调用函数时的注意事项 调用函数时,应注意以下几点: (1) 被调函数必须是已存在的函数,可以是自定义函数,也可以是库函数。 (2) 在主调函数中,要对被调函数先做声明。 3. 调用函数时的注意事项 (3) 如果被调函数的返回值为int类型,则不管被调函数位置如何均不需要在主调函数中说明。 关于函数声明的一般形式为: 函数类型 函数名(参数类型1 , 参数类型2) ; 或 函数类型 函数名(参数类型1 , 参数名1 , 参数类型2 , 参数名2) ; (4) 如果被调用函数的
7、声明放在源文件的开头,则该声明对整个源文件都有效。 (5) 如果被调用函数的声明是在调用函数定义的内部,则该声明仅对该调用函数有效。 (3) 如果被调函数的返回值为int (6) 在函数调用中,有下面几种情况可以省略声明: a. 如果调用函数和被调用函数是在同一个源文件中,而且被调用函数的定义是在调用函数之前。 b. 函数的返回值是整数或字符。 c. 所有被调用函数的声明都是在源文件开头。 d. 如果被调用函数不是在源文件开头,而是在源文件中间且在所有函数之外某处被声明时,则在被声明之后引用它时,不必再声明,但在被声明之前引用它时,需要对其进行声明。 (7) 如果调用函数和被调用函数的定义是在
8、同一源文件中,应该先说明或定义被调用函数。 (6) 在函数调用中,有下面几种情况可以省略声7.4 函数的返回值及其类型 函数的返回值通过函数体内的return语句实现。 return语句的格式如下: return 表达式 ; 或 return (表达式) ; 如果没有返回值,格式中的左、右圆括号可以省略,即写为: return ;7.4 函数的返回值及其类型 函数的7.5 函数调用时参数间的传递 函数之间的联系,是通过调用函数时参数的传递及函数值的返回。 在定义函数时,函数名后面圆括号内的参数称形式参数。 调用函数时,函数名后面圆括号内的参数为实参。7.5 函数调用时参数间的传递 函数 7.5
9、.1 变量、常量、数组元素作为函数参数 在函数调用时,使用变量、常量或数组元素作为函数参数时,将实参的值复制到形参相应的存储单元中,即形参和实参分别占用不同存储单元,这种传递方式称为“值传递”。 值传递的特点是单向传递,即只能把实参的值传递给形参,而形参值的任何变化都不会影响实参。 7.5.1 变量、常量、数组元素作为函数参数 7.5.2 数组名作为函数参数 数组名作为函数参数时,不是值的单向传递,而是把实参数组的首地址传给形参数组,这个两个数组共用一段存储单元,即实参数组名和形参数组名共同指向数组的第一个元素。 7.5.2 数组名作为函数参数7.6 函数的嵌套调用 C语言中的函数定义是互相独
10、立的,函数和函数之间没有从属关系,一个函数既可以被其它函数调用,同时它也可以调用别的函数,这就是函数的嵌套调用。 fun1main返回printffun2返回调用调用调用结束图7.4 函数嵌套调用过程 7.6 函数的嵌套调用 C语言中的函数7.7 函数的递归调用 所谓递归,就是自己调用自己。 函数的递归调用有两种形式: (1) 直接递归调用,即一个函数可直接调用该函数本身。 (2) 间接递归调用,即一个函数可间接地调用该函数本身。7.7 函数的递归调用 所谓递归,就是7.8 局部变量和全局变量 7.8.1 局部变量 在一个函数内定义的变量称为内部变量,它只在本函数内有效,而在其它函数内不能使用
11、,故这些变量又称为局部变量。 7.8.2 全局变量 在函数外部定义的变量称为外部变量,外部变量是全局变量。全局变量的作用范围为:从定义全局变量位置开始到源程序结束。 全局变量可以在其作用范围内由其它函数所共用。 7.8 局部变量和全局变量 7.8.1 局部变量7.9 静态存储变量和动态存储变量 变量从变量值存在的时间(即时域,亦称生存期)角度来分,可分为静态存储变量和动态存储变量。 7.9.1 静态存储变量 所谓静态存储变量是指在程序运行期间分配固定的存储空间的变量。静态存储变量的定义格式为: static 数据类型名 变量名=初始化常数表达式7.9 静态存储变量和动态存储变量 7.9.2 动
12、态存储变量 所谓动态存储变量是在程序运行期间根据需要进行动态的分配存储变量,它是在程序执行的某一时刻被动态建立,在另一时刻被动态撤消的一种变量。 动态存储变量有两种:自动(auto)变量和寄存器(register)变量。 7.9.2 动态存储变量 1. 自动变量 自动变量说明的一般格为: auto 类型名 变量名=初始表达式 , auto为自动变量存储类别标识符,auto可省略,系统默认为auto。以前函数中所定义的变量大都是auto变量。 2. 寄存器变量 所谓寄存器变量,是指将变量的值保留在CPU(中央处理器)的寄存器内,它不占用内存单元。程序运行时,可以直接访问寄存器内的数据,其速度比访
13、问内存的数据快得多。 register 类型标识符号 变量名 1. 自动变量7.10 内部函数和外部函数 根据函数的使用范围,可分为内部函数和外部函数。 7.10.1 内部函数 在定义函数的前面使用static关键字,此函数称内部函数。 7.10.2 外部函数 在定义函数的前面加extern关键字,此函数称为外部函数。如: extern int fun(a , b)7.10 内部函数和外部函数 根据函数的7.11 程序举例 【例7-16】 编写函数,要求统计输入文本中单词的个数,单词之间用空格符、换行符、跳格符隔开。 程序如下: # include stdio.h“ # define IN 1
14、 /* 标志一个单词的内部 */ # define OUT 0 /* 标志一个单词的外部 */ main() int n ; n=countword(); printf(n=%dn , n) ; 7.11 程序举例 【例7-16】 编写函数, countword() int c , nw , state ; state=OUT ; nw=0 ; while (c=getchar()!=EOF) if (c= | c=n | c=t) state=OUT; /* 在一个单词的外部 */ else if (state=OUT) /* 如果遇到单词的第一个字符 */ state=IN ; /* 状态
15、变量置成IN,在单词的内部 */ nw+ ; /* 单词个数增1 */ return nw ; countword() 说明: (1) 当状态变量state标志为:在单词内部且读入的字符不是分隔符时,表示c仍是单词的一部分,因此不作任何操作;如果读入的字符是分隔符,表示一个单词已结束,准备统计下一个单词。 (2) 在while循环中,用EOF作为循环结束的标志,EOF是在stdio.h文件中定义了的预定义符,在Turbo C的环境下,输入Ctrl+Z后,回车,即输入了EOF。 说明: 【例7-17】 从键盘输入一较大正整数n(n=6),并验证从6到n之间的所有偶数都可以分解为两个素数之和的形式
16、。 程序如下: # include stdio.h # include math.h int prime(int m) int i , k ; k=sqrt(m) ; for (i=2 ; i=6:) ; scanf (%d , &limit) ; if (limit=6) break ; main() for (n=6; n=limit; n+=2) for (a=3; a=n/2; a+=2) if (prime(a) b=na ; if (prime(b) printf (%d=%d+%dn , n , a , b) ; break ; for (n=6; n=limit; n+=2 说
17、明: (1) prime(m)函数是用于验证m是不是素数的函数。当其返回值为0时,说明m不是素数;当其返回值为1时,说明m是素数。 (2) main()函数中有一个双层循环,第一层循环的循环变量n是一个从开始到limit为止的连续偶数,此程序的主要功能就是判断这些偶数是否都能表示成两个素数之和的形式;第二层循环的主要目的是寻找a、b(b=n-a)两个素数之和,以使n=a+b成立。由于除此之外,其它素数都是奇数,因而a、b始终取奇数。 (3) 由此程序不难看出,如果一个偶数能够表示为一组以上的素数之和,则只取一个素数最小、另一个素数最大的一组。 说明: 【例7-18】 输入100个整型数,并把其中的最大值和最小值显示出来。 程序如下: # include stdio.h int max , min ; void find (int a , int n) int i ; max=a0 ; min=a0 ; for (i=1 ; ima
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 地理参考答案安徽铜陵、黄山、宣城三市2026届高三4月份质量检测(三市二模)(4.7-4.9)
- 福州英华职业学院《税法》2025-2026学年期末试卷
- 上饶师范学院《文化遗产概论》2025-2026学年期末试卷
- 南昌大学科学技术学院《初级经济学》2025-2026学年期末试卷
- 长白山职业技术学院《政策与法律法规》2025-2026学年期末试卷
- 马鞍山师范高等专科学校《互联网与社会》2025-2026学年期末试卷
- 2026年银川市西夏区社区工作者招聘考试参考题库及答案解析
- 厦门海洋职业技术学院《康复护理学》2025-2026学年期末试卷
- 扬州大学《社会研究方法》2025-2026学年期末试卷
- 福建师范大学协和学院《变态心理学》2025-2026学年期末试卷
- 2025年山东省委党校在职研究生招生考试(政治理论)历年参考题库含答案详解(5卷)
- 2023年《高等教育学》考点速记速练300题(详细解析)
- 质量意识提升培训PPT
- 上海市2023年基准地价更新成果
- GB/T 7631.14-1998润滑剂和有关产品(L类)的分类第14部分:U组(热处理)
- GB/T 12008.2-2010塑料聚醚多元醇第2部分:规格
- 选择性必修一Unit1comfort-food课件(2020牛津译林版)
- 脊柱解剖学基础课件
- 高考历史考前备考指导课件:小论文方法指导-自拟论题、观点评析
- DB4401-T 19-2019涉河建设项目河道管理技术规范-(高清现行)
- 人保财险《保险基础知识》专题多选和简答
评论
0/150
提交评论