第6章_函数与编译预处理_第1页
第6章_函数与编译预处理_第2页
第6章_函数与编译预处理_第3页
第6章_函数与编译预处理_第4页
第6章_函数与编译预处理_第5页
已阅读5页,还剩132页未读 继续免费阅读

下载本文档

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

文档简介

1、普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材 函数是函数是 C C语言程序的基本模块,由于采用了函数模语言程序的基本模块,由于采用了函数模块式的结构,块式的结构,C C 语言易于实现结构化程序设计,使程序语言易于实现结构化程序设计,使程序的结构清晰、减少重复编写程序的工作量、提高程序的的结构清晰、减少重复编写程序的工作量、提高程序的可读性和可维护性。本章主要介绍函数的定义与调用、可读性和可维护性。本章主要介绍函数的定义与调用、函数间的数据传递方法、函数的递归调用、变量的作用函数间的数据传递方法、函数的递归调用、变量的作用域和存储类别以及编译预处理命令等相关内容。域和存储

2、类别以及编译预处理命令等相关内容。 普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材6.1 函数概述函数概述6.2 函数的调用函数的调用6.3 函数的参数传递方式与函数的返回值函数的参数传递方式与函数的返回值6.4 函数的嵌套调用与递归调用函数的嵌套调用与递归调用 6.5 变量的作用域与存储类别变量的作用域与存储类别6.6 内部函数和外部函数内部函数和外部函数6.7 编译预处理编译预处理 6.8 文件包含文件包含 6.9 条件编译条件编译 6.10 程序举例程序举例普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材普通高等教育普通高等教育“十一五十一五”国

3、家级规划教材国家级规划教材6.1 函数概述6.1.1 6.1.1 模块化程序设计方法模块化程序设计方法 通常人们在求解一个复杂或较大规模的问题时,一般都采通常人们在求解一个复杂或较大规模的问题时,一般都采用逐步分解、分而治之的方法,也就是把一个大而复杂的问题用逐步分解、分而治之的方法,也就是把一个大而复杂的问题分解成若干个比较容易求解的小问题,然后分别求解。根据这分解成若干个比较容易求解的小问题,然后分别求解。根据这一法则,程序员在设计一个大而复杂的程序时,往往也是首先一法则,程序员在设计一个大而复杂的程序时,往往也是首先把整个程序划分为若干个功能较为单一的程序模块,其次分别把整个程序划分为若

4、干个功能较为单一的程序模块,其次分别予以实现,最后再把所有的程序模块像搭积木一样装配起来,予以实现,最后再把所有的程序模块像搭积木一样装配起来,完成一个完整的程序,从而达到所要求的目的。这种在程序设完成一个完整的程序,从而达到所要求的目的。这种在程序设计中逐步分解、分而治之的策略,称为模块化程序设计方法。计中逐步分解、分而治之的策略,称为模块化程序设计方法。 如果软件可划分为可独立命名和编程的部件,则每个部件如果软件可划分为可独立命名和编程的部件,则每个部件称为一个模块。模块化就是把系统划分成若干个模块,每个模称为一个模块。模块化就是把系统划分成若干个模块,每个模块完成一个子功能,把这些模块集

5、中起来组成一个整体,从而块完成一个子功能,把这些模块集中起来组成一个整体,从而完成指定的功能,满足问题的要求。完成指定的功能,满足问题的要求。普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材例如,图书管理系统模块划分如图例如,图书管理系统模块划分如图6-16-1所示。所示。图图6-1 6-1 图书管理系统模块划分示意图图书管理系统模块划分示意图6.1 函数概述普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材 在在C C语言中,函数是程序的基本组成单位,因此可以很方便地用函数作语言中,函数是程序的基本组成单位,因此可以很方便地用函数作为程序模块来实现为程序

6、模块来实现C C语言程序。利用函数,不仅可以实现程序的模块化,避语言程序。利用函数,不仅可以实现程序的模块化,避免大量的重复工作、简化程序,提高程序的易读性和可维护性,还可以提免大量的重复工作、简化程序,提高程序的易读性和可维护性,还可以提高效率。高效率。 例如,以下是使用主函数调用例如,以下是使用主函数调用line()line()函数输出一个简单的信头的程序。函数输出一个简单的信头的程序。 #include #include Void line() Void line() / /* * 定义函数定义函数 * */ / printf(=n); printf(=n); void main()vo

