C语言程序设计_第六章_函数_第1页
C语言程序设计_第六章_函数_第2页
C语言程序设计_第六章_函数_第3页
C语言程序设计_第六章_函数_第4页
C语言程序设计_第六章_函数_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

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

文档简介

1、第六章第六章 函函 数数6.1 引例引例6.2 C语言函数的基本概念语言函数的基本概念6.3 函数调用函数调用6.4 函数嵌套调用和递归调用函数嵌套调用和递归调用6.5 变量与函数变量与函数6.6 模块化程序设计模块化程序设计6.1 引引 例例引例:编程实现如图结果。引例:编程实现如图结果。6.1 引引 例例【分析】【分析】n从图中看到,三角形星号图形出现了三次从图中看到,三角形星号图形出现了三次n能否仅编写一段程序代码,要输出星号图形能否仅编写一段程序代码,要输出星号图形时就使用该段代码?时就使用该段代码?nC语言提供了这样的功能,以语言提供了这样的功能,以函数函数的组织形的组织形式编写代码

2、,当使用时就式编写代码,当使用时就调用调用此函数。此函数。 6.1 引引 例例【知识点】【知识点】1. 模块化程序设计。模块化程序设计。2. 函数。函数。6.2 C语言函数的基本概念语言函数的基本概念nC语言中,一段有独立功能,又能够多次使语言中,一段有独立功能,又能够多次使用且具有独立名称与一定的输入、输出的用且具有独立名称与一定的输入、输出的代码,称为代码,称为C语言的函数。语言的函数。 n函数是函数是C语言程序的基本组成单元语言程序的基本组成单元n一个一个C程序由一个程序由一个main()和若干其它函数构和若干其它函数构成。成。程序的执行总是从主函数开始,到主程序的执行总是从主函数开始,

3、到主函数结束。函数结束。6.2.1 函数的定义函数的定义n函数定义的一般形式:函数定义的一般形式: ()函数体函数体 第一行称为函数首部,是由函数的数据类型、函数名和形第一行称为函数首部,是由函数的数据类型、函数名和形参列表组成参列表组成 大括号括起来的若干语句是函数体,由完成某一功能的大括号括起来的若干语句是函数体,由完成某一功能的C语句组成语句组成6.2.1 函数的定义函数的定义n在使用一个函数前,必须先对其进行定义在使用一个函数前,必须先对其进行定义 n程序中如果调用了某个函数,该函数就会在完成程序中如果调用了某个函数,该函数就会在完成特定工作后,返回到调用它的地方特定工作后,返回到调用

4、它的地方 n按照返回结果不同有如下两种情况按照返回结果不同有如下两种情况 函数经过一系列运算,得出一个运算结果,并需要返回函数经过一系列运算,得出一个运算结果,并需要返回运算结果运算结果 函数只是完成一系列操作步骤,不需要返回任何结果。函数只是完成一系列操作步骤,不需要返回任何结果。 6.2.1 函数的定义函数的定义【例【例6-1】利用函数实现从键盘输入两个】利用函数实现从键盘输入两个数,输出最大值。数,输出最大值。1、返回结果的函数定义、返回结果的函数定义#includeint max(int x,int y) /* 返回结果的函数定义返回结果的函数定义 * int z; z=xy ? x:

5、y; /* z为为x与与y中最大的值中最大的值 */ printf(max()函数中找出了两数的最大值。函数中找出了两数的最大值。n); return(z); int main(void) int a,b,c; printf(请输入数值请输入数值a和和b的值:的值:n); scanf(%d,%d,&a,&b); printf(main()函数中输入函数中输入a和和b的值,下面调用的值,下面调用max()函数函数n); c=max(a,b); printf(main()函数中输出函数中输出a、b中的最大值是中的最大值是%d。n,c); return 0; 6.2.1 函数的定义函

6、数的定义n返回结果的函数定义形式为:返回结果的函数定义形式为: 返回值类型标识符返回值类型标识符 函数名(形参列表)函数名(形参列表) 变量声明变量声明 语句部分语句部分6.2.1 函数的定义函数的定义void 函数名(形参表)函数名(形参表) 函数体函数体 ;2、不返回结果的函数定义、不返回结果的函数定义6.2.1 函数的定义函数的定义n为了明确表示不需要函数返回值,用为了明确表示不需要函数返回值,用void定义函定义函数为数为“无类型无类型”。n函数体中可以出现函数体中可以出现return语句,也可以省略。语句,也可以省略。nvoid类型的函数虽然不直接返回一个值,但它的类型的函数虽然不直

