C语言程序设计C语言程序设计PPT (7).pdf
《C语言程序设计C语言程序设计PPT (7).pdf》由会员分享,可在线阅读,更多相关《C语言程序设计C语言程序设计PPT (7).pdf(77页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、7 7用函数实现模块化程序设计第第章章为什么要用函数int main()功能1内容功能2内容功能1内容功能2内容功能1函数()功能1内容功能2函数()功能2内容int main()调用功能1调用功能2调用功能1调用功能2VS.使用函数可使程序清晰、精炼、简单、灵活。函数就是功能。每一个函数用来实现一个特定的功能。函数名应反映其代表的功能。在设计较大程序时,往往把它分为若干个程序模块,每一个模块包括一个或多个函数,每个函数实现一个特定的功能。一个C程序可由一个主函数和若干个其他函数构成。由主函数调用其他函数,其他函数也可以互相调用。为什么要用函数【例7.1】想输出以下的结果,用函数调用实现。#i
2、nclude int main()void print_star();/声明print_star函数void print_message();/声明print_message函数print_star();/调用print_star函数print_message();/print_message函数print_star();/调用print_star函数return 0;void print_star()/定义print_star函数printf(*n);/输出一行*号void print_message()/定义print_message函数printf(How do you do!n);/输
3、出一行文字信息print_star和print_message都是用户定义的函数名,分别用来输出一排“*”号和一行文字信息。在定义这两个函数时指定函数的类型为void,意为函数无类型,即无函数值,也就是说,执行这两个函数后不会把任何值带回main函数。在程序中,定义print_star函数和print_message函数的位置是在main函数的后面,在这种情况下,应当在main函数之前或main函数中的开头部分,对以上两个函数进行“声明”。函数声明的作用是把有关函数的信息(函数名、函数类型、函数参数的个数与类型)通知编译系统,以便在编译系统对程序进行编译时,在进行到main函数调用print_
4、star()和print_message()时知道它们是函数而不是变量或其他对象。此外,还对调用函数的正确性进行检查(如类型、函数名、参数个数、参数类型等是否正确)。为什么要用函数(1)一个C程序由一个或多个程序模块组成,每一个程序模块作为一个源程序文件。较大的程序,可分别放在若干个源文件中。这样便于分别编写和编译,提高调试效率。一个源程序文件可以为多个C程序共用。(2)一个源程序文件由一个或多个函数以及其他有关内容(如指令、数据声明与定义等)组成。一个源程序文件是一个编译单位,在程序编译时是以源程序文件为单位进行编译的,而不是以函数为单位进行编译的。(3)C程序的执行是从main函数开始的,
5、如果在main函数中调用其他函数,在调用后流程返回到main函数,在main函数中结束整个程序的运行。(4)所有函数都是平行的,即在定义函数时是分别进行的,是互相独立的。一个函数并不从属于另一个函数,即函数不能嵌套定义。函数间可以互相调用,但不能调用main函数。main函数是被操作系统调用的。(5)从用户使用的角度看,函数有两种。库函数,它是由系统提供的,用户不必自己定义,可直接使用它们。应该说明,不同的C语言编译系统提供的库函数的数量和功能会有一些不同,当然许多基本的函数是共同的。用户自己定义的函数。它是用以解决用户专门需要的函数。(6)从函数的形式看,函数分两类。无参函数。在调用无参函数
6、时,主调函数不向被调用函数传递数据。有参函数。主调函数在调用被调用函数时,通过参数向被调用函数传递数据。定义函数为什么定义函数定义函数应包括以下几个内容:(1)指定函数的名字,以便以后按名调用。(2)指定函数的类型,即函数返回值的类型。(3)指定函数的参数的名字和类型,以便在调用函数时向它们传递数据。对无参函数不需要这项。(4)指定函数应当完成什么操作,也就是函数是做什么的,即函数的功能。这是最重要的,是在函数体中解决的。C语言要求,在程序中用到的所有函数,必须“先定义,后使用”。定义函数的方法类型名 函数名()函数体函数名后面括号内的void表示“空”,即函数没有参数。函数体包括声明部分和语
7、句部分。在定义函数时要用“类型标识符”(即类型名)指定函数值的类型,即指定函数带回来的值的类型。定义无参函数类型名 函数名(void)函数体或类型名 函数名(形式参数表列)函数体定义有参函数int max(int x,int y)int z;/声明部分z=xy?x:y;/执行语句部分return(z);类型名 函数名()定义空函数函数体为空,什么也不做。调用函数函数调用的形式函数名(实参表列)print_star();/调用无参函数c=max(a,b);/调用有参函数1.函数调用语句把函数调用单独作为一个语句。如printf_star();这时不要求函数带回值,只要求函数完成一定的操作。2.函
8、数表达式函数调用出现在另一个表达式中,如c=max(a,b);这时要求函数带回一个确定的值以参加表达式的运算。3.函数参数函数调用作为另一个函数调用时的实参。如m=max(a,max(b,c);,又如:printf(%d,max(a,b);形式参数和实际参数在调用有参函数时,主调函数和被调用函数之间有数据传递关系。在定义函数时函数名后面括号中的变量名称为“形式参数”(简称“形参”)或“虚拟参数”。在主调函数中调用一个函数时,函数名后面括号中的参数称为“实际参数”(简称“实参”)。实际参数可以是常量、变量或表达式,但要求它们有确定的值。实参与形参的类型应相同或赋值兼容。赋值兼容是指实参与形参类型
9、不同时能按不同类型数值的赋值规则进行转换。实参和形参间的数据传递【例7.2】输入两个整数,要求输出其中值较大者。要求用函数来找到大数。#include int main()int max(int x,int y);/对max函数的声明int a,b,c;printf(please enter two integer numbers:);/提示输入数据scanf(%d,%d,&a,&b);/输入两个整数c=max(a,b);/调用max函数,有两个实参。大数赋给变量cprintf(max is%dn,c);/输出大数creturn 0;int max(int x,int y)/定义max函数,有
10、两个参数int z;/定义临时变量zz=xy?x:y;/把x和y中大者赋给zreturn(z);/把z作为max函数的值带回main函数定义函数,名为max,函数类型为int。指定两个形参x和y,形参的类型为int。主函数中包含了一个函数调用max(a,b)。max后面括号内的a和b是实参。a和b是在main函数中定义的变量,x和y是函数max的形式参数。通过函数调用,在两个函数之间发生数据传递,实参a和b的值传递给形参x和y,在max函数中把x和y中的大者赋给变量z,z的值作为函数值返回main函数,赋给变量c。c=max(a,b);(main函数)int max(int x,int y)(
11、max函数)int z;z=xy?x:y;return(z);在调用函数过程中发生的实参与形参间的数据传递称为“虚实结合”。函数调用的过程(1)在定义函数中指定的形参,在未出现函数调用时,它们并不占内存中的存储单元。在发生函数调用时,函数的形参才被临时分配内存单元。(2)将实参的值传递给对应形参。(3)在执行函数期间,由于形参已经有值,就可以利用形参进行有关的运算。(4)通过return语句将函数值带回到主调函数。应当注意返回值的类型与函数类型一致。如果函数不需要返回值,则不需要return语句。这时函数的类型应定义为void类型。(5)调用结束,形参单元被释放。注意:实参单元仍保留并维持原值
12、,没有改变。如果在执行一个被调用函数时,形参的值发生改变,不会改变主调函数的实参的值。因为实参与形参是两个不同的存储单元。注意实参向形参的数据传递是“值传递”,单向传递,只能由实参传给形参,而不能由形参传给实参。实参和形参在内存中占有不同的存储单元,实参无法得到形参的值。函数的返回值(1)函数的返回值是通过函数中的return语句获得的。一个函数中可以有一个以上的return语句,执行到哪一个return语句,哪一个return语句就起作用。return语句后面的括号可以不要,如“return z;”与“return(z);”等价。return后面的值可以是一个表达式。(2)函数值的类型。函数
13、值的类型在定义函数时指定。(3)在定义函数时指定的函数类型一般应该和return语句中的表达式类型一致。如果函数值的类型和return语句中表达式的值不一致,则以函数类型为准。对数值型数据,可以自动进行类型转换。即函数类型决定返回值的类型。(4)对于不带回值的函数,应当用定义函数为“void类型”(或称“空类型”)。这样,系统就保证不使函数带回任何值,即禁止在调用函数中使用被调用函数的返回值。此时在函数体中也没有return语句。通常,希望通过函数调用使主调函数能得到一个确定的值,这就是函数值(函数的返回值)。int max(float x,float y)/函数值为整型char letter
14、(char c1,char c2)/函数值为字符型double min(int x,int y)/函数值为双精度型函数的返回值【例7.3】将例7.2稍作改动,将在max函数中定义的变量z改为float型。函数返回值的类型与指定的函数类型不同,分析其处理方法。max函数的形参是float型,实参也是float型,在main函数中输入给a和b的值是1.5和2.6。在调用max(a,b)时,把a和b的值1.5和2.6传递给形参x和y。执行函数max中的条件表达式“z=xy?x:y”,使得变量z得到的值为2.6。现在出现了矛盾:函数定义为int型,而return语句中的z为float型,要把z的值作为
15、函数的返回值,二者不一致。怎样处理呢?按赋值规则处理,先将z的值转换为int型,得到2,它就是函数得到的返回值。如果将main函数中的c改为float型,用%f格式符输出,输出2.000000。因为调用max函数得到的是int型,函数值为整数2。#include int main()int max(float x,float y);float a,b;int c;scanf(%f,%f,&a,&b);c=max(a,b);printf(max is%dn,c);return 0;int max(float x,float y)float z;/z为实型变量z=xy?x:y;return(z);
16、对被调用函数的声明和函数原型在一个函数中调用另一个函数(即被调用函数)需要具备如下条件:(1)被调用的函数必须是已经定义的函数(是库函数或用户自己定义的函数)。(2)如果使用库函数,应该在本文件开头用#include指令将调用有关库函数时所需用到的信息“包含”到本文件中来。(3)如果使用用户自己定义的函数,而该函数的位置在调用它的函数(即主调函数)的后面(在同一个文件中),应该在主调函数中对被调用的函数作声明(declaration)。声明的作用是把函数名、函数参数的个数和参数类型等信息通知编译系统,以便在遇到函数调用时,编译系统能正确识别函数并检查调用是否合法。对被调用函数的声明和函数原型【
17、例7.4】输入两个实数,用一个函数求出它们之和。函数的声明和函数定义中的第1行(函数首部)基本上是相同的,只差一个分号(函数声明比函数定义中的首行多一个分号)。函数的首行(即函数首部)称为函数原型(function prototype)。因为在函数的首部包含了检查调用函数是否合法的基本信息(它包括了函数名、函数值类型、参数个数、参数类型和参数顺序),因此,在函数调用时检查函数原型是否与函数声明一致。这样就能保证函数的正确调用。#include int main()float add(float x,float y);/对add函数作声明float a,b,c;printf(Please ent
18、er a and b:);/提示输入scanf(%f,%f,&a,&b);/输入两个实数c=add(a,b);/调用add函数printf(sum is%fn,c);/输出两数之和return 0;float add(float x,float y)/定义add函数float z;z=x+y;return(z);/把变量z的值作为函数值返回对被调用函数的声明和函数原型在函数声明中的形参名可以省写,而只写形参的类型。如果已在文件的开头(在所有函数之前),已对本文件中所调用的函数进行了声明,则在各函数中不必对其所调用的函数再作声明。float add(float x,float y);float
19、add(float,float);/不写参数名,只写参数类型float add(float a,float b);/参数名不用x,y,而用a,b。合法函数类型 函数名(参数类型1 参数名1,参数类型2 参数名2,参数类型n 参数名n);函数类型 函数名(参数类型1,参数类型2,参数类型n);或注意对函数的“定义”和“声明”不是同一回事。函数的定义是指对函数功能的确立,包括指定函数名、函数值类型、形参及其类型以及函数体等,它是一个完整的、独立的函数单位。而函数的声明的作用则是把函数的名字、函数类型以及形参的类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查,它不包含函数体。ch
20、ar letter(char,char);float f(float,float);int i(float,float);/所有函数之前,且在函数外部进行函数声明int main()/在main函数中要调用letter,f和i函数,不必再对所调用的这3个函数进行声明char letter(char c1,char c2)/定义letter函数float f(float x,float y)/定义f函数int i(float j,float k)/定义i函数函数的嵌套调用 执行main函数的开头部分;遇函数调用语句,调用函数a,流程转去a函数;执行a函数的开头部分;遇函数调用语句,调用函数b,流
21、程转去函数b;执行b函数,如果再无其他嵌套的函数,则完成b函数的全部操作;返回到a函数中调用b函数的位置;继续执行a函数中尚未执行的部分,直到a函数结束;返回main函数中调用a函数的位置;继续执行main函数的剩余部分直到结束。C语言的函数定义是互相平行、独立的,也就是说,在定义函数时,一个函数内不能再定义另一个函数,即不能嵌套定义,但可以嵌套调用函数,即在调用一个函数的过程中,又调用另一个函数。main函数a函数b函数调用a函数调用b函数结 束函数的嵌套调用【例7.5】输入4个整数,找出其中最大的数。用函数的嵌套调用来处理。#include int main()int max4(int a
22、,int b,int c,int d);/对max4的函数声明int a,b,c,d,max;printf(Please enter 4 interger numbers:);/提示输入4个数scanf(%d%d%d%d,&a,&b,&c,&d);/输入4个数max=max4(a,b,c,d);/调用max4函数,得到4个数中的最大者printf(max=%d n,max);/输出4个数中的最大者return 0;int max4(int a,int b,int c,int d)/定义max4函数int max2(int a,int b);/对max2的函数声明int m;m=max2(a,b
23、);/调用max2函数,得到a和b中的大者,放在m中m=max2(m,c);/调用max2函数,得到a,b,c中的大者,放在m中m=max2(m,d);/调用max2函数,得到a,b,c,d中的大者,放在m中return(m);/把m作为函数值带回main函数int max2(int a,int b)/定义max2函数if(a=b)return a;/若ab,将a作为函数返回值elsereturn b;/若a=b?a:b);/返回条件表达式的值,即a和b中的大者m=max2(max2(max2(a,b),c),d);/把函数调用作为函数参数int max4(int a,int b,int c,
24、int d)int max2(int a,int b);/对max2的函数声明return max2(max2(max2(a,b),c),d);函数的递归调用函数的递归调用程序中不应出现无终止的递归调用,而只应出现有限次数的、有终止的递归调用,这可以用if语句来控制,只有在某一条件成立时才继续执行递归调用;否则就不再继续。在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。int f(int x)int y,z;z=f(y);/在执行f函数的过程中又要调用f函数return(2*z);f函数调用f函数直接递归f1函数f2函数调用f2函数调用f1函数间接递归函数的递归调用
25、【例7.6】有5个学生坐在一起,问第5个学生多少岁,他说比第4个学生大2岁。问第4个学生岁数,他说比第3个学生大2岁。问第3个学生,又说比第2个学生大2岁。问第2个学生,说比第1个学生大2岁。最后问第1个学生,他说是10岁。请问第5个学生多大。解题思路:age(n)=10(n=1)age(n)=age(n-1)+2(n1)age(5)age(5)=age(4)+2=18age(4)age(4)=age(3)+2=16age(3)age(3)=age(2)+2=14age(2)age(2)=age(1)+2=12age(1)=10函数的递归调用【例7.6】有5个学生坐在一起,问第5个学生多少岁,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言程序设计C语言程序设计PPT 7 语言程序设计 PPT
限制150内