7、id main() line(); / line(); /* * 调用函数调用函数 * */ / printf(%s, Xinjiang Agricultural Universityn); printf(%s, Xinjiang Agricultural Universityn); printf(%s,No.42 Nanchang Rd,Urumqi,Xinjiang,P.R.Chinan); printf(%s,No.42 Nanchang Rd,Urumqi,Xinjiang,P.R.Chinan); line(); / line(); /* * 调用函数调用函数 * */ / 程序运行

8、结果:程序运行结果:= Xinjiang Agricultural University Xinjiang Agricultural University No.42 Nanchang Rd,Urumqi,Xinjiang,P.R.China No.42 Nanchang Rd,Urumqi,Xinjiang,P.R.China=6.1 函数概述普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材6.1.2 函数的分类函数的分类 C 语言不仅提供了极为丰富的库函数,还语言不仅提供了极为丰富的库函数,还允许用户建立自己定义的函数。我们可以从不允许用户建立自己定义的函数。我们可以从

9、不同的角度对同的角度对 C 语言的函数进行分类。语言的函数进行分类。6.1 函数概述普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材6.1.2 6.1.2 函数的分类函数的分类 1 1从函数定义的角度,函数可分为从函数定义的角度,函数可分为库函数库函数( (又称又称标准函数标准函数) )和和用户自定义函数用户自定义函数两种。两种。 库函数包括了常用的数学函数、字符和字符串处理函数、库函数包括了常用的数学函数、字符和字符串处理函数、输入输入 / / 输出函数等。对每一类库函数,系统都提供了相应的头输出函数等。对每一类库函数,系统都提供了相应的头文件,该头文件中包含了这一类库函

10、数的声明,如数学函数的文件,该头文件中包含了这一类库函数的声明,如数学函数的说明包含在说明包含在“math.h”math.h”文件中文件中, ,所以程序中如果要用到库函数时所以程序中如果要用到库函数时,在程序文件的开头应使用,在程序文件的开头应使用#include#include命令包含相应的头文件。命令包含相应的头文件。用户自定义函数是用户根据自己的需要编写的函数,以解决用用户自定义函数是用户根据自己的需要编写的函数,以解决用户的专门需要。户的专门需要。6.1 函数概述普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材6.1.2 6.1.2 函数的分类函数的分类 2 2从函

11、数是否具有返回值的角度,函数分为从函数是否具有返回值的角度,函数分为有返回有返回值函数值函数和和无返回值函数无返回值函数两种。两种。 有返回值函数被调用执行完后将向调用者返回一个执有返回值函数被调用执行完后将向调用者返回一个执行结果,即函数返回值。如数学函数行结果,即函数返回值。如数学函数sin()sin()等即属于此类函等即属于此类函数。无返回值函数用于完成某项特定的处理任务,执行完数。无返回值函数用于完成某项特定的处理任务,执行完成后不向调用者返回函数值。由于函数无须返回值,用户成后不向调用者返回函数值。由于函数无须返回值,用户在定义此类函数时可指定它的返回值为在定义此类函数时可指定它的返

12、回值为“空类型空类型”,空类,空类型的说明符为型的说明符为“void”void”。6.1 函数概述普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材6.1.2 6.1.2 函数的分类函数的分类 3 3从函数是否带有参数角度,函数分为从函数是否带有参数角度,函数分为无参函数无参函数和和有参函数有参函数两种。两种。 无参函数在调用时,主调函数并不将数据无参函数在调用时,主调函数并不将数据传送给被调函数。而调用有参数函数时,在主传送给被调函数。而调用有参数函数时,在主调函数和被调函数之间有数据传送。调函数和被调函数之间有数据传送。6.1 函数概述普通高等教育普通高等教育“十一五十一

13、五”国家级规划教材国家级规划教材6.1.3 6.1.3 函数的定义函数的定义 函数是函数是C C语言程序的模块结构,除了标准库函数以外语言程序的模块结构,除了标准库函数以外, ,要在要在C C语言程序中使用用户自定义函数,必须遵循函数的先定义、语言程序中使用用户自定义函数,必须遵循函数的先定义、后声明、再使用的步骤,即首先应定义好函数的数据类型、存后声明、再使用的步骤,即首先应定义好函数的数据类型、存储类型和函数体,然后才能进行使用。储类型和函数体,然后才能进行使用。 C C语言函数的定义形式如下:语言函数的定义形式如下: 数据类型说明符数据类型说明符 函数名函数名(形参定义表形参定义表) 内

