第5章函数.ppt

上传人:本田雅阁 文档编号:2566817 上传时间:2019-04-09 格式:PPT 页数:38 大小:552.51KB
返回 下载 相关 举报
第5章函数.ppt_第1页
第1页 / 共38页
第5章函数.ppt_第2页
第2页 / 共38页
第5章函数.ppt_第3页
第3页 / 共38页
第5章函数.ppt_第4页
第4页 / 共38页
第5章函数.ppt_第5页
第5页 / 共38页
点击查看更多>>
资源描述

《第5章函数.ppt》由会员分享,可在线阅读,更多相关《第5章函数.ppt(38页珍藏版)》请在三一文库上搜索。

1、1,第5章 函数,输入2个正整数m和n,计算 m!n!,#include void main( ) int I,m,n; double fm,fn; scanf(“%d%d“, ,f=1; for(i=1;i=k;i=i+1) f=f*i;,求m!、n! 同做一过程,用函数做 当k=m; m!=fact(m) 当k=n; n!=fact(n),m!,n!,2,5.1.1 程序解析,#include double fact(int n); /*函数声明*/ void main( ) int m,n;scanf(“%d%d“, /* 把结果回送主函数 */ ,C程序由一个主函数或一个主函数与若干其

2、它函数构成,主函数,其它函数,计算m!+n!,用函数求解,3,5.1.2 函数定义,函数:完成一个特定工作的独立程序模块,函数分为:库函数,由C语言系统提供。如:scanf()、printf() 自定义函数,用户自己编写。如:求阶乘函数fact(),格式 型标识符 函数名(形式参数表) 说明语句 执行语句 return 表达式; ,其中 函数名自定义,按标识符规定命名 形式参数表定义该函数计算依赖的参数和参数类型 类型标识符 int、float、double 、char函数返回值的类型 说明语句用于说明语句里用到各数据变量的类型 执行部分各种计算语句 return 表达式;计算函数返回值,返回

3、函数值的函数定义,函数首部,函数体,1. 函数定义格式,4,double fact(int n) int i; double result=1; for (i=1;i=n;i+) result=result*i; return result; ,函数首部,函数体,函数名,形式参数表,函数类型,说明语句,执行语句,函数返回值,例 编写求n!的函数,5,不返回函数值的函数定义,格式 void 函数名(形式参数表) 说明语句 执行语句 return; /* 可省略 */ ,例5-2 输出数字金字塔,void pyramid(int n) int i,j; for(i=1;i=n;i+) for(j=

4、1;j=n-i;j+) printf(“ “); for(j=1;j=i;j+) printf(“%d “,i); putchar(n); ,函数返回类型,函数首部,函数体,其中 void空类型,表示函数无返回值,#include void main( ) void pyramid(int n); pyramid(5); ,6,类型标识符缺省,函数返回值为整型,#include main( ) printf(“%dn“, fact(5); fact(int n) int i,result=1; for (i=1;i=n;i+) result=result*i; return result; ,

5、注:源程序文件 .c方式适合。 源程序文件 .cpp方式不适合。,格式 函数名(形式参数表) 说明语句 执行语句 return 表达式; ,7,主函数的几种不同表示 void main() ,int main() return 0; ,main() ,8,2. 函数参数表,定义函数的自变量,函数计算的已知数据,例 编写求n!的函数。,已知 n 计算函数n! double fact(int n),n是函数的参数,称形式参数或简称形参,方式1 类型标识符 函数名(形式参数表) 函数体 ,形式参数表格式:,类型1 参数1 ,类型2 参数2,类型n 参数n,函数参数表定义方式,方式2 类型标识符 函数

6、名(形式参数名表) 形式参数类型说明 函数体 ,形式参数名表:参数1,参数2, 参数n 形式参数类型说明:类型1 参数1,参数2, 参数n;类型2 ;,9,例 对浮点数x和整数n,编写求xn 的函数。,double expon(float x,int n) double y;int i; y=1; for(i=0;in;i+) y=y*x; return y; ,double expon(x,n) float x;int n; double y;int i; y=1; for(i=0;in;i+) y=y*x; return y; ,形式参数表,形式参数名表,形参类型说明,注:源程序文件 .c