7、接返回一个值,但它的作用通常可以实现屏幕输出等功能。作用通常可以实现屏幕输出等功能。2、不返回结果的函数定义、不返回结果的函数定义6.2.1 函数的定义函数的定义【例【例6-2】编写函数实现打印五行十个星号。】编写函数实现打印五行十个星号。 【分析】【分析】n主调函数输入星号的行数及每行星号数,主调函数输入星号的行数及每行星号数,并调用打印星号函数;并调用打印星号函数;n建立建立printstar(int m,int n)函数实现打印星函数实现打印星号的功能,将星号直接屏幕输出。号的功能,将星号直接屏幕输出。 2、不返回结果的函数定义、不返回结果的函数定义#includeint main(vo

8、id) void printstar(int m,int n); int a,b; printf(请输入要打印星号的行数和每行的星号数:请输入要打印星号的行数和每行的星号数:n); scanf(%d,%d,&a,&b); printf(主调函数,下面要调用主调函数,下面要调用printstar()函数。函数。n); printstar(a,b); /* 调用调用printstar()函数函数 */ printf(返回到主调函数。返回到主调函数。n); return 0;void printstar(int m,int n) /* printstar()函数的定义,不返回结果的定

9、义函数的定义,不返回结果的定义 */ int i,j; printf(被调函数被调函数printstar(),要打印五行十个星号。,要打印五行十个星号。n); for(i=1;i=m;i+) for(j=1;j=n;j+) printf(*); printf(n);【说明】【说明】 函数定义的第一行是函数首部,后面不能加分号。函数定义的第一行是函数首部,后面不能加分号。 函数首部的类型标识符是指函数类型。如果省略函函数首部的类型标识符是指函数类型。如果省略函数的类型标识符,则默认的数据类型为数的类型标识符,则默认的数据类型为int型。型。 函数名必须是有效的标识符。函数名必须是有效的标识符。

10、形参列表中给出函数所有形参的名称和类型。各个形参列表中给出函数所有形参的名称和类型。各个形参之间用逗号分隔,每个形参前面的类型必须分形参之间用逗号分隔,每个形参前面的类型必须分别写明。别写明。 函数体写在一对大括号中,包括变量声明和语句部函数体写在一对大括号中,包括变量声明和语句部分。分。6.2.2 函数返回值和函数类型函数返回值和函数类型n从函数返回值的类型来看,有两种类型:从函数返回值的类型来看,有两种类型:有确定的运算结果返回给主调函数有确定的运算结果返回给主调函数没有确定的运算结果返回给主调函数没有确定的运算结果返回给主调函数1、函数返回值、函数返回值6.2.2 函数返回值和函数类函数

11、返回值和函数类型型n函数结果返回形式:函数结果返回形式:return 返回值表达式;返回值表达式;n上述语句也可表示成:上述语句也可表示成:return (返回值表达式返回值表达式);nreturn语句的功能有两个:一是结束子函语句的功能有两个:一是结束子函数的运行;二是先求解表达式的值,然后数的运行;二是先求解表达式的值,然后返回调用函数,并将返回调用函数,并将“返回值表达式返回值表达式”的的值带给调用函数。值带给调用函数。 1、函数返回值、函数返回值6.2.2 函数返回值和函数类型函数返回值和函数类型【例【例6-4】利用函数调用实现两个数相加。】利用函数调用实现两个数相加。【分析】【分析】

12、编写编写sum()实现加法操作,并返回两数相加实现加法操作,并返回两数相加值;值;在在main()函数中,实现两数的输入,调用加函数中,实现两数的输入,调用加法函法函数,输出结果等。数,输出结果等。1、函数返回值、函数返回值#include int sum(int x, int y); /函数原型声明函数原型声明int main( )int s;s=sum(8, 6); /调用子函数实现两个数相加调用子函数实现两个数相加 printf(sum=%dn,s);int sum(int x, int y)int z;z=x+y;return(z); /返回两数相加的结果返回两数相加的结果【说明】【说

13、明】 函数的返回值是通过函数的返回值是通过return语句获得的。语句获得的。 当不需返回函数值时,可省去当不需返回函数值时,可省去return语句;语句; return语句的后面可以是变量,也可以是表语句的后面可以是变量,也可以是表达式。达式。 在函数中如果有多个在函数中如果有多个return语句,每次调用语句,每次调用函数时,必定只执行其中一个函数时,必定只执行其中一个return语句。语句。n【例【例-5】将】将100之间所有的倍数之间所有的倍数的数相加。的数相加。 #includeint main(void) int trip(int n); int i,s; int flag; s=