14、部资料的说明内部资料的说明 执行语句执行语句 6.1 函数概述普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材例如:例如:说明:说明: 数据类型确定该函数返回值的数据类型,缺省时系统认为是数据类型确定该函数返回值的数据类型,缺省时系统认为是 整型或字符型。整型或字符型。 函数名由用户自己确定,必须符合函数名由用户自己确定,必须符合C C语言标识符的规则。语言标识符的规则。 形参之间用逗号隔开。函数可以没有形参,但函数名后面的形参之间用逗号隔开。函数可以没有形参,但函数名后面的 一对圆括号不能缺省。一对圆括号不能缺省。6.1 函数概述普通高等教育普通高等教育“十一五十一五”国

15、家级规划教材国家级规划教材例例6.1 编写一个函数编写一个函数,输出由指定数量的指定字符组成的分隔条。输出由指定数量的指定字符组成的分隔条。#include #include void line(char c,int n) /*此函数用于输出由指定字符组成的分隔条此函数用于输出由指定字符组成的分隔条 */ int i; for(i=1;i=n;i+) /* 循环循环n次次 */ putchar(c); /* 循环输出循环输出n个字符个字符 */ printf(n);void main() line(*,47); /* 传送传送*字符以及输出的字符个数字符以及输出的字符个数47 */ print

16、f(%s, Xinjiang Agricultural Universityn); printf(%s, No.42 Nanchang Rd,Urumqi,Xinjiang,P.R.Chinan); line(*,47); /* 传送传送*字符以及输出的字符个数字符以及输出的字符个数47 */程序运行结果:程序运行结果:* Xinjiang Agricultural University No.42 Nanchang Rd,Urumqi,Xinjiang,P.R.China*6.1 函数概述普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材6.2 函数的调用函数的调用 在在

17、C C语言中,用户可以根据需要调用任语言中,用户可以根据需要调用任何函数来完成某种处理。一个函数调用另一何函数来完成某种处理。一个函数调用另一个函数称为函数调用。其调用者称为调用函个函数称为函数调用。其调用者称为调用函数,被调用的函数称为被调用函数。数,被调用的函数称为被调用函数。 普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材6.2 函数的调用6.2.1 6.2.1 函数的调用方式函数的调用方式 函数调用的一般形式为:函数调用的一般形式为: 函数名函数名( (实参表实参表) ) 实参可以是常量、变量、表达式及函数,各实实参可以是常量、变量、表达式及函数,各实参之间用逗号