7、两种形参定义方式均可。 源程序文件 .cpp只适合第一种方式。 两种定义方式书写不要混淆。,如第一种方式定义: int x,int y,float z 不能写成 int x,y,float z,10,3. 函数返回值,函数返回值需要使用return语句实现,函数返回值 通常函数经过计算得到一个函数值 如 fact(3) 得到 6 6是函数返回值,格式 return(表达式); 或 return 表达式; 操作 一执行return,先计算表达式,然后中断函数返回函数调用处 表达式值作为函数返回值,double fact(int n) int i; double result=1; for (i=

8、1;i=n;i+) result=result*i; return result; /* 把结果回送主函数 */ ,11,注在函数体内return语句个数不限,return只能返回一个数值, 如 return x,y; 只能返回y,例5-3 定义函数even(n),当n为偶数时返回1,否则返回0,int even(int n) if(n%2=0) return 1; else return 0; ,当return(表达式)中表达式的值与函数类型不一致,强行转换成函数类型,int fact(int n) int i; double result=1; for (i=1;i=n;i+) resul

9、t=result*i; return result; ,当函数体内无return语句,函数体执 行完毕返回随机值(void函数除外),12,5.1.3 函数的调用,函数调用:使用函数,1. 函数调用的方法,函数语句 格式 函数名(实参表列);,例5-2 #include void main( ) void pyramid(int n); pyramid(5); void 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); putchar(n