14、0; for(i=3;i100;i+) flag=trip(i); if(flag=1) s=s+i; printf(1100之间所有之间所有3的倍数的数之和为:的倍数的数之和为:%d,s); return 0;int trip(int n) if(n % 3=0) return 1; else return 0; 6.2.2 函数返回值和函数类型函数返回值和函数类型n如果在顺序结构的程序中出现多个如果在顺序结构的程序中出现多个return语句,则遇到语句,则遇到第一个第一个return语句语句就会结束当前函数就会结束当前函数的运行而返回主调函的运行而返回主调函数,其它数,其它return语句

15、不再运行。语句不再运行。 1、函数返回值、函数返回值6.3 函数调用函数调用n在程序中,通过对函数的调用来执行函数在程序中,通过对函数的调用来执行函数体。体。n一个函数可以被其它函数多次调用,每次一个函数可以被其它函数多次调用,每次调用时可以处理不同的数据,因此函数是调用时可以处理不同的数据,因此函数是对不同数据进行相同处理的一般程序形式。对不同数据进行相同处理的一般程序形式。 6.3.1 函数调用的一般形式和过程函数调用的一般形式和过程n函数调用的一般形式为:函数调用的一般形式为:函数名(实参表)函数名(实参表)n或表示为:或表示为:函数名(实参,实参,实参)函数名(实参,实参,实参)n实参

16、可以是常量、变量和表达式。实参可以是常量、变量和表达式。【例【例6-6】通过函数调用实现输出之内的数】通过函数调用实现输出之内的数字金字塔,阅读程序代码理解函数调用的字金字塔,阅读程序代码理解函数调用的一般形式。一般形式。【分析】【分析】n建立函数建立函数pyramid(int n )实现打印数字金字实现打印数字金字塔的功能,因此该函数定义成塔的功能,因此该函数定义成void类型。类型。n在主函数中,通过调用在主函数中,通过调用pyramid()函数实函数实现金字塔的打印。其中括号中的是实参,现金字塔的打印。其中括号中的是实参,将实参传递到函数定义的形参中,即将的将实参传递到函数定义的形参中,

17、即将的值传递给。值传递给。 #includevoid pyramid(int n) /被调函数的定义被调函数的定义 int i,j; for(i=1;i=n;i+) for(j=1;j=n-i;j+) printf( ); for(j=1;j=i;j+) printf( %d,i); printf(n); int main(void) /主调函数主调函数 int m; printf(请输入金字塔行数的数值:请输入金字塔行数的数值:); scanf(%d,&m); pyramid(m); /调用函数调用函数pyramid( ) printf(n);return 0;6.3.1 函数调用的

18、一般形式和过程函数调用的一般形式和过程n所有的程序都是从所有的程序都是从main( )函数开始执函数开始执行,无论行,无论main( )函数的位置在哪里。函数的位置在哪里。n如果如果main( )函数执行过程中遇到某个函函数执行过程中遇到某个函数数a() 的调用,则的调用,则main( )函数被暂停执函数被暂停执行,转而执行相应的被调函数行,转而执行相应的被调函数a()。n当被调函数执行完后,将返回当被调函数执行完后,将返回main( )函函数,从原来暂停的位置继续执行数,从原来暂停的位置继续执行 3、函数调用过程、函数调用过程n【例【例6-7】引例求解。编写】引例求解。编写C语言程序实现打语

19、言程序实现打印三个正三角,第一个是三行,第二个是四印三个正三角,第一个是三行,第二个是四行,第三个五行,要求其运行结果如图所示。行,第三个五行,要求其运行结果如图所示。【分析】图中要求输出的三个正三角星号的【分析】图中要求输出的三个正三角星号的程序代码是重复的,不同之处仅仅是输出程序代码是重复的,不同之处仅仅是输出的行数不同,因此可将输出正三角作为被的行数不同,因此可将输出正三角作为被调函数的功能。而被调函数的参数可设成调函数的功能。而被调函数的参数可设成正三角形的行数。正三角形的行数。【例【例6-7】引例求解。编写】引例求解。编写C语言程序实现语言程序实现打印三个正三角,第一个是三行,第二打