18、隔开,如果函数没有参数,则参之间用逗号隔开,如果函数没有参数,则“实参实参表表”为空。为空。普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材 1 1)函数表达式。)函数表达式。函数调用出现在表达式中。函数调用出现在表达式中。 例如:例如: s=area(3,4,5)s=area(3,4,5); ; 是一个赋值表达式,把是一个赋值表达式,把areaarea函数的返回值赋予变量函数的返回值赋予变量s s。 2 2)函数语句。)函数语句。函数的调用是一个单独的语句。例如函数的调用是一个单独的语句。例如: printf(I love China.n);printf(I love C

19、hina.n); scanf(%d,&a); scanf(%d,&a); 都是以函数语句的方式调用函数。都是以函数语句的方式调用函数。 3 3)函数参数。)函数参数。函数的调用出现在参数的位置。例如函数的调用出现在参数的位置。例如: printf(%d,min(x,y);printf(%d,min(x,y); max(max(a,b),c); max(max(a,b),c); 前者把前者把minmin函数的返回值作为函数的返回值作为printfprintf函数的实参来使用,函数的实参来使用, 而后者把而后者把maxmax函数的返回值又作为函数的返回值又作为max max 函数的

20、实参来使用。函数的实参来使用。 在函数调用中还应该注意的一个问题是求值顺序的问题,所谓求值顺序在函数调用中还应该注意的一个问题是求值顺序的问题,所谓求值顺序是指对实参表中各量是自左至右使用呢,还是自右至左使用。对此,各系统是指对实参表中各量是自左至右使用呢,还是自右至左使用。对此,各系统的规定不一定相同。的规定不一定相同。6.2 函数的调用普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材例例6.2 6.2 求求m m个元素中取出个元素中取出n n个元素的组合数。个元素的组合数。 求组合的公式为:求组合的公式为: 这个问题三次计算阶乘,因此编写一个函数这个问题三次计算阶乘,因

21、此编写一个函数计算阶乘,主函数三次调用计算阶乘的函数,即计算阶乘,主函数三次调用计算阶乘的函数,即可完成组合的计算。可完成组合的计算。)!( !nmnmCnm6.2 函数的调用普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材void main( )void main( ) long cmn; long cmn; int m, n, t; int m, n, t; printf(input m,n=); printf(input m,n=); scanf(%d,%d,&m,&n); scanf(%d,%d,&m,&n); if(mn) if(m

22、n) / /* * 若若mnmn,则交换,则交换m,nm,n的值的值 * */ / t=m; m=n; n=t; t=m; m=n; n=t; cmn=fac(m); cmn=fac(m); / /* * 调用调用facfac函数计算函数计算m! m! * */ / cmn=cmn/fac(n); cmn=cmn/fac(n); / /* * 调用调用facfac函数计算函数计算n!n!,并且计算(,并且计算(m! / n!m! / n!)* */ / cmn=cmn/fac(m-n); cmn=cmn/fac(m-n); / /* *调用调用facfac函数计算函数计算(m-n)!,(m-n

23、)!,并且计算并且计算m!/(n!(m-n)!) m!/(n!(m-n)!) * */ / printf(cmn=%ldn,cmn); printf(cmn=%ldn,cmn); / /* * 输出计算结果输出计算结果 * */ / 程序运行结果:程序运行结果:input m,n=10,3 cmn=1206.2 函数的调用#include #include long fac(int n) long fac(int n) / /* * 此函数用于计算阶乘此函数用于计算阶乘 * */ / long t=1; long t=1; int k; int k; for(k=2;k=n;k+) for(k

24、=2;k=n;k+) t=t t=t* *k;k; return(t); return(t); 普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材6.2.1 6.2.1 函数的调用方式函数的调用方式 C C语言程序中一个函数调用另一个函数需要具备的条件是:语言程序中一个函数调用另一个函数需要具备的条件是: 被调用的函数必须是已经存在的函数,是库函数或用户自被调用的函数必须是已经存在的函数,是库函数或用户自定义函数。定义函数。 如果调用库函数,必须要在程序文件的开头用如果调用库函数,必须要在程序文件的开头用#include#include命命令将与被调用函数有关的库函数所在的头

25、文件包含到文件中来。令将与被调用函数有关的库函数所在的头文件包含到文件中来。如在前面几章已经用过的文件包含宏命令(详见如在前面几章已经用过的文件包含宏命令(详见6.86.8节内容):节内容): #include /#include /* *说明被调用函数将要用到数学函数说明被调用函数将要用到数学函数* */ /6.2 函数的调用普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材 如果调用用户自定义函数,并且该函数与调用它的函如果调用用户自定义函数,并且该函数与调用它的函数(即主调函数)在同一个程序文件中,一般还应该在主调函数(即主调函数)在同一个程序文件中,一般还应该在主调函

26、数中对被调函数作声明。数中对被调函数作声明。即向编译系统声明将要调用此函数,即向编译系统声明将要调用此函数,并将有关信息通知编译。并将有关信息通知编译。 与函数定义的格式对应,函数的声明格式如下:与函数定义的格式对应,函数的声明格式如下: 存储类型存储类型 类型标识符类型标识符 函数名函数名( (形参的定义表形参的定义表) ); 例如:要对例例如:要对例6.16.1和例和例6.26.2中被调用函数中被调用函数 void line(char c,int n)void line(char c,int n) 作函数原型的声明,只在其最后再加一个分号即可,即:作函数原型的声明,只在其最后再加一个分号即

27、可,即: void line(char c,int n);void line(char c,int n); long fac(int n); long fac(int n);6.2 函数的调用普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材#include #include void line(char c,int n) ;void main() line(*,47); printf(%s, Xinjiang Agricultural Universityn); printf(%s, No.42 Nanchang Rd,Urumqi,Xinjiang,P.R.Chinan)

28、; line(*,47);void line(char c,int n) int i; for(i=1;i=n;i+) putchar(c); printf(n);6.2 函数的调用普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材6.2.1 6.2.1 函数的调用方式函数的调用方式 以下几种情况可以不在主调函数中对被调函数原型进行声以下几种情况可以不在主调函数中对被调函数原型进行声明:明: 如果被调用函数的定义出现在主调函数之前如果被调用函数的定义出现在主调函数之前, ,可以不必可以不必加声明。加声明。 例如,在例例如,在例6.16.1和例和例6.26.2中,函数中,函数l

29、ine()line()和和fac()fac()均被写在均被写在主函数主函数main()main()之前,在主函数之前,在主函数main()main()的前面可以不必对被调函的前面可以不必对被调函数数line()line()、fac()fac()进行声明。如果函数进行声明。如果函数line()line()和和fac()fac()均被写在均被写在主函数主函数main()main()之后,则在主函数之后,则在主函数main()main()之前必须对被调函数之前必须对被调函数line()line()、fac()fac()进行声明。例如,例进行声明。例如,例6.16.1将其写在将其写在#include

30、#include 和和void line(char c,int n)void line(char c,int n)之间,例之间,例6.26.2写在写在#include #include 和和long fac(int n)long fac(int n)之间。之间。 6.2 函数的调用普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材 如果一个函数只被另一个函数所调用如果一个函数只被另一个函数所调用, ,在主调函数中声在主调函数中声明和在函数外声明是等价的。如果一个函数被多个函数所调用明和在函数外声明是等价的。如果一个函数被多个函数所调用,可以在所有函数的定义之前对被调函数进行声

31、明,这样,在,可以在所有函数的定义之前对被调函数进行声明,这样,在所有主调函数中就不必再对被调函数进行声明了。所有主调函数中就不必再对被调函数进行声明了。 函数的定义和函数原型的声明不是一回事。函数的定义是函数的定义和函数原型的声明不是一回事。函数的定义是对函数功能的确定,包括指定函数名、函数值的类型、形式参对函数功能的确定,包括指定函数名、函数值的类型、形式参数及其类型、函数体等,它是一个完整的、独立的程序函数单数及其类型、函数体等,它是一个完整的、独立的程序函数单位。函数原型的声明的作用是把函数的名字、函数的类型及参位。函数原型的声明的作用是把函数的名字、函数的类型及参数的类型、个数、顺序

32、通知编译系统,以便在调用该函数时系数的类型、个数、顺序通知编译系统,以便在调用该函数时系统按此进行对照检查(函数名是否正确,实参和形参的个数、统按此进行对照检查(函数名是否正确,实参和形参的个数、类型、顺序是否一致)。另外,对被调函数原型的声明,仅仅类型、顺序是否一致)。另外,对被调函数原型的声明,仅仅是在已定义的函数的首部最后再加一个分号即可。是在已定义的函数的首部最后再加一个分号即可。6.2 函数的调用普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材6.3 函数的参数传递方式与函数的返回值6.3.1 6

33、.3.1 函数的参数传递方式函数的参数传递方式 函数的参数主要用于在主调函数和被调函数之间进行数据函数的参数主要用于在主调函数和被调函数之间进行数据传递。传递。在定义函数时,函数名后面圆括号中的变量名称为形式在定义函数时,函数名后面圆括号中的变量名称为形式参数参数,简称形参。,简称形参。在主调函数中调用一个函数时,函数名后面在主调函数中调用一个函数时,函数名后面圆括号中的参数称为实际参数圆括号中的参数称为实际参数,简称实参。在函数调用时,主,简称实参。在函数调用时,主调函数把实参的值(实参都必须具有确定的值)传送给被调函调函数把实参的值(实参都必须具有确定的值)传送给被调函数的形参,从而实现主

34、调函数向被调函数的数据传送,达到被数的形参,从而实现主调函数向被调函数的数据传送,达到被调函数从主调函数接收数据的目的。在调函数从主调函数接收数据的目的。在C C语言中,参数的类型不语言中,参数的类型不同,其传递方式也不同,同,其传递方式也不同, 下面给出下面给出C C语言中的参数传递方式。语言中的参数传递方式。普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材6.3.1 6.3.1 函数的参数传递方式函数的参数传递方式 简单变量作函数参数时,主调函数把实参的值传送给被调简单变量作函数参数时,主调函数把实参的值传送给被调函数的形参,从而实现主调函数向被调函数的数据传送。进行函

35、数的形参,从而实现主调函数向被调函数的数据传送。进行数据传送时,形参和实参具有以下特点:数据传送时,形参和实参具有以下特点: 形参与实参各占独立的存储单元。形参与实参各占独立的存储单元。但是值得注意的是,但是值得注意的是,形参变量只有在被调用时才分配临时内存单元形参变量只有在被调用时才分配临时内存单元, ,在调用结束时,在调用结束时,立即释放所分配的内存单元。因此立即释放所分配的内存单元。因此, ,形参只有在函数内部使用,形参只有在函数内部使用,函数调用结束返回主调函数后,则不能再使用该形参变量。函数调用结束返回主调函数后,则不能再使用该形参变量。 函数调用中发生的数据传送是单向的(也被称为函

36、数调用中发生的数据传送是单向的(也被称为“值传值传递递”方式),即只能把实参的值传送给形参,而不能把形参的方式),即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参,因此在函数调用过程中,形参的值发生值反向地传送给实参,因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。改变,而实参中的值不会变化。6.3 函数的参数传递方式与函数的返回值普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材例例6.3 6.3 编写一个程序,将主函数中的两个变量的值传送给编写一个程序,将主函数中的两个变量的值传送给swapswap函数中的两个形参,交换两个形参的值。函数中的两个

37、形参,交换两个形参的值。#include #include void swap(int x,int y) void swap(int x,int y) / /* * 简单变量作被调函数的形参简单变量作被调函数的形参 * */ / int t; int t; t=x; x=y; y=t; t=x; x=y; y=t; / /* * 通过中间变量通过中间变量t t,进行数据交换,进行数据交换 * */ / printf(x=%d, y=%dn,x,y);printf(x=%d, y=%dn,x,y); void main()void main() int a=10,b=20; int a=10,b

38、=20; swap(a,b); swap(a,b); / /* * 调用调用swapswap函数时,简单变量函数时,简单变量a,ba,b做实参做实参 * */ / printf(a=%d, b=%dn,a,b); printf(a=%d, b=%dn,a,b); 程序运行结果:程序运行结果:x=20, y=10a=10, b=206.3 函数的参数传递方式与函数的返回值普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材6.3.1 6.3.1 函数的参数传递方式函数的参数传递方式 (1) (1) 数组元素作函数的参数数组元素作函数的参数 数组元素作函数的参数,与简单变量作参数一

39、数组元素作函数的参数,与简单变量作参数一样,遵循单向的样,遵循单向的“值传递值传递”。即数组元素把它的值。即数组元素把它的值传递到系统为形参变量分配的临时存储单元中。传递到系统为形参变量分配的临时存储单元中。6.3 函数的参数传递方式与函数的返回值普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材例例6.4 一个班学生的成绩已存入一个一维数组中一个班学生的成绩已存入一个一维数组中,调用函数统计及格的人数。调用函数统计及格的人数。#include #define N 10int fun(int x) /* 简单变量作被调函数的形参简单变量作被调函数的形参 */ if(x=60)

40、 return(1); /* 若学生成绩及格返回若学生成绩及格返回1 */ else return(0); /* 若学生成绩不及格返回若学生成绩不及格返回0 */void main() int cjN=76,80,65,60,58,91,47,63,70,85; int count=0,k; for(k=0;kN;k+) if(fun(cjk) /* 调用调用fun函数时,数组元素函数时,数组元素cjk做实参做实参 */ count+; /* 若若fun(cjk)的值为的值为1,则学生及格人数加,则学生及格人数加1 */ printf(count=%dn,count); /* 输出及格的人数输

41、出及格的人数 */程序运行结果:程序运行结果:count=86.3 函数的参数传递方式与函数的返回值普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材 6.3.1 6.3.1 函数的参数传递方式函数的参数传递方式 (2 2) 数组名作函数的参数数组名作函数的参数 简单变量和数组元素作函数的参数,遵循的是简单变量和数组元素作函数的参数,遵循的是“值传递值传递”方式,而数组名作函数的参数,遵循方式,而数组名作函数的参数,遵循“地址传递地址传递”方式,即在方式,即在函数调用时,若数组名作函数的参数,则将数组的起始地址(函数调用时,若数组名作函数的参数,则将数组的起始地址(数组名代表

42、数组的起始地址)作为参数传递给形参。换言之,数组名代表数组的起始地址)作为参数传递给形参。换言之,“地址传递地址传递”方式的特点是,形参数组和实参数组共同使用同方式的特点是,形参数组和实参数组共同使用同样的内存单元,被调函数中对形参数组的操作其实就是对实参样的内存单元,被调函数中对形参数组的操作其实就是对实参数组的操作,因此,函数中对形参值的改变也会改变实参的值数组的操作,因此,函数中对形参值的改变也会改变实参的值。 6.3 函数的参数传递方式与函数的返回值普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材例例6.5 一个班学生的成绩已存入一个一维数组中,调用函数求平均成绩。

43、一个班学生的成绩已存入一个一维数组中,调用函数求平均成绩。#include #define N 10float average(float xN) /* 数组作被调函数的形参数组作被调函数的形参 */ float sum=0,aver; int k; for(k=0;kN;k+) /* 计算成绩之和计算成绩之和 */ sum+=xk; aver=sum/N; /* 计算平均成绩计算平均成绩 */ return(aver);void main() float cjN,aver; int k; printf(input %d scores:n,N); for(k=0;kN;k+) /* 通过键盘输

44、入通过键盘输入N个学生的成绩个学生的成绩 */ scanf(%f,&cjk); aver=average(cj); /* 调用调用average函数时,数组名函数时,数组名cj作实参作实参 */ printf(average score is:%6.2fn,aver);6.3 函数的参数传递方式与函数的返回值普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材程序运行结果程序运行结果:input 10 score:78 67 60 58 90 88 71 54 62 80 average score is: 70.806.3 函数的参数传递方式与函数的返回值普通高等教育

45、普通高等教育“十一五十一五”国家级规划教材国家级规划教材例例6.6 使用调用函数的方法,将两个字符串连接成一个字符串。使用调用函数的方法,将两个字符串连接成一个字符串。#include #include #define M 50 #define M 50 / /* * 定义第一个字符串的最大长度定义第一个字符串的最大长度 * */ /#define N 25 #define N 25 / /* * 定义第二个字符串的最大长度定义第二个字符串的最大长度 * */ /void cat_str(char str1M,char str2Nvoid cat_str(char str1M,char str

46、2N)/ /* * 字符数组作被调函数的形参字符数组作被调函数的形参 * */ / int i=0,j=0; int i=0,j=0; while(str1i!=0) while(str1i!=0) / /* * 测出第一个字符串的长度测出第一个字符串的长度 * */ / i+; i+; while(str2j!=0) while(str2j!=0) / /* * 将第二个字符串连接到第一个字符串的的后面将第二个字符串连接到第一个字符串的的后面 * */ / str1i=str2j; str1i=str2j; i+; i+; j+; j+; void main()void main() cha

47、r str1M=A,B,C; char str1M=A,B,C; / /* * 定义并初始化第一个字符串定义并初始化第一个字符串 * */ / char str2N=D,E,F,G,H; char str2N=D,E,F,G,H; / /* * 定义并初始化第二个字符串定义并初始化第二个字符串 * */ / printf(str1:%sn,str1); printf(str1:%sn,str1); / /* * 输出第一个字符串输出第一个字符串 * */ / printf(str2:%sn,str2); printf(str2:%sn,str2); / /* * 输出第二个字符串输出第二个字符

48、串 * */ / cat_str(str1,str2); cat_str(str1,str2); / /* * 调用函数进行字符串的连接调用函数进行字符串的连接 * */ / printf(strcat string:%sn,str1); printf(strcat string:%sn,str1); / /* * 输出连接后的字符串输出连接后的字符串 * */ / 6.3 函数的参数传递方式与函数的返回值普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材程序运行结果程序运行结果: str1:ABC str2:DEFGH strcat string:ABCDEFGH注意:注意

49、: 在被调函数中可以说明形参数组的大小,也可以不说明形在被调函数中可以说明形参数组的大小,也可以不说明形参数组的大小。例如,在例参数组的大小。例如,在例6.56.5和例和例6.66.6中,可以写成:中,可以写成:average(float x)average(float x)和和cat_str(char str1,char str2)cat_str(char str1,char str2)。实际上指定形参数组的大小不起任何作用,因为,实际上指定形参数组的大小不起任何作用,因为,C C编译系统对编译系统对形参数组的大小不做检查,只是将实参数组的起始地址传递给形参数组的大小不做检查,只是将实参数组

50、的起始地址传递给对应的形参数组。有时为了处理的需要,可以设置另一个参数对应的形参数组。有时为了处理的需要,可以设置另一个参数传递需要处理的数组元素的个数。另外,实参数组名和形参数传递需要处理的数组元素的个数。另外,实参数组名和形参数组名可一致,也可以取不同的数组名。组名可一致,也可以取不同的数组名。 6.3 函数的参数传递方式与函数的返回值普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材6.3.1 6.3.1 函数的参数传递方式函数的参数传递方式 (3 3)多维数组名作函数的参数)多维数组名作函数的参数 多维数组名作函数的参数时,除第一维可以不指定多维数组名作函数的参数时,

