《c语言第七章函数.ppt》由会员分享,可在线阅读,更多相关《c语言第七章函数.ppt(22页珍藏版)》请在三一办公上搜索。
1、我的程序有上百行,如何调试最方便?我想设计一个程序完成下面的计算:其中,m、n为正整数且mn 该如何设计程序最有效?,内容提要:概述 函数的定义 函数参数(变量、数组)和函数值 函数的调用函数的嵌套调用 局部变量和全局变量及变量的存储类别,第八章 函 数,8.1 概述,C程序的结构如图所示一个C程序可以分为若干个函数每个程序有且只能有一个主函数(main),其它函数都是“子函数”子函数可以互相调用,但主函数不能被调用一个C程序由一个或多个文件构成,一个源程序文件是一个编译单位,说明:C程序的执行从main函数开始,调用其它函数后仍回到main函数,程序在main函数结束时结束。所有子函数都是平
2、行的,任何子函数都不属于其它函数。从用户角度看,函数可分为:标准函数,即库函数自定义函数从函数形式看,可分为:无参数函数:如printstar()有参数函数:如printf(),例8-1#include“stdio.h”void printstar()printf(“*n”);void printmessage()printf(“Hello,world.n”);printstar();void main()printstar();printmessage();,*Hello,world.*,函数定义的一般形式:类型说明 函数名(形式参数说明)函数体形式参数说明方法:类型说明 变量名,类型说明
3、变量名1、无参数的定义形式 类型说明 函数名()函数体2、有参数的定义形式 类型说明 函数名(形式参数说明)函数体3、空函数的定义形式 类型说明 函数名(形式参数说明),#include“stdio”int max(int x,int y)int z;z=(xy)?x:y;return(z);void main()int a,b,c;scanf(“%d%d”,8.2 函数定义的一般形式,例如:int sum(int x,int y)int z;z=x+y;return(z);又如void printhello(char name)printf(“Hello,%sn”,name);,函数定义的一
4、般形式:类型说明 函数名(形式参数说明)函数体一般情况下,函数体由两部分组成:局部变量说明 语句 局部变量:函数体内定义的变量。其有效范围仅限于所在函数的内部,离开函数体则无意义。,例如:int sum(int x,int y)int z;z=x+y;return(z);又如void printhello(char name)printf(“Hello,%sn”,name);,8.3 函数参数和函数的值,一个C程序由若干个函数组成,各函数调用时经常需要传递一些数据。即调用函数把数据传递给被调用函数,经被调用函数处理后,得到一个确定的结果,在返回调用函数时,把这结果带回调用函数。,各函数间的信息
5、往来是由参数传递和返回语句实现的,一、形式参数和实际参数 函数参数:用于函数间数据的传递形式参数:定义函数时使用的参数实际参数:调用函数时使用的参数 函数max有两个形式参数x和y形参x和y只是在函数max中使用 a和b是主函数中定义的变量 main调用函数max a和b为函数max的实参,#include“stdio”int max(int x,int y)int z;z=(xy)?x:y;return(z);void main()int a,b,c;scanf(“%d%d”,59 95Max is 95,一、形式参数和实际参数 说明:1、定义函数时,必须说明形参的类型。形参只能是变量或数组
6、2、函数被调用前,形参不占用内存;函数调用结束后,形参所占用的内存也将被收回。3、实参可以是常量、变量或表达式。4、实参也形参的类型必须一致。字符型和整型可以互相匹配。5、C语言中实参对形参的数据传递是“值传递”,即单向传递。它仅由参数的对应位置确定,与名字无关。,#include“stdio”int max(int x,int y)int z;z=(xy)?x:y;return(z);void main()int a,b,c;scanf(“%d%d”,int max(int b,int a)int c;z=(ab)?a:b;return(c);,一、形式参数和实际参数例8-3 读程序,写出运
7、行结果,Sum of 1,3 is 4,一、形式参数和实际参数二、函数的返回值 1、返回函数值的方法 函数的返回值也就是函数值,是 一个确定的值。如果一个函数由返回值,就必 须使用return语句。一个函数中可以有 一个以上的 return语句,但不论执行到哪个 return都将结束函数的调用返回 主函数。return语句中的括号可以省略;return后面的值可以是一个表 达式。,#include“stdio”int max(int x,int y)int z;z=(xy)?x:y;return(z);void main()int a,b,c;scanf(“%d%d”,if(xy)return
8、 x;return y;,return(xy?x:y);,二、函数的返回值1、返回函数值的方法2、函数值的类型 函数的类型即函数值的类型。例如,函数max是int型的也就是函数值是int型的。省略了类型说明的函数是int型的。return语句中表达式的值一般应与函数类型一致。如果不一致,则需要进行类型转换。只有数值型数据可以进行自动类型转换,以函数类型为准。,#include“stdio”int max(int x,int y)int z;z=(xy)?x:y;return(z);void main()int a,b,c;scanf(“%d%d”,二、函数的返回值1、返回函数值的方法2、函数值
9、的类型3、不需要返回值的函数 如果函数中没有使用return语句,函数返回的是一个不确定的数值。(参见例8-1)如果一个函数不需要返回值(表示一个过程),可以用void做类型说明。如果一个函数被声明为void类型,就不允许再引用它的返回值(即只能用函数语句形式调用)。,例8-1#include“stdio.h”void printstar()printf(“*n”);void printmessage()printf(“Hello,world.n”);printstar();void main()printstar();printmessage();,8.4 函数的调用,一、函数调用的一般形式
10、 一般形式:函数名(实参表列)说明:如果调用无参函数,实参表列可以忽略,但括号不能省。实参的个数和形参一般相等。实参与形参的类型应一一对应,必要时使用类型转换。注意:不同系统中,实参的计算顺序不同。微机上一般是从右到左。为避免由此引起的混乱,一般应在调用函数前计算出实参的值。,#include“stdio”int max(int x,int y)int z;z=(xy)?x:y;return(z);void main()int a,b,c;scanf(“%d%d”,float max(float x,float y)float z;z=(xy)?x:y;return(z);,一、函数调用的一般
11、形式二、函数调用的方式 1、函数语句形式为:函数名(实参表列);例如:printmessage();printf(“%d”,p);说明:这种方式不要求函数带返回值,函数仅完成一定的操作。,2、函数表达式函数的返回值参与运算 例如:m=max(a,b);m=3*max(a,b);printf(“Max is%dn”,max(a,b);说明:这种调用方式不能用于void型函数。,一、函数调用的一般形式二、函数调用的方式三、函数调用的执行过程 按从右向左的顺序,计算实参中各表达式的值。按照位置,将实参的值一一对应的传给形参。执行被调用函数。当遇到return(表达式)语句时,计算表达式的值,并返回主
12、调函数。,例8-5 读程序,写出结果#include“stdio.h”float iabs(float x)return(x0?x;-x);void main()float x=-1.2,y;y=iabs(x)printf(“x=%f,iabs(x)=%fn”,x,y);,一、函数调用的一般形式二、函数调用的方式三、函数调用的执行过程四、函数的原形说明在程序中调用函数需满足以下条件:1、被调函数必须存在,且遵循“先定义后使用”的原则。2、如果被调函数的定义在主调函数之后(位置),可以先给出原形说明。原形说明的形式为:类型说明 函数名(参数类型,参数类型,);,说明:库函数的原形说明存放在头文件
13、(.h)中,通过使用include预处理命令将这些原形说明插入程序中。,8.5 函数的嵌套调用,嵌套调用是指在一个函数的函数体中又调用了其它函数。,例8-1#include“stdio.h”void printstar()printf(“*n”);void printmessage()printf(“Hello,world.n”);printstar();void main()printstar();printmessage();,例8-6 用弦截法求方程的根。x3-5x2+16x-80=0,算法分析:对于任意的f(x)=0,1、给定两个x1,x2,满足x1x2且f(x1)和f(x2)的符号相
14、反2、过f(x1)、f(x2)两点做直线(弦),交于x轴与x,其中3、求f(x);若f(x)与f(x1)同符号,则根必在(x1,x2)区间内,令x1=x;反之,根必在(x1,x)区间内,令x2=x4、重复2和3,直到|f(x)|(为一个很小的数,如10-6)为止。此时有f(x)0,例8-6 用弦截法求方程的根。x3-5x2+16x-80=0程序说明:1、函数f(x)=x3-5x2+16x-802、用函数xpoint(x1,x2)求弦截点 x的坐标3、用函数root(x1,x2)求区间(x1,x2)上的根,思考用函数编程的好处,例 编写程序求Cnm=分析:重复三次求阶乘运算,只是每次的值不同。将求阶乘的过程编写一个函数fac,以不同的参数值k来调用函数,