20、印三个正三角,第一个是三行,第二个是四行,第三个五行,要求其运行结个是四行,第三个五行,要求其运行结果如图所示。果如图所示。#includeint main(void) void printstar(int m); /被调函数声明被调函数声明 printstar(3); printf(函数是语言程序的基本单位函数是语言程序的基本单位n); printstar(4); printf(程序设计时程序员总是将复杂程序设计时程序员总是将复杂问题分解问题分解n); printstar(5); printf(将小程序拼接起来能解决大而复杂的问题将小程序拼接起来能解决大而复杂的问题n); return 0;

21、void printstar(int m) /被调函数定义被调函数定义 int i,j,k;for(i=1;i=m;i+) for(k=1;k=10-i;k+) printf( ); for(j=1;j=2*i-1;j+) printf(*); printf(n);6.3.2 函数调用的参数传递函数调用的参数传递n在函数的定义和调用过程中会用到函数的在函数的定义和调用过程中会用到函数的参数,函数的参数有两种:形式参数和实参数,函数的参数有两种:形式参数和实际参数,分别简称为形参和实参。际参数,分别简称为形参和实参。6.3.2 函数调用的参数传递函数调用的参数传递1、形参与实参的区别、形参与实参

22、的区别n形式参数又称为形参,它用来说明某函数在被形式参数又称为形参,它用来说明某函数在被调用时,需要传给该函数调用时,需要传给该函数多少个变量多少个变量,以及,以及变变量的类型量的类型。因此。因此“形参表形参表”是一种是一种形式上形式上的定的定义,通过这些义,通过这些“符号符号”,调用函数就知道应该,调用函数就知道应该给函数传递什么样的数据。给函数传递什么样的数据。n实际参数又称为实参,它是调用函数向被调用实际参数又称为实参,它是调用函数向被调用函数提供的一些函数提供的一些具体信息具体信息(数据),可以是常(数据),可以是常量、变量或表达式,它必须有具体的值。量、变量或表达式,它必须有具体的值

23、。n主调函数对某函数调用时,必须按顺序主调函数对某函数调用时,必须按顺序将实参准确地传递给形参,被调函数通将实参准确地传递给形参,被调函数通过形参接收相应的数据,执行函数体。过形参接收相应的数据,执行函数体。 主调函数主调函数 函数名函数名(实参,实参,实参实参,实参,实参) 被调用函数被调用函数 函数名函数名(形参,形参,形参形参,形参,形参)1、形参与实参的区别、形参与实参的区别【例【例6-8】从程序中分析实参和形参的作用。】从程序中分析实参和形参的作用。#includeint max(int x, int y) ;int main(void) /主调函数主调函数 int a,b,c; s

24、canf(%d,%d,&a,&b); c=max(a,b); /调用调用max( )函数函数 printf(Max is %d,c); return 0;int max(int x, int y) /被调函数定义被调函数定义int z;x=x+8;y=y+12;z=xy?x:y;return(z);调用函数调用函数main()函数函数 c = max( a , b) 被调用函数被调用函数 int max(int x, int y)函数体函数体 int z;x=x+8;y=y+12;z=xy?x:y;return(z);【说明】【说明】 形参是单个的变量名,实参可以是常量、变形参

25、是单个的变量名,实参可以是常量、变量或表达式,如:量或表达式,如:c=max(a,b+2);无论实参是常量、变量或表达式,它们都有确定无论实参是常量、变量或表达式,它们都有确定的值,在进行函数调用时,把这些值传送给形的值,在进行函数调用时,把这些值传送给形参。因此,应预先用赋值、输入等办法使实参参。因此,应预先用赋值、输入等办法使实参获得确定的值。获得确定的值。 实参与形参之间的个数及类型必须一一对应。实参与形参之间的个数及类型必须一一对应。 形参只有被调用时,才分配内存单元,有确形参只有被调用时,才分配内存单元,有确定的值;调用结束时就释放所分配的内存单元,定的值;调用结束时就释放所分配的内

26、存单元,形参只有在被调用函数内有效。形参只有在被调用函数内有效。 在用户自定义函数中,形参必须指定数据类在用户自定义函数中,形参必须指定数据类型。形参的类型声明可以放在函数名后的括号型。形参的类型声明可以放在函数名后的括号中,如本例中中,如本例中 int max(int x, int y);也可以放在函数的头部与函数体之间。例如:也可以放在函数的头部与函数体之间。例如: int max(x, y) int x, y; 【例【例6-9】两变量数值的交换。通过该例题源程】两变量数值的交换。通过该例题源程序代码分析实参和形参之间的相互影响。序代码分析实参和形参之间的相互影响。#includeint