51、除第一维可以不指定长度外(也可以指定),其余各维都必须指定长度。因长度外(也可以指定),其余各维都必须指定长度。因此,以下写法都是合法的:此,以下写法都是合法的: int fun(int a34)int fun(int a34) 或或 int fun(int a4)int fun(int a4)6.3 函数的参数传递方式与函数的返回值普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材例例6.7 使用调用函数的方法使用调用函数的方法,求求34的矩阵中最大和最小的元素。的矩阵中最大和最小的元素。#include #define M 3 /* 定义矩阵的行数定义矩阵的行数 */#d

52、efine N 4 /* 定义矩阵的列数定义矩阵的列数 */void put_matric(int aMN) /* 输出矩阵的函数输出矩阵的函数 */ int i,j; printf(array is:n); for(i=0;iM;i+) for(j=0;jN;j+) printf(%4d,aij); printf(n); printf(n);6.3 函数的参数传递方式与函数的返回值普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材void max(int aN,int b) /*求矩阵元素中最大值和最小值的函数求矩阵元素中最大值和最小值的函数*/ int i,j; b0=a

53、00; /* 假设矩阵的第假设矩阵的第1行第行第1列的元素是最大的列的元素是最大的 */ b1=a00; /* 假设矩阵的第假设矩阵的第1行第行第1列的元素是最小的列的元素是最小的 */ for(i=0;iM;i+) for(j=0;jb0) /* 将矩阵中最大的元素存放在将矩阵中最大的元素存放在b0中中 */ b0=aij; if(aijb1) /* 将矩阵中最小的元素存放在将矩阵中最小的元素存放在b1中中 */ b1=aij; 6.3 函数的参数传递方式与函数的返回值普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材void main() int count,b2,aMN