10、); ,一般用于函数无返回值,13,作为表达式中的一个元素 格式 函数名(实参表列),例 计算12!,double fact(int n) int i;double result=1; for (i=1;i=n;i+) result=result*i; return result; ,void main() int i, n; double s; scanf(“%d“, ,14,2. 函数参数的传递,参数传递:形参与实参结合 形式参数指函数定义时形式参数表中的参数 实际参数指调用函数时在参数表位置上出现的参数,例 void main() int a;double t; scanf(“%lf,%

11、d“, ,虚实结合 形参与实参的个数、位置、类型一致,double expon(float x,int n) double y;int i; y=1; for(i=0;in;i+) y=y*x; return y; ,个数 形参的个数与实参的个数相同 位置 形参实参依次按排列位置相结合 类型 数据类型和参数形式相对应,形参,实参,15,形参 实参 整型 整型 实型 实型 字符 字符,类型 一致 数据类型相对应,但字符与整型互通,参数形式 形参 实参 变量 常量、变量、表达式 数组 数组、指针 指针 指针、数组,如 double expon(float x,int n) expon(3.5,a+

12、3),上面讲的形参与实参结合是语法要求,其数据是怎么结合的?,16,当形参是变量,虚实结合是单向值传递,即实参赋值于形参 如函数定义 double expon(float x,int n) 函数调用expon(t,a) 则 t=x a=n 计算expon(x,n)后 t,a值不变,例 编写交换两个变量值的函数swap(),void swap(int x,int y) int t; t=x;x=y;y=t; ,void main() int a=1,b=2; swap(a,b); printf(“a=%d,b=%dn“, ,运行结果: a=1,b=2 不能交换,形参、实参可用指针实现双向值传递,

13、void swap(int *x,int *y) int t; t=*x;*x=*y;*y=t; ,void main() int a=1,b=2; swap( ,运行结果: a=2,b=1 交换,17,3. 函数执行过程,(1)分配函数的内存单元 (2)虚实结合 (3)执行函数体 (4)函数结束或遇到return返回函数调用处 (5)收回分配函数的内存单元,例 void main() int a;double t; scanf(“%lf,%d“, ,double expon(float x,int n) double y;int i; y=1; for(i=0;in;i+) y=y*x; r

14、eturn y; ,18,4. 被调用函数的声明,使用库函数需要头文件中说明 格式 #include 或 “库文件名.h“ 如 #include “stdio.h“ #include “math.h“,使用自定义函数需要在调用函数的模块中声明被调用函数 格式 类型标识符 被调用函数名(形参说明表); 或 类型标识符 被调用函数名();,注:源程序文件 .c两种形参定义方式均可。 源程序文件 .cpp只适合第一种方式。,19,函数调用说明,函数调用说明,例,#include void main( ) double fact(int n); printf(“%fn“,fact(12)/(fact(

15、5)+fact(7); double fact(int n) int i; double result=1; for (i=1;i=n;i+) result=result*i; return result; ,#include void main( ) double fact(); printf(“%fn“,fact(12)/(fact(5)+fact(7); double fact(int n) int i; double result=1; for (i=1;i=n;i+) result=result*i; return result; ,20,定义的被调用函数出现在调用语句的模块之前,注

16、 允许缺省被调用函数说明,满足下述条件之一,#include double fact(int n) int i; double result=1; for (i=1;i=n;i+) result=result*i; return result; void main( ) printf(“%fn“,fact(12)/(fact(5)+fact(7); ,主函数,fact函数,调用函数,21,被调用的函数类型是int类型说明,注 仅源程序文件 .c可以。,#include main( ) printf(“%dn“, fact(5); int fact(int n) int i, result; r

17、esult=1; for (i=1;i=n;i+) result=result*i; return result; ,调用函数,22,主函数,fact函数,函数的外部说明,在源程序文件的开始说明被调用函数,即在函数的外部说明,调用函数,#include double fact(int n); void main( ) printf(“%fn“,fact(12)/(fact(5)+fact(7); double fact(int n) int i; double result=1; for (i=1;i=n;i+) result=result*i; return result; ,23,函数的结

18、构 形式参数表 函数返回值 函数的类型 函数的调用 函数参数的虚实结合 函数执行过程 函数被调用的说明,24,例 对浮点数x和整数n,编写求xn 的函数。,double expon(float y,int m) double z;int i; z=1; for(i=0,;im;i+) z=z*y; return z; ,#include void main() double expon(float x,int n); int n;float x;double s; scanf(“%f,%d“, ,形式参数表,函数返回值,函数的类型,函数的调用,函数被调用的说明,函数执行过程 (1)分配函数的内

19、存单元 float y,int m; double z;int i; (2)虚实结合 x-y,n-m (3)执行函数体 (4)函数返回return z; 返回函数调用处 (5)收回分配函数的内存单元 float y,int m; double z;int i;,25,5.2 使用函数编写程序,#include #include void main( ) int i,flag; double item,pi; pi=0;flag=1;i=1;item=1; while(fabs(item)=1e-5) pi=pi+item; i=i+1;flag=-flag; item=flag*1.0/(2*

20、i-1); pi=pi*4; printf(“pi=%fn“,pi); ,例5-4 按,求,要求定义和调用函数funpi(double e) 实现。e为计算精度,pi=0;flag=1;i=1;item=1; while(fabs(item)=e) pi=pi+item; i=i+1;flag=-flag; item=flag*1.0/(2*i-1); pi=pi*4;,double funpi(double e),int i,flag; double item,pi;,return pi; ,#include #include void main( ) printf(“pi=%fn“,pi)

21、; ,pi=funpi(e);,scanf(“%lf“,double e,pi;,double funpi(double e);,26,例5-5 求100之内的全部素数,1不是素数,2是素数。要求定义和调用函数prime(m)判断m是否为素数,当m为素数返回1,否则返回0,#include “stdio.h“ #include “math.h“ int prime(int m) ,void main( ) int m; for(m=1;m=100;m+) if(prime(m) printf(“%d “,m); ,int i,n; if(m=1) return 0; n=sqrt(m); fo

22、r(i=2;i=n;i+),if(m%i=0) return 0; return 1;,if(m%i=0) break; if(i=n+1) return 1; else return 0;,27,5.3 变量与函数,本节讨论变量的作用域以及与函数的关系,5.3.1 局部变量和全局变量,如程序 float f1(a) int a; int b,c; . char f2(x,y) int x,y; int i,j; . ,void main() int m,n; . ,a,b,c 有效域,x,y,i,j 有效域,m,n 有效域,1.局部变量 局部变量函数内部定义的变量,在本函数范围内有效,28,

23、注(1)在主函数中定义的变量仅在主函数内有效,(2)函数的形参是局部变量 (3)复合语句中定义的变量作用域只在复合语句内部,例5-6 void main() int a; a=1; int b=2; b=a+b; a=a+b; printf(“%d “,a); ,b有效域,(4)不同函数中可以定义相同名字的变量,但代表的是不同对象 分配不同的存储单元,29,2.全局变量 全局变量在函数外部定义的变量,其有效域为从定义变量的位置起到 本源程序文件结束。,int p=1,q=5; float f1(a) int a; int b,c;. char c1,c2; char f2(x,y) int x

24、,y; int i,j; main() int m,n; ,如源程序文件,全局变量,c1,c2 有效域,p,q 有效域,30,注(1)当全局变量与局部变量同名时,在局部变量的有效域内全局 变量不起作用。,int a=1,b=5; int max(int a,int b) int c; c=ab?a:b; return(c); main() int a=8; printf(“%dn“,max(a,b); ,例,全局变量,局部变量,局部变量 a,b 有效域,局部变量 a 有效域,全局变量 a,b有效域 减去局部变量同名的 有效域,(2)全局变量的缺省值(初值)为0,输出 8,31,注(3)利用全局

25、变量进行函数之间数据传递,例 王婆卖瓜:要求每卖一次瓜要记下个数与重量,以统计所卖出瓜的总个数与总重量。另外需要说明的是,王婆允许退瓜。,#include float all_weight; int all_number; void sale(int number,float weight) all_number+=number; all_weight+=weight; void back(int number,float weight) all_number-=number; all_weight-=weight; ,void main() char c;float wt;int num;

26、while(1) switch(c=getchar() case b:scanf(“%d“,总重量、总个数 利用全局变量传递,全局变量,32,全局变量进行函数之间数据传递运算速度快,但一般不采用,原因是 (1)函数通用性不好,移植困难 (2)程序可读性差 (3)调试程序不方便 当函数有多个返回值可使用数组或指针,void sale(int number,float weight,int *all_number,float *all_weight) *all_number+=number; *all_weight+=weight; void back(int number,float weigh

27、t, int *all_number,float *all_weight) *all_number-=number; *all_weight-=weight; ,33,5.3.2 动态存储变量和静态存储变量,变量从作用域的角度来分,分为局部变量和全局变量 从生存时间角度来分,分为静态存储变量和动态存储变量,静态存储程序运行期间分配固定存储空间的方式 动态存储程序运行期间根据需要进行动态分配存储空间的方式,静态存储还是动态存储由变量的存储类别决定,存储类别分为四种 自动的 auto 、静态的 static 、寄存器的 register 、外部的 extern 格式 存储类别关键字 类型关键字 标

28、识符1,标识符2,.; 如 auto int a,b,c;,34,1. auto存储类,函数中的局部变量,凡不加存储类说明的都表示为auto类,即auto 可以缺省。如,int f(a) int a; int b,c=3; .,int f(a) auto int a; auto int b,c=3; .,注auto类属于动态存储, 进入函数分配存储单元,退出函数系统收回存储单元,35,2. static存储类,static声明的变量属于静态存储,其用途让局部变量在退出它所在函数后仍保留存储单元,下一次进入该函数后,这些局部变量的值仍有效。称为静态局部变量。,例5-8 阅读程序,#include

29、 void fun(int k) int a=0; printf(“%d, “,a); a=a+k; void main() int k; for(k=1;k=3;k+) fun(k); ,运算,k a 输出 a+=k 1 0 0 0+11 2 0 0 0+22 3 0 0 0+33,输出 0, 0, 0,36,例5-9 阅读程序,#include void fun(int k) static int a=0; printf(“%d, “,a); a=a+k; void main() int k; for(k=1;k=3;k+) fun(k); ,运算,k a 输出 a+=k 1 0 0 0+

30、11 2 1 1 1+23 3 3 3 3+25,注:static型与auto型区别,存储单元分配: static分配固定存储空间 auto动态分配存储空间,存储单元缺省值:static为0 auto为随机值,输出 0, 1, 3,37,3. register存储类,直接使用寄存器存储数据,提高运算速度,属于动态存储,一般小型机16个寄存器允 许3个作为register变量 个人微机13个寄存器没有 多余寄存器作为register变量 当定义的register变量超过 能使用的寄存器时自动转成 auto类变量。,#include void fun(int k) register int a=0; printf(“%d, “,a); a+=k; void main() int k; for(k=1;k=3;k+) fun(k); ,例 阅读程序,输出 0, 0, 0,38,4. extern 变量,#include void main() int a; extern x; a=1; x=a; x=x+a; printf(“%dn“,x); int x;,声明x变量,在后定义,定义x是全局变量,格式 extern 类型名 变量名表;,extern只是说明变量起作用,告诉C编译器该变量后面会定义。它不分配存储单元,所对应存储单元在变量定义处分配。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1