(中职)c语言技能教程第7章课件.ppt
(中职)c语言技能教程第7章ppt课件第第7 7章章 一劳永逸的函数一劳永逸的函数语言技能教程语言技能教程第第 七七 章章 7.1 技能技能1:认识函数认识函数7.2 技能技能2:定义函数定义函数7.3 技能技能3:了解函数的返回值了解函数的返回值7.4 技能技能4:调用函数调用函数7.5 技能技能5:认识变量的作用范围认识变量的作用范围7.1 技能技能1 【知识点】【知识点】1.主调函数与被调函数。习惯上把调用者称为主调主调函数与被调函数。习惯上把调用者称为主调函数,被调用者称为被调函数。函数,被调用者称为被调函数。2各函数在程序中的位置是任意的。各函数在程序中的位置是任意的。C程序的执程序的执行总是从行总是从main()函数开始,完成对其它函数的调用函数开始,完成对其它函数的调用后,再返回到后,再返回到main()函数,在函数,在main()函数中结束整函数中结束整个程序的运行。主可以调用其它函数,而不允许被个程序的运行。主可以调用其它函数,而不允许被其它函数调用,其它函数之间可以相互调用。其它函数调用,其它函数之间可以相互调用。3.同一个函数可以被一个或多个函数调用任意次。同一个函数可以被一个或多个函数调用任意次。7.1 技能技能1 【知识点】【知识点】4.从用户使用的角度看,函数分为两种:从用户使用的角度看,函数分为两种:(1)标准函数,即库函数。这类函数由系统提供,)标准函数,即库函数。这类函数由系统提供,用户可以直接使用;用户可以直接使用;(2)用户自定义函数。由用户按需要编写的函数;)用户自定义函数。由用户按需要编写的函数;5从是否有返回值上看,分为返回值函数和无返回从是否有返回值上看,分为返回值函数和无返回值函数。值函数。(1)有返回值函数。这类函数被调用执行完后向调有返回值函数。这类函数被调用执行完后向调用者返回一个执行结果,称为函数的返回值。如数学函用者返回一个执行结果,称为函数的返回值。如数学函数即属于此类函数。数即属于此类函数。(2)无返回值函数。此类函数用来完成某项特定)无返回值函数。此类函数用来完成某项特定的处理任务,执行完后不向调用者返回函数值。的处理任务,执行完后不向调用者返回函数值。例例例例7.1 7.1 分析自定义函数程序的执行过程。分析自定义函数程序的执行过程。分析自定义函数程序的执行过程。分析自定义函数程序的执行过程。main()main()int a,b,c;int a,b,c;scanf(%d,%d,&a,&b);scanf(%d,%d,&a,&b);c=max(a,b);c=max(a,b);printf(max=%d,c);printf(max=%d,c);int max(int x,int y)int max(int x,int y)int z;int z;if(xy)z=x;if(xy)z=x;else z=y;else z=y;return(z);return(z);7.1 7.1 技能技能1 1【典型例题】【典型例题】7.2 技能技能21 1.函数的定义一般形式如下:函数的定义一般形式如下:函数的定义一般形式如下:函数的定义一般形式如下:类型标识符类型标识符类型标识符类型标识符 函数名(形式参数表)函数名(形式参数表)函数名(形式参数表)函数名(形式参数表)函数体函数体函数体函数体 【知识点】【知识点】7.2 技能技能22 2、对函数定义形式的说明:、对函数定义形式的说明:、对函数定义形式的说明:、对函数定义形式的说明:(1 1)类型标识符)类型标识符)类型标识符)类型标识符 类型标识符说明的是函数的类型,即决定了函数返回值的类型标识符说明的是函数的类型,即决定了函数返回值的类型标识符说明的是函数的类型,即决定了函数返回值的类型标识符说明的是函数的类型,即决定了函数返回值的类型。返回值可以是任何类型。返回值可以是任何类型。返回值可以是任何类型。返回值可以是任何C C的数据类型,如的数据类型,如的数据类型,如的数据类型,如charchar、intint、floatfloat、double double 等。当是等。当是等。当是等。当是intint类型时,类型标识符类型时,类型标识符类型时,类型标识符类型时,类型标识符int int 可以省可以省可以省可以省略。不需要有返回值的函数,类型标识符可以明确为略。不需要有返回值的函数,类型标识符可以明确为略。不需要有返回值的函数,类型标识符可以明确为略。不需要有返回值的函数,类型标识符可以明确为“空空空空类型类型类型类型”,用关键字,用关键字,用关键字,用关键字voidvoid说明。说明。说明。说明。【知识点】【知识点】7.2 技能技能22 2、对函数定义形式的说明:、对函数定义形式的说明:、对函数定义形式的说明:、对函数定义形式的说明:(2 2)函数名)函数名)函数名)函数名 函数名取名要符合标识符的规则,函数名必须是唯一的,函数名取名要符合标识符的规则,函数名必须是唯一的,函数名取名要符合标识符的规则,函数名必须是唯一的,函数名取名要符合标识符的规则,函数名必须是唯一的,不能与其它函数或变量重名。函数名最好是见名知意。不能与其它函数或变量重名。函数名最好是见名知意。不能与其它函数或变量重名。函数名最好是见名知意。不能与其它函数或变量重名。函数名最好是见名知意。.函数的定义一般形式如下:函数的定义一般形式如下:函数的定义一般形式如下:函数的定义一般形式如下:类型标识符类型标识符类型标识符类型标识符 函数名(形式参数表)函数名(形式参数表)函数名(形式参数表)函数名(形式参数表)函数体函数体函数体函数体 【知识点】【知识点】7.2 技能技能2对形参的说明方法有两种:对形参的说明方法有两种:对形参的说明方法有两种:对形参的说明方法有两种:方法一:方法一:方法一:方法一:int max(int x,int y)/*int max(int x,int y)/*类型相同的形参也要分别定义其类型和名称类型相同的形参也要分别定义其类型和名称类型相同的形参也要分别定义其类型和名称类型相同的形参也要分别定义其类型和名称*/*/方法二:方法二:方法二:方法二:int max(x,y)int max(x,y)int x,y;int x,y;【知识点】【知识点】7.2 技能技能2而下面函数定义中,对形参的说明是错误的:而下面函数定义中,对形参的说明是错误的:而下面函数定义中,对形参的说明是错误的:而下面函数定义中,对形参的说明是错误的:int max(int x,y)/*int max(int x,y)/*形参形参形参形参y y没有定义类型没有定义类型没有定义类型没有定义类型*/*/【知识点】【知识点】7.2 技能技能2(4 4)函数体函数体函数体函数体 函数体是用一对花括号括起来的语句序列。函数体分为声明部分函数体是用一对花括号括起来的语句序列。函数体分为声明部分函数体是用一对花括号括起来的语句序列。函数体分为声明部分函数体是用一对花括号括起来的语句序列。函数体分为声明部分和语句部分。函数的任务就是由这些语句共同完成。在函数体中使和语句部分。函数的任务就是由这些语句共同完成。在函数体中使和语句部分。函数的任务就是由这些语句共同完成。在函数体中使和语句部分。函数的任务就是由这些语句共同完成。在函数体中使用到的形参之外的变量,都必须在函数体的声明部分进行类型说明。用到的形参之外的变量,都必须在函数体的声明部分进行类型说明。用到的形参之外的变量,都必须在函数体的声明部分进行类型说明。用到的形参之外的变量,都必须在函数体的声明部分进行类型说明。函数体中可以没有任何内容,这种函数称为空函数。这样的函数函数体中可以没有任何内容,这种函数称为空函数。这样的函数函数体中可以没有任何内容,这种函数称为空函数。这样的函数函数体中可以没有任何内容,这种函数称为空函数。这样的函数通常表示没有编写好的模块通常表示没有编写好的模块通常表示没有编写好的模块通常表示没有编写好的模块 ,以确保程序的完整,为了在最初的,以确保程序的完整,为了在最初的,以确保程序的完整,为了在最初的,以确保程序的完整,为了在最初的调试之中顺利通过语法检查。调试之中顺利通过语法检查。调试之中顺利通过语法检查。调试之中顺利通过语法检查。例如:例如:例如:例如:dummy()dummy()【知识点】【知识点】7.2 技能技能23 3函数的定义不能嵌套函数的定义不能嵌套函数的定义不能嵌套函数的定义不能嵌套 即不能在一个函数体中,定义另外一个函数。即不能在一个函数体中,定义另外一个函数。即不能在一个函数体中,定义另外一个函数。即不能在一个函数体中,定义另外一个函数。如:下面的函数定义是错误的。如:下面的函数定义是错误的。如:下面的函数定义是错误的。如:下面的函数定义是错误的。void a()void a()void b()void b()【知识点】【知识点】7.2 技能技能24 4自定义函数在程序中的位置自定义函数在程序中的位置自定义函数在程序中的位置自定义函数在程序中的位置 自定义函数可以放在自定义函数可以放在自定义函数可以放在自定义函数可以放在main()main()之前,也可放之前,也可放之前,也可放之前,也可放在在在在main()main()之后,每一个自定义函数在程序之后,每一个自定义函数在程序之后,每一个自定义函数在程序之后,每一个自定义函数在程序中的位置都是任意的。为了提高程序的可中的位置都是任意的。为了提高程序的可中的位置都是任意的。为了提高程序的可中的位置都是任意的。为了提高程序的可读性,习惯上常把自定义函数放在读性,习惯上常把自定义函数放在读性,习惯上常把自定义函数放在读性,习惯上常把自定义函数放在main()main()之后。之后。之后。之后。【知识点】【知识点】7.2 技能技能2例例例例7.2 7.2 以下正确的函数定义是以下正确的函数定义是以下正确的函数定义是以下正确的函数定义是()()A Adouble fun(int x,int y)Bdouble fun(int x,int y)Bdouble fun(int x;int y)double fun(int x;int y)C Cdouble fun(int x,int y);Ddouble fun(int x,int y);Ddouble fun(int x,y);double fun(int x,y);【典型例题】【典型例题】分析:分析:C语言要求函数的形式参数表中的形参必须逐个进行类语言要求函数的形式参数表中的形参必须逐个进行类型说明,且各参数间用逗号隔开,所以选项型说明,且各参数间用逗号隔开,所以选项B的参数分隔符不的参数分隔符不应是分号,应将分号改为逗号;函数定义时,函数名后不应加应是分号,应将分号改为逗号;函数定义时,函数名后不应加分号,所以分号,所以C和和D都错,应去掉分号;且选项都错,应去掉分号;且选项D还错在没有对还错在没有对y进行单独的类型定义。因此,答案:进行单独的类型定义。因此,答案:A正确。正确。7.2 技能技能2例例例例7.3 7.3 以下正确的函数形式是以下正确的函数形式是以下正确的函数形式是以下正确的函数形式是()()A Adouble fun(int x,int y)B.fun(int x,y)double fun(int x,int y)B.fun(int x,y)z=x+y;return z z=x+y;return z;int z;return z;int z;return z;C C fun(x,y)D.double fun(int x,int y)fun(x,y)D.double fun(int x,int y)int x,y;double z;double z;int x,y;double z;double z;z=x+y;return z;z=x+y;return z;z=x+y;return z;z=x+y;return z;【典型例题】【典型例题】分析:分析:C语言规定,语言规定,所有在函数体中使用到的形参之外的变量,都可以在函数体的开始部分进行变量的类型说明。选项选项A中在给中在给z赋值前没有定义赋值前没有定义z的类型,的类型,所以不对;选项所以不对;选项B虽对虽对z进行了定义,但进行了定义,但z没有得到具体值。同时没有得到具体值。同时B在给形参定在给形参定义时应单独对义时应单独对y进行定义;选项进行定义;选项C中对形参的说明不应放在函数体内。中对形参的说明不应放在函数体内。答案:答案:D正确。正确。7.2 技能技能2例例例例7.4 7.4 不带参数的函数定义,且无返回值。不带参数的函数定义,且无返回值。不带参数的函数定义,且无返回值。不带参数的函数定义,且无返回值。void hello()void hello()printf(hello);printf(hello);【典型例题】【典型例题】程序说明:该函数的作用是输出程序说明:该函数的作用是输出“hello”。因为不需要。因为不需要函数提供什么数据,所以定义为无参函数。同时,也没有函数提供什么数据,所以定义为无参函数。同时,也没有任何数据需要带回主调函数,即无返回值,所以函数的类任何数据需要带回主调函数,即无返回值,所以函数的类型定义为型定义为void。7.2 技能技能2例例例例7.5 7.5 编写一函数,计算两个整型数之和。编写一函数,计算两个整型数之和。编写一函数,计算两个整型数之和。编写一函数,计算两个整型数之和。【典型例题】【典型例题】函数定义如下:函数定义如下:int sum(int x,int y)int s;s=n1+n2;printf(%d,s);程序分析:程序分析:(1)定义函数从方法上和编写程序的方法类似)定义函数从方法上和编写程序的方法类似,其中不同一点就是将其中不同一点就是将解决问题所提供的必须数据(这里是两个整型数)在编写程序时作为解决问题所提供的必须数据(这里是两个整型数)在编写程序时作为变量处理的,在此作为形参。除此之外需要定义的变量,则在函数体变量处理的,在此作为形参。除此之外需要定义的变量,则在函数体的声明部分定义。的声明部分定义。(2)根据题意,函数的类型和形参的类型应为)根据题意,函数的类型和形参的类型应为int类型。在函数体的声类型。在函数体的声明部分还应定义一个整型变量,用于存储求得的两数之和。明部分还应定义一个整型变量,用于存储求得的两数之和。7.3 技能技能31.1.函数的值只能通过函数的值只能通过函数的值只能通过函数的值只能通过returnreturn语句返回主调函数。语句返回主调函数。语句返回主调函数。语句返回主调函数。returnreturn语句的一般形式为:语句的一般形式为:语句的一般形式为:语句的一般形式为:return r;return r;或或或或 return(r)return(r);其中其中其中其中r r可以是常量、变量、表达式,也可可以是常量、变量、表达式,也可可以是常量、变量、表达式,也可可以是常量、变量、表达式,也可以是函数调用。以是函数调用。以是函数调用。以是函数调用。【知识点】【知识点】7.3 技能技能32.return2.return语句的作用是计算表达式的值,返回给语句的作用是计算表达式的值,返回给语句的作用是计算表达式的值,返回给语句的作用是计算表达式的值,返回给主调函数,同时中止它所在函数的执行,使主调函数,同时中止它所在函数的执行,使主调函数,同时中止它所在函数的执行,使主调函数,同时中止它所在函数的执行,使程序返回到调用该函数的语句处继续执行。程序返回到调用该函数的语句处继续执行。程序返回到调用该函数的语句处继续执行。程序返回到调用该函数的语句处继续执行。在函数体中,如果没有返回语句,则该函数在函数体中,如果没有返回语句,则该函数在函数体中,如果没有返回语句,则该函数在函数体中,如果没有返回语句,则该函数执行到最后一个花括号时,自动返回。执行到最后一个花括号时,自动返回。执行到最后一个花括号时,自动返回。执行到最后一个花括号时,自动返回。3.3.如下的如下的如下的如下的returnreturn语句形式,表示没有返回值被返语句形式,表示没有返回值被返语句形式,表示没有返回值被返语句形式,表示没有返回值被返回到调用者。回到调用者。回到调用者。回到调用者。return;return;【知识点】【知识点】7.3 技能技能34 4如果函数的类型为如果函数的类型为如果函数的类型为如果函数的类型为voidvoid,此函数被调用时将不再有返,此函数被调用时将不再有返,此函数被调用时将不再有返,此函数被调用时将不再有返回值。通常,为了减少出错,对不要求返回值的函数回值。通常,为了减少出错,对不要求返回值的函数回值。通常,为了减少出错,对不要求返回值的函数回值。通常,为了减少出错,对不要求返回值的函数都应定义为空类型都应定义为空类型都应定义为空类型都应定义为空类型voidvoid。5 5一个没有一个没有一个没有一个没有return return 语句的函数,并不意味着没有返回值。语句的函数,并不意味着没有返回值。语句的函数,并不意味着没有返回值。语句的函数,并不意味着没有返回值。实际上任何一个类型不是实际上任何一个类型不是实际上任何一个类型不是实际上任何一个类型不是voidvoid的函数都有一个返回值,的函数都有一个返回值,的函数都有一个返回值,的函数都有一个返回值,包含包含包含包含return return 语句的函数带回一个确定的值,而没有语句的函数带回一个确定的值,而没有语句的函数带回一个确定的值,而没有语句的函数带回一个确定的值,而没有return return 语句的函数则返回一个不确定的值。这可能使语句的函数则返回一个不确定的值。这可能使语句的函数则返回一个不确定的值。这可能使语句的函数则返回一个不确定的值。这可能使程序的执行产生难以预料的后果。通常,为了减少出程序的执行产生难以预料的后果。通常,为了减少出程序的执行产生难以预料的后果。通常,为了减少出程序的执行产生难以预料的后果。通常,为了减少出错,对不要求返回值的函数都应定义为空类型。错,对不要求返回值的函数都应定义为空类型。错,对不要求返回值的函数都应定义为空类型。错,对不要求返回值的函数都应定义为空类型。【知识点】【知识点】7.3 技能技能36.6.函数值的类型和函数定义中函数的类型应保函数值的类型和函数定义中函数的类型应保函数值的类型和函数定义中函数的类型应保函数值的类型和函数定义中函数的类型应保持一致。如果两者不同,则以函数类型为准,持一致。如果两者不同,则以函数类型为准,持一致。如果两者不同,则以函数类型为准,持一致。如果两者不同,则以函数类型为准,能够进行自动转换的,则自动进行类型转换,能够进行自动转换的,则自动进行类型转换,能够进行自动转换的,则自动进行类型转换,能够进行自动转换的,则自动进行类型转换,否则会编译出错。否则会编译出错。否则会编译出错。否则会编译出错。7 7在函数中允许有多个在函数中允许有多个在函数中允许有多个在函数中允许有多个returnreturn语句,但每次调语句,但每次调语句,但每次调语句,但每次调用只能有一个被执行,因此只能返回一个函用只能有一个被执行,因此只能返回一个函用只能有一个被执行,因此只能返回一个函用只能有一个被执行,因此只能返回一个函数值。数值。数值。数值。【知识点】【知识点】7.3 技能技能3例例例例7.6 7.6 判断下面程序中判断下面程序中判断下面程序中判断下面程序中sum()sum()函数的返回值类型。函数的返回值类型。函数的返回值类型。函数的返回值类型。#include#includemain()main()float a,b;float a,b;int c;int c;scanf(%f,%f,&a,&b);scanf(%f,%f,&a,&b);c=sum(a,b);c=sum(a,b);printf(sum=%dn,c);printf(sum=%dn,c);sum(float x,float y)sum(float x,float y)float s;float s;s=x+y;s=x+y;return(s);return(s);【典型例题】【典型例题】7.3 技能技能3程序分析程序分析程序分析程序分析:sum()sum()函数定义中省略了函数类型标识函数定义中省略了函数类型标识函数定义中省略了函数类型标识函数定义中省略了函数类型标识符,因此可以判定符,因此可以判定符,因此可以判定符,因此可以判定sum()sum()的函数类型是的函数类型是的函数类型是的函数类型是intint类型,类型,类型,类型,而而而而return(s)return(s)中的变量中的变量中的变量中的变量s s是是是是float float 类型。根据类型。根据类型。根据类型。根据C C语语语语言的规定,两者不一致,以函数类型为准,言的规定,两者不一致,以函数类型为准,言的规定,两者不一致,以函数类型为准,言的规定,两者不一致,以函数类型为准,所以由所以由所以由所以由returnreturn语句返回语句返回语句返回语句返回main()main()函数带回的值应函数带回的值应函数带回的值应函数带回的值应是是是是intint型型型型 。【典型例题】【典型例题】7.4技能技能47.4.1 函数调用的一般形式函数调用的一般形式7.4.2函数调用的方式函数调用的方式7.4.3函数的嵌套调用和递归调用函数的嵌套调用和递归调用7.4 技能技能41 1根据函数定义时,有无形参,在函数调用是根据函数定义时,有无形参,在函数调用是根据函数定义时,有无形参,在函数调用是根据函数定义时,有无形参,在函数调用是时分为两种形式:时分为两种形式:时分为两种形式:时分为两种形式:函数名函数名函数名函数名(实参表实参表实参表实参表)或:或:或:或:函数名函数名函数名函数名()()2 2如果被调函数的定义在主调函数之后,调用如果被调函数的定义在主调函数之后,调用如果被调函数的定义在主调函数之后,调用如果被调函数的定义在主调函数之后,调用前在主调函数加上对被调函数的声明。声明前在主调函数加上对被调函数的声明。声明前在主调函数加上对被调函数的声明。声明前在主调函数加上对被调函数的声明。声明方式:方式:方式:方式:类型标识符类型标识符类型标识符类型标识符 函数名(形式参数表)函数名(形式参数表)函数名(形式参数表)函数名(形式参数表);【知识点】【知识点】7.4.1函数调用的一般形式函数调用的一般形式7.4 技能技能4(4)(4)形参变量只有在被调用时才分配单元,这些单元形参变量只有在被调用时才分配单元,这些单元形参变量只有在被调用时才分配单元,这些单元形参变量只有在被调用时才分配单元,这些单元与实参所占的单元不同,在函数调用结束时,形参变与实参所占的单元不同,在函数调用结束时,形参变与实参所占的单元不同,在函数调用结束时,形参变与实参所占的单元不同,在函数调用结束时,形参变量所占的内存单元立即被释放,所以,形参只有在函量所占的内存单元立即被释放,所以,形参只有在函量所占的内存单元立即被释放,所以,形参只有在函量所占的内存单元立即被释放,所以,形参只有在函数内部有效,调用结束返回到主调函数后就不能在使数内部有效,调用结束返回到主调函数后就不能在使数内部有效,调用结束返回到主调函数后就不能在使数内部有效,调用结束返回到主调函数后就不能在使用该形参变量了。用该形参变量了。用该形参变量了。用该形参变量了。(5)(5)形参与实参的关系:二者在数量、类型、顺序上形参与实参的关系:二者在数量、类型、顺序上形参与实参的关系:二者在数量、类型、顺序上形参与实参的关系:二者在数量、类型、顺序上应该严格一致,否则会发生类型不一致的错误;形参应该严格一致,否则会发生类型不一致的错误;形参应该严格一致,否则会发生类型不一致的错误;形参应该严格一致,否则会发生类型不一致的错误;形参只能是变量,而实参可以是变量、常量或表达式,但只能是变量,而实参可以是变量、常量或表达式,但只能是变量,而实参可以是变量、常量或表达式,但只能是变量,而实参可以是变量、常量或表达式,但它们必须有确定的值。它们必须有确定的值。它们必须有确定的值。它们必须有确定的值。【知识点】【知识点】7.4.1函数调用的一般形式函数调用的一般形式7.4 技能技能4例例例例7.7 7.7 参数的传递。参数的传递。参数的传递。参数的传递。#include#includemain()main()float a,b;float a,b;float swap(float x,float y);float swap(float x,float y);/*/*函数声明函数声明函数声明函数声明*/*/a=10;b=20;a=10;b=20;swap(a,b);/*swap(a,b);/*调用函数调用函数调用函数调用函数*/*/printf(printf(调用后调用后调用后调用后:a=%.2f,b=%.2f:a=%.2f,b=%.2f n,a,b);n,a,b);【典型例题】【典型例题】7.4.1函数调用的一般形式函数调用的一般形式float swap(float x,float y)float temp;printf(x=%.2f,y=%.2f n,x,y);temp=x;x=y;y=temp;/*交换交换x和和y的值的值*/printf(x=%.2f,y=%.2fn,x,y);7.4 技能技能4例例例例7.7 7.7 参数的传递。参数的传递。参数的传递。参数的传递。运行结果:运行结果:运行结果:运行结果:x=10.00,y=20.00;x=10.00,y=20.00;x=20.00,y=10.00 x=20.00,y=10.00调用后调用后调用后调用后:a=10.00,b=20.00:a=10.00,b=20.00【典型例题】【典型例题】7.4.1函数调用的一般形式函数调用的一般形式分析:虽然分析:虽然swap()的作用是交换两的作用是交换两个变量,但调用该函数后,实参个变量,但调用该函数后,实参a,b的值并没有交换,交换的是形参的值并没有交换,交换的是形参x,y的值。参数传递情况如图的值。参数传递情况如图7-1所示。所示。实实参参形形参参a10.00b20.00 x20.00y10.00图图7-1 7-1 参数传递示意图参数传递示意图7.4 技能技能4 由图可见,形参变量和实参变量分别占用不同的存由图可见,形参变量和实参变量分别占用不同的存由图可见,形参变量和实参变量分别占用不同的存由图可见,形参变量和实参变量分别占用不同的存储单元,因此,无论形参的值如何变化,都不会影响储单元,因此,无论形参的值如何变化,都不会影响储单元,因此,无论形参的值如何变化,都不会影响储单元,因此,无论形参的值如何变化,都不会影响实参的值。实参的值。实参的值。实参的值。main()main()中的中的中的中的float swap(int x,int y);float swap(int x,int y);是是是是swap()swap()的函数的函数的函数的函数声明。意在告诉编译系统,本函数中将要调用的声明。意在告诉编译系统,本函数中将要调用的声明。意在告诉编译系统,本函数中将要调用的声明。意在告诉编译系统,本函数中将要调用的swap(swap()的函数名称、函数类型、形参的个数、类型和顺序,的函数名称、函数类型、形参的个数、类型和顺序,的函数名称、函数类型、形参的个数、类型和顺序,的函数名称、函数类型、形参的个数、类型和顺序,以便调用时进行对照检查。以便调用时进行对照检查。以便调用时进行对照检查。以便调用时进行对照检查。【典型例题】【典型例题】7.4.1函数调用的一般形式函数调用的一般形式7.4 技能技能4例例例例7.8 7.8 分析下面程序的运行结果。分析下面程序的运行结果。分析下面程序的运行结果。分析下面程序的运行结果。#include#include#define N 10#define N 10int func(int b)int func(int b)int s=0,i;int s=0,i;for(i=0;iN;i+)for(i=0;iN;i+)s=s+bi;s=s+bi;return(s);return(s);main()main()int a=1,2,3,4,5,6,7,8,9,10,s;int a=1,2,3,4,5,6,7,8,9,10,s;s=func(a);s=func(a);printf(s=%dn,s);printf(s=%dn,s);【典型例题】【典型例题】7.4.1函数调用的一般形式函数调用的一般形式7.4 技能技能4运行结果如下运行结果如下运行结果如下运行结果如下:s=55:s=55 分析:分析:分析:分析:向函数传递数组时,不能把整个数组作向函数传递数组时,不能把整个数组作向函数传递数组时,不能把整个数组作向函数传递数组时,不能把整个数组作为一个参数复制到被调函数的另一个数组中。为一个参数复制到被调函数的另一个数组中。为一个参数复制到被调函数的另一个数组中。为一个参数复制到被调函数的另一个数组中。此时可以采用地址传送方式把数组的存储地址此时可以采用地址传送方式把数组的存储地址此时可以采用地址传送方式把数组的存储地址此时可以采用地址传送方式把数组的存储地址作为实参来调用函数。作为实参来调用函数。作为实参来调用函数。作为实参来调用函数。在在在在main()main()函数中调用函数中调用函数中调用函数中调用func()func()函数时,将函数时,将函数时,将函数时,将a a(数组首地址)的值赋给(数组首地址)的值赋给(数组首地址)的值赋给(数组首地址)的值赋给b b,即,即,即,即b b和和和和a a同享存储同享存储同享存储同享存储 区域。区域。区域。区域。【典型例题】【典型例题】7.4.1函数调用的一般形式函数调用的一般形式7.4 技能技能4根据函数在程序中使用的形式可分为以下三种调用方式根据函数在程序中使用的形式可分为以下三种调用方式根据函数在程序中使用的形式可分为以下三种调用方式根据函数在程序中使用的形式可分为以下三种调用方式:1 1函数语句函数语句函数语句函数语句把函数调用作为一个语句。如:把函数调用作为一个语句。如:把函数调用作为一个语句。如:把函数调用作为一个语句。如:pstar(n);pstar(n);或:或:或:或:printf(hello);printf(hello);这时不要求函数带回值,只要求函数完成一定的操作。这时不要求函数带回值,只要求函数完成一定的操作。这时不要求函数带回值,只要求函数完成一定的操作。这时不要求函数带回值,只要求函数完成一定的操作。【知识点】【知识点】7.4.2函数调用的方式函数调用的方式7.4 技能技能42 2函数表达式函数表达式函数表达式函数表达式 函数出现在一个表达式中,这种表达式称为函数表达式。函数出现在一个表达式中,这种表达式称为函数表达式。函数出现在一个表达式中,这种表达式称为函数表达式。函数出现在一个表达式中,这种表达式称为函数表达式。如:如:如:如:x=max(a,b)+10;x=max(a,b)+10;x x的值等于的值等于的值等于的值等于max()max()带回的一个确定的值与带回的一个确定的值与带回的一个确定的值与带回的一个确定的值与1010的和。的和。的和。的和。又如:又如:又如:又如:y=2*sin(3.14*30/180);y=2*sin(3.14*30/180);sin()sin()函数带回函数带回函数带回函数带回3030度的正弦值参加表达式的运算。度的正弦值参加表达式的运算。度的正弦值参加表达式的运算。度的正弦值参加表达式的运算。【知识点】【知识点】7.4.2函数调用的方式函数调用的方式7.4 技能技能4 3 3函数参数函数参数函数参数函数参数 函数调用作为一个函数的实参。如:函数调用作为一个函数的实参。如:函数调用作为一个函数的实参。如:函数调用作为一个函数的实参。如:m=max(z,max(x,y);m=max(z,max(x,y);其中其中其中其中max(x,y)max(x,y)是第一次函数调用,它的返回值作为是第一次函数调用,它的返回值作为是第一次函数调用,它的返回值作为是第一次函数调用,它的返回值作为max(max()第二次调用的实参。如果第二次调用的实参。如果第二次调用的实参。如果第二次调用的实参。如果max()max()的作用是求两个数当的作用是求两个数当的作用是求两个数当的作用是求两个数当中的较大者,则中的较大者,则中的较大者,则中的较大者,则mm的值是的值是的值是的值是x x、y y、z z三个数当中的最大数。三个数当中的最大数。三个数当中的最大数。三个数当中的最大数。又如:又如:又如:又如:printf(%f,sin(3.14*30/180);printf(%f,sin(3.14*30/180);【知识点】【知识点】7.4.2函数调用的方式函数调用的方式7.4 技能技能4例例例例7.9 7.9 利用函数求利用函数求利用函数求利用函数求n!n!。main()main()int n;int n;long t;long t;long f();/*f()long f();/*f()函数的声明函数的声明函数的声明函数的声明*/*/printf(printf(输入一个整数:输入一个整数:输入一个整数:输入一个整数:););scanf(%d,&n);scanf(%d,&n);t=f(n);t=f(n);printf(%d!=%ld,n,t);printf(%d!=%ld,n,t);【典型例题】【典型例题】7.4.2函数调用的方式函数调用的方式long f(num)/*f()函数函数 的定义的定义*/int num;long x;int i;x=1;for(i=1;i=num;i+)x*=i;return x;7.4 技能技能4例例例例7.97.9程序分析:程序分析:程序分析:程序分析:(1)(1)定义一个函数定义一个函数定义一个函数定义一个函数f()f()求求求求n!n!。根据。根据。根据。根据 n!n!的计算特点,定义实参的计算特点,定义实参的计算特点,定义实参的计算特点,定义实参为为为为int int 型,函数的类型为型,函数的类型为型,函数的类型为型,函数的类型为longlong型,在函数体中,用型,在函数体中,用型,在函数体中,用型,在函数体中,用for for 循循循循环求环求环求环求n!n!。(2)(2)在在在在main()main()中通过函数的表达式调用中通过函数的表达式调用中通过函数的表达式调用中通过函数的表达式调用t=f(n)t=f(n)求求求求n!n!。(3)(3)通过调用将要求阶层的某数作为实参传给形参,通过通过调用将要求阶层的某数作为实参传给形参,通过通过调用将要求阶层的某数作为实参传给形参,通过通过调用将要求阶层的某数作为实参传给形参,通过returnreturn()()语句将返回值(即求得的阶乘)带回主调函数语句将返回值(即求得的阶乘)带回主调函数语句将返回值(即求得的阶乘)带回主调函数语句将返回值(即求得的阶乘)带回主调函数main(main()赋给的变量赋给的变量赋给的变量赋给的变量t t,并输出。,并输出。,并输出。,并输出。(4 4)主函数中的)主函数中的)主函数中的)主函数中的long f()long f()是函数声明。因为是函数声明。因为是函数声明。因为是函数声明。因为long()long()的函数的函数的函数的函数类型不是整型,所以这个声明必不可少。类型不是整型,所以这个声明必不可少。类型不是整型,所以这个声明必不可少。类型不是整型,所以这个声明必不可少。【典型例题】【典型例题】7.4.2函数调用的方式函数调用的方式7.4 技能技能4例例例例7.97.9运行结果:运行结果:运行结果:运行结果:输入一个整数:输入一个整数:输入一个整数:输入一个整数:8