54、=2,-1,6,8,11,45,-25,0,55,18,3,-7; put_matric(a); max(a,b); printf(max value is:%4dnmin value is:%4dn,b0,b1); 程序运行结果:程序运行结果:array is: 2 -1 6 811 45 -25 055 18 3 -7max value is: 55min value is: -256.3 函数的参数传递方式与函数的返回值普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材例例6.8 使用调用函数,实现矩阵的转置。使用调用函数,实现矩阵的转置。#include #defin

55、e N 3void put_matric(int aNN) /* 输出矩阵的函数输出矩阵的函数 */ int i,j; for(i=0;iN;i+) for(j=0;jN;j+) printf(%4d,aij); printf(n); printf(n);6.3 函数的参数传递方式与函数的返回值普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材6.3 函数的参数传递方式与函数的返回值void fun(int bN) /* 实现矩阵转置函数实现矩阵转置函数 */ int i,j,t; for(i=0;iN;i+) /*将将b矩阵矩阵i行行j列元素和列元素和j行行i列元素进行交换

56、列元素进行交换*/ for(j=i+1;jN;j+) t=bij; bij=bji; bji=t; 普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材void main() int i,j,cNN=1,55,66,35,1,75,25,45,1; printf(original matric:n); put_matric(c); /* 调用输出矩阵函数,输出原始矩阵调用输出矩阵函数,输出原始矩阵 */ fun(c); /* 调用矩阵转置函数调用矩阵转置函数 */ printf(transposed matric:n); put_matric(c); /* 调用输出矩阵函数,输

57、出转置矩阵调用输出矩阵函数,输出转置矩阵 */程序运行结果:程序运行结果: original matric: 1 55 66 35 1 75 25 45 1 transposed matric: 1 35 25 55 1 45 66 75 16.3 函数的参数传递方式与函数的返回值普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材6.3.2 6.3.2 函数的返回值函数的返回值 函数的值是指函数被调用后,执行函数体中的语句序列后函数的值是指函数被调用后,执行函数体中的语句序列后所取得的值。函数的值只能通过所取得的值。函数的值只能通过returnreturn语句返回主调函数。语