27、main(void) void swap(int x,int y); int a,b;printf(Please input a and b:);scanf(%d %d,&a,&b);printf(交换前和的值:交换前和的值:a=%d, b=%dn,a,b);swap(a,b); printf(交换后和的值:交换后和的值:a=%d, b=%dn,a,b); return 0;void swap(int x,int y) int temp; temp=x; x=y;y=temp;printf(在函数在函数swap()中:中:x=%d, y=%dn,x,y);【分析】【分析】n从运

28、行结果看主函数中,的值在调用从运行结果看主函数中,的值在调用swap()函数后并没有交换,而在函数后并没有交换,而在swap()函数函数中,的值交换了。中,的值交换了。n原因是实参,和形参,分别占用不同原因是实参,和形参,分别占用不同的内存单元,在的内存单元,在swap()函数中,形参和函数中,形参和的值互换了,只是在和的内存单元的值互的值互换了,只是在和的内存单元的值互换了,但对和内存单元中的值不产生影响,换了,但对和内存单元中的值不产生影响,如图如图6-11所示。当所示。当swap()函数执行结束后就函数执行结束后就释放和的内存单元,而其中和交换后释放和的内存单元,而其中和交换后的数值也随

29、之释放了。因此返回主函数的数值也随之释放了。因此返回主函数main()后输出的和的值没有交换。后输出的和的值没有交换。 551919调用前519195调用后6.3.3 函数原型说明函数原型说明n如果自定义函数被放在主调函数的后面,则需如果自定义函数被放在主调函数的后面,则需要在函数调用前,加上函数原型说明。要在函数调用前,加上函数原型说明。n在在C语言中,函数原型说明也称为语言中,函数原型说明也称为“函数声函数声明明”,利用它说明函数的类型和参数情况,在,利用它说明函数的类型和参数情况,在程序编译阶段对调用函数的合法性进行全面检程序编译阶段对调用函数的合法性进行全面检查。查。n函数原型说明的一

30、般格式:函数原型说明的一般格式:(形参列表形参列表);n函数原型说明语句最后的分号不能省略,其作函数原型说明语句最后的分号不能省略,其作用是表示该语句是进行函数声明而不是函数定用是表示该语句是进行函数声明而不是函数定义。义。 6.5 变量与函数变量与函数n变量的作用域变量的作用域: 有效作用范围。在这个范围有效作用范围。在这个范围内变量是有效的内变量是有效的, 超出这个范围,为变量分超出这个范围,为变量分配的存储空间被释放,在范围外引用变量配的存储空间被释放,在范围外引用变量是非法的,会产生错误。是非法的,会产生错误。n语言中所有的变量都有自己的作用域。语言中所有的变量都有自己的作用域。变量定

31、义的位置不同,其作用域也不同。变量定义的位置不同,其作用域也不同。 6.5.1 内部变量和外部变量内部变量和外部变量1、内部变量、内部变量n在一个函数内部定义的变量是在一个函数内部定义的变量是内部变量内部变量,它只在该函数范围内有效。它只在该函数范围内有效。 n只有在包含变量定义的函数内部才能使只有在包含变量定义的函数内部才能使用被定义的变量,在此函数之外就不能用被定义的变量,在此函数之外就不能使用这些变量了。所以内部变量也称为使用这些变量了。所以内部变量也称为“局部变量局部变量”。 void float f1(int a) int b,c; .void char f2 (int x,int

32、y) int i,j; int main(void) int m,n; .变量变量x、y、i、j的作用域的作用域变量变量m、n的作的作用域用域变量变量a、b、c的作用域的作用域6.5.1 内部变量和外部变量内部变量和外部变量n从上面程序中看到在函数内部定义的变从上面程序中看到在函数内部定义的变量只在函数内部有效。量只在函数内部有效。n而函数的形式参数也是局部变量,其它而函数的形式参数也是局部变量,其它函数不能访问它们。如函数不能访问它们。如f1( )中的形参中的形参只在只在f1中有效。中有效。 1、内部变量、内部变量【例【例6-13】分析如下程序,写出在】分析如下程序,写出在main( )函函数中调用数中调用sub( )函数前后、的值及在函数前后、的值及在sub( )函数中、的值。函数中、的值。 #includeint main(void) void sub(void);int a,b; a=3; b=4; printf(main:a=%d,b=%dn,a,b); sub(); print

温馨提示

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

评论

0/150

提交评论