58、句返回主调函数。returnreturn语句的一般形式为:语句的一般形式为: return;return; return return 表达式;表达式; return(return(表达式表达式) ); return return语句的作用是:结束函数的执行,并将表达式的值语句的作用是:结束函数的执行,并将表达式的值带回给主调函数。带回给主调函数。 6.3 函数的参数传递方式与函数的返回值普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材说明:说明: 表达式的类型应与函数定义的数据类型一致,如果不一表达式的类型应与函数定义的数据类型一致,如果不一致则以函数定义的数据类型为准。

59、致则以函数定义的数据类型为准。 在一个函数中允许有多个在一个函数中允许有多个returnreturn语句,流程执行到其中语句,流程执行到其中一个一个returnreturn时,立即返回主调函数。时,立即返回主调函数。 如果被调函数中没有如果被调函数中没有returnreturn语句,函数不是不带回值,语句,函数不是不带回值,而是带回一个不确定的值。而是带回一个不确定的值。为了明确表示函数不带回值,可以为了明确表示函数不带回值,可以定义函数为无类型定义函数为无类型“void”void”(或称空类型)。(或称空类型)。 例如:例如: void printline()void printline()

60、 printf( printf(* * * * * * * * * * *n);n); 6.3 函数的参数传递方式与函数的返回值普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材例例6.9 求一个浮点数的绝对值。求一个浮点数的绝对值。#include float xabs(float x) /* 此函数用于求一个浮点数的绝对值此函数用于求一个浮点数的绝对值 */ if(x0) return(-x); else return(x);void main() float x,y; printf(input x=); scanf(%f,&x); y=xabs(x); /* 调用调用xabs函数,并将其结果赋值给函数,并将其结果赋值给

温馨提示

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

评论

0/150

提交评论