收藏 分销(赏)

C语言之函数省名师优质课赛课获奖课件市赛课一等奖课件.ppt

上传人:快乐****生活 文档编号:5995221 上传时间:2024-11-25 格式:PPT 页数:101 大小:571.54KB
下载 相关 举报
C语言之函数省名师优质课赛课获奖课件市赛课一等奖课件.ppt_第1页
第1页 / 共101页
C语言之函数省名师优质课赛课获奖课件市赛课一等奖课件.ppt_第2页
第2页 / 共101页
C语言之函数省名师优质课赛课获奖课件市赛课一等奖课件.ppt_第3页
第3页 / 共101页
C语言之函数省名师优质课赛课获奖课件市赛课一等奖课件.ppt_第4页
第4页 / 共101页
C语言之函数省名师优质课赛课获奖课件市赛课一等奖课件.ppt_第5页
第5页 / 共101页
点击查看更多>>
资源描述

1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,本资料仅供参考,不能作为科学依据。谢谢。本资料仅供参考,不能作为科学依据。谢谢您,C语言程序设计,主讲:物理与电子信息工程系,第1页,第,8,章 函数,8.1,概述,一个,C,程序,由一个主函数和若干其它函数组成,它们之间关系是:,主函数能够调用其它函数,其它函数可相互调用。,函数:完成特定功效程序段,通常由用户定义,或系统定义各函数可存放在一个文件中,也能够存放在不一样文件中。,第2页,某程序整体结构,,main,a,b,c,d,e,f,g,h,h,i,e,g,程序运行轨迹:,main,a,d,a,e,a

2、,main,b,f,e,f,b,g,b,h,b,main,c,h,g,h,c,i,c,main,第3页,举例:,用常规、工程和文件包含三种方法打印字符串,一、常规方法:,各函数包含在一个文件中,例,T8-1.c,main(),p1();,p2();,p1();,p1(),printf(“*n”);,p2(),printf(“_ _ _ _ _How_do_you_do!n”);,运行结果:,*,_ _ _ _ _How_do_you_do!_ _ _,*,第4页,二、工程方法,例:某程序由四个文件组成,其中,一个文件包含主函数,两个文件包含两个被调用函数。,一个为工程文件,包含这个程序三个文件

3、名。,操作:,Alt+p,Project name :T8-1-4.prj,Alt+R,结果同上,T8-1-1.c,main(),p1();p2();p3();,T8-1-2.c,p1(),printf(“*n”);,T8-1-3.c,p2(),printf(“_ _ _ _ How_do_you_do!n”);,T8-1-4.prj,T8-1-1,T8-1-2,T8-1-3,第5页,三、文件包含方法,在主函数中使用文件包含预编译命令,将不在本文件而在其它文件中函数进行预编译处理把各文件中函数包含到本文件中来,然后一起进行编译、连接、运行。,T8-1-5.c,#include“T8-1-2.c

4、”,#include“T8-1-3.c”,main(),p1();p2();p1();,运行结果同上,第6页,说明:,(,1,)编译单位是文件而不是函数;,(,2,)一个完整程序可由若干个文件组成,可用工程或文件包含方法对其编译;,(,3,),C,执行总是从,main,函数开始执行,调用其它函数后又返回到,main,函数;,(,4,)函数定义是独立、平等,不能嵌套定义但可相互调用;,第7页,5,)函数类型,:,标准库函数,由系统提供,用户直接使用,用户定义函数,(,6),函数形式,:,无参函数 主调函数无数据传送给被调函数,可带或不带返回值,.,有参函数,主调函数与被调函数间有参数传递,主调函

5、数可将实参传送给被调函数形参,被调函数数据可返回主调函数。,第8页,8.2,函数定义普通形式,1.,无参函数定义形式:,类型标识符 函数名(),申明部分,语句,注:,无参函数普通不返回函数值,故类型标识符可省。,2.,有参函数定义形式:,类型标识符 函数名(形式参数表列),申明部分,语句,第9页,其中:,类型标识符:,指出函数返回值数据类型(,int,float,char,等,),函数名:正当标识符;,形参表列:,接收主调函数传递过来实参,其中包含对形参类型申明(老版本中形参类型深入申明放在下一行)。,形参类型:,与实参类型要一致。,:函数体,包含,申明部分:定义局部变量数据类型;,语句部分:

6、完成函数功效若干执行语句,第10页,例:,int max(int x,int y),int z;,z=xy?x:y ;return(z);,第11页,3.,空函数定义形式,类型说明符 函数名(),例:,dummi(),空函数不作任何操作,不过正当,,它对调试程序或以后在此处补充完整函数体是 有作用。,第12页,4.,对形参申明传统方式,传统方式中,形参类型说明在函数定义第,2,行,如:传统形参申明形式,int max(x,y),int x,y;,int z;,z=xy?x:y;,return(z);,新版本形参申明形式,int max(int x,int y),int z;,z=xy?x:y;

7、,return(z);,以上两种定义形式在,Turbo C,中都认可,第13页,8.3,函数参数和函数值,8.3.1,形式参数和实际参数,实际参数,:主调函数中提供数据。,能够是常量、变量、表示式等,是详细数值。,形式参数:,被调函数中用以接收主调函数数据变量。,被调用函数名后面括号内若干变量名。,第14页,例,T8-2.c,调用函数时数据传递,main(),int a,b,c;,scanf(%d%d”,c=max(a,b);,printf(“Max is%d n”,c);,max(int x,int y),int z;,z=xy?x:y;,return(z);,输入:,-100 200,Ma

8、x is 200,第15页,关于形、实参说明,:,1.,形参只有在函数调用时才分配存放单元,调用结束后,释放所分配单元;,2.,实参能够是常量、变量、表示式,总之要有确定值,当函数调用时,将实参值传递给形参,若是数组名,则传送是数组首地址。,3.,被调函数中,形参类型必须指定,方便分配存放单元。,第16页,4.,实参、形参数据类型一致,赋值要兼容,次序要一致。,5.,若被调函数类型为非整形,要在主调函数中对被调函数作原形申明或在主调函数之前定义。,6.,实参对形参数据传送是值传送,也是单向传送,当被调函数形参发生改变时,并不改变主调函数实参值。,第17页,例,T8-2-1.c,形、实参占据是不

9、一样存放单元,main(),int a=2,b=3;,printf(“a=%d,b=%d n”,a,b);,printf(“,add(a,b);,printf(“a=%d,b=%dn”,a,b);,printf(“,add(int x,int y),x=x+8;y=y+12;,printf(“x=%d,y=%d n”,x,y);,printf(“,2,+8=10,3,+12=15,2,3,ffd2,ffd4,ffd6,ffd8,x,a,y,b,运行结果:,a=2,b=3,&a=ffd6,&b=ffd8,x=10,y=15,&x=ffd2,&y=ffd4,a=2,b=3,&a=ffd6,&b=f

10、fd8,第18页,8.3.2,函数返回值,调用一个函数普通都希望返回一个确定值。,相关函数值几点说明:,1.,若需要返回值则用,return,语句;,2.,被调函数中可用多个,return,语句,执行哪一个由程序执行情况来定。,例:函数中有以下语句,if(ab)return(a);,else return(b);,3.,return,后面括号可省,如:,return a;,第19页,4.return,后值能够是一个表示式,,如:,return(x y?x:y);,5.,函数值类型是在定义函数时指定,如:,int max(x,y),float min(a,b),double abc(d1,d2)

11、,注意:,(1),函数定义时,函数名括号后无“;”;,(2),未加类型说明函数自动按整型处理;,(3),定义函数时,函数值类型普通与,return,后面表示式类,类型一致,若不一致,则以函数值为准。,第20页,例,T8-3.c,函数值类型为整型,而返回值类型是实型,最终以整型值返回。,main(),int max(float,float);,float a,b;int c;,scanf(“%f%f”,c=max(a,b);,printf(“max is%d n”,c);,max(float x,float y),float z;z=xy?x:y;,return(z);,输入:,1.5 2.5,

12、输出:,max is 2,第21页,6.,函数中无,return,语句时,可能返回一个不确定或无用值,例,T8-3-1.c,main(),int a,b,c;a=p1();,b=p2();c=p1();,printf(“a=%d,b=%d,c=%d n”,a,b,c);,p1()printf(“*n”);,p2()printf(“I am happy!n”);,运行结果:,*,I am happy!,*,a=6,b=12,c=6,第22页,7.,为明确表示不带返回值,可用,void,(无值,空类型)定义函数。,例,T8-3-2.c,main(),int a,b,c;,a=p1();,b=p2(

13、);,c=p1();,printf(“a=%d,b=%d,c=%d n”,a,b,c);,void p1(),printf(“*n”);,void p2(),printf(“I am happy!n”);,编译时指出:,Type mismatch in redeclartion of p1,p2,意即:在定义函数,p1,p2,时类型不匹配,第23页,8.4,函数调用,主调函数:主动去调用其它函数,被调函数:被其它函数所调用,8.4.1,函数调用普通形式,函数名(实参表列),操作:,把控制和实参传送给被调函数,当无参时,实参表列为空,但()不能省。,函数名:,确定已存在被调用函数;,实参表列:,

14、有确定值数据,当有多个实参时,实参间用“,”分隔,形实参个数要相等,类型要一致,实参求值次序在,Turbo C,中是从右向左。,第24页,例,T8-4.c,实参求值次序从右向左,main(),int i=2,p;,p=f(i,+i);,printf(“p=%d,i=%d n”,p,i);,int f(int a,int b),int c;,if(ab)c=1;,else if(a=b)c=0;,else c=-1;,return(c);,运行结果:,p=0,i=3,若将参数改为,f(i,i+),则结果为:,p=1,i=3,第25页,8.4.2,函数调用方法,1.,函数语句:以独立语句去调用函数

15、;如:,f1();,2.,函数表示式:函数调用出现在表示式中,要求函数返回一个确定值,以参加表示式运算,,,如:,c=max(a+b)+min(c,d);,3.,函数参数:函数调用作为另一个函数参数,如:,m=max(a,max(b,c);,第26页,8.4.3,对被调用函数申明和函数原型,被调用函数应具备条件,1.,被调函数必须存在(标准或用户定义),,如不在同一文件中,可用工程或文件包含方法将各被调用函数连接起来。,2.,若使用库函数,应在文件开头用,#include,命令,将调用库函数时用到宏定义信息包含到本文件中来。,如:,#include “stdio.h”,#include “ma

16、th.h”,3.,若主调和被调函数在同一文件中,,普通应在主调函数中对被调函数类型作申明,形式:,类型标识符 被调用函数名(类型 形参,.,);,第27页,例,T8-5.c,在主调函数中,对被调函数数据类型进行说明,main(),float add(float x,float y);/*,申明:函数类型、名,形参类型、,*/,float a,b,c;/*,个数,通知编译系统,*/,scanf(%f%f”,c=add(a,b);,printf(“sum is%f n”,c);,float add(float x,float y),/*,定义:功效确实定,完整独立单位,*/,float z;,z=

17、x+y;return(z);,输入:,3.6 6.5,输出:,sum is 10.10000,第28页,问题:,(,1,)若不对函数类型进行申明,则指出:在重定义函数,add,时,类型不匹配;,(,2,)在申明时指出类型,若定义时没有指出类型,,编译指出:定义,add,时类型不匹配(此处是实型)。,函数申明(原型):与函数首部一致。,相关函数定义、申明、返回值等概念,1.,函数定义:,对函数功效确实定,指定函数名、函数值类型、形参及类型、函数体等,它是完整、独立函数单位。,第29页,2.,函数申明:,也称函数原型,作用是把函数名字、函数类型以及形参类型、个数和次序通知编译系统,方便调用函数时进

18、行对照检验。,函数申明(原型)形式:,(1),函数类型 函数名,(,参数类型,1,参数类型,2.),(2),函数类型 函数名,(,参数类型,1,参数名,1,参数类型,2,参数名,2.),3.,当函数返回值为整型或字符型时,可无须申明。,4.,被调用函数在主调函数之前定义时,在主调函数中可无须申明。,第30页,例,T8-5-1.c,被调函数出现在主调函数之前,则在主调函数中无须申明,float add(float x,float y),float z;z=x+y;return(z);,main(),float a,b,c;,scanf(“%f%f”,c=add(a,b);,printf(“%f

19、n”,c);,输入:,3.6 6.5,输出:,sum is 10.100000,第31页,主调函数中没对被调函数返回值进行类型申明,原因是:,编译系统已经预知定义函数类型,并进行自动处理。,5.,假如在全部函数定义之前,在文件开头,在函数外部对函数类型作了申明,则在各主调函数中无须对所调用函数再作类型申明。,例,T8-5-2.c,在文件开头,在全部函数外部对函数作类型说明 例子,。,Char a1(char x1,char x2 );,float a2(float y1,float y2 );,int a3(int m);,double a4(double n1,double n2);,第32

20、页,main(),char c1=d,c2=a;int i=5;float f1=3.67,f2=5.56;,double d1=11111111.111,d2=22222222.222;,printf(“a1()=%c n”,a1(c1,c2);printf(“a2()=%f n”,a2(f1,f2);,printf(“a3()=%d n”,a3(i);printf(“a4()=%lf n”,a4(d1,d2);,char a1(char x1,char x2),return(x1x2?x1:x2);,float a2(float y1,float y2),float z;z=y1+y2;r

21、eturn(z);,int a3(int m),int i,s=1;for(i=1;i 0)y1=y;x1=x;,else x2=x;,while(fabs(y)=0.0001);,return(x);,main(),float x1,x2,f1,f2,x;,do printf(“input x1,x2:n”);,scanf(“%f%f”,while(f1*f2=0);,x=root(x1,x2);printf(“A root of equation is%8.4f n”,x);,运行:,input x1,x2:,2,6,A root of equation is 5.0000,第38页,8.

22、6,函数递归调用,递归:,在函数调用过程中,直接或间接调用本身。,1.,直接递归:在函数体内又调用本身,f1(),调用,f1(),第39页,2.,间接递归,:,当函数去调用另一函数时,而另一函数反过来又调用本身。,处理无终止递归调用方法是:确定好结束递归条件。,f1(),函数,f2(),函数,调用,f2(),函数 调用,f1(),函数,条件成立,进行递归,用,if,语句控制,条件不成立:结束递归,第40页,例,T8-7.c,有,5,个人在一起问年纪,第,5,个人比第,4,个人大,2,岁,第,4,个人比第,3,个人大,2,岁,.,第,2,个人比第,1,个人大,2,岁,第,1,个人为,10,岁。,

23、age(5)age(4)age(3)age(2)age(1),=2+age(4)=2+age(3)=2+age(2)=2+age(1)=10,=18 =16 =14 =12,10 n=1,用式子表示:,age(n)=,age(n-1)+2 n1,第41页,T8-7.c,问年纪程序,age(int n),int c;,if(n=1)c=10;,else c=2+age(n-1);,return(c);,main(),printf(“%d n”,age(5);,运行结果:,18,第42页,第43页,有些问题,能够用递推,也能够用递归方法处理,递推,:,从一个已知事实出发,按一定规律推出下一个事实,

24、再从已知新事实,推出下一个新事实,.,例,T8-7-1.c,用递推法求,n!,即从,1,开始,乘,2,乘,3.,一直到,n,main(),int i,s=1;,for(i=1;i1),第45页,例,T8-8.c,用递归法求,n!,float fac(int n),float f;,if(n 0)printf(“n bi,多于,bi ai,次数,,则认为,a b,不然认为,a=b,或,a b,9,1,3,5,7,2,3,4,6,8,a0,a1,a2,a3,a4,b0,b1,b2,b3,b4,第54页,main(),int a5,b5,i,n=0,m=0,k=0;,printf(“enter ar

25、ray a:n”);,for(i=0;i5;i+),scanf(“%d”,printf(“enter array b:n”);,for(i=0;i5;i+),scanf(“%d”,printf(“n”);,运行:,enter array a:,1 3 5 7 9,enter array b:,2 3 4 6 8,第55页,for(i=0;ibi%d time n”,n);,printf(“ai=bi%d time n”,m);,printf(“aik)printf(“array a is large than array b n”);,else if(n bi 3 time,ai=bi 1 t

26、ime,ai y)flag=1;,else if(x bi large,0 a0=,1,b0=,2,k=1,调,2,次,1 a1=,3,b1=,3,m=1,调,2,次,2 a2=,5,b2=,4,n=1,调,1,次,3 a3=,7,b3=,6,n=2,调,1,次,4 a4=,9,b4=,8,n=3,调,1,次,第56页,2,、数组作为函数实参,此时,传送是数组地址,调用函数时,对形参数组元素操作,实际上也是对实参数组元素操作。,例,T8-11.c,一维数组,score,内存,5,个学生成绩,求出平均成绩。,66,77,88,99,100,score0,array0,score1,array1,

27、score2,array2,score3,array3,score4,array4,ffbe,ffc6,ffc2,ffca,ffce,第57页,float average(float array5),int i;float aver,sum=array0;,for(i=1;i5;i+),printf(“,for(i=1;i5;i+)sum=sum+arrayi;aver=sum/5.0;return(aver);,main(),float scaore5,aver;int i;printf(“input 5 score:n”);,for(i=0;i5;i+)scanf(“%f”,for(i=0

28、;i5;i+),printf(“,aver=average(score);printf(“average score is%5.2f n”,aver);,66,77,88,99,100,score0,array0,score1,array1,score2,array2,score3,array3,score4,array4,ffbe,ffc6,ffc2,ffca,ffce,第58页,运行:,input 5 score:66 77 88 99 100,&score0=ffbe,score0=66.00,&score1=ffc2,score1=77.00,&score2=ffc6,score2=8

29、8.00,&score3=ffca,score3=99.00,&score4=ffce,score4=100.00,&array0=ffbe,array0=66.00,&array1=ffc2,array1=77.00,&array2=ffc6,array2=88.00,&array3=ffc6,array3=99.00,&array4=ffce,array4=100.00,结果:,average score is 86.00,第59页,几点说明:,1.,数组名作形、实参数时,应分别在主、被调函数中对其申明,2.,形、实参数数组类型要一致,大小普通相等,以确保数据全 部传送;,3.,当形参数组

30、大小未指定时,用一实参将数组长度传递给形参方便对数组进行操作;,4.,数组名作参数时,传递是地址,对形参数组操作实际,上也是对实参数组操作。,第60页,例,8-12.c,求两组学生平均成绩,形参数组长度缺省,float average(float a,int n),int i;float aver,sum=a0;,printf(“%d element array address,is%x n”,n,for(i=1;in;i+)sum=sum+ai;,aver=sum/n;return(aver);,91.5,55,98.5,77,60,67.5,89.5,99,69.5,77,89.5,76.

31、5,54,60,99.5,ffa2,ffa6,ffaa,ffae,ffb2,ffb6,ffba,ffbe,ffc2,ffc6,ffca,ffce,ffd2,ffd6,ffda,s10,s11,s12,s13,s14,s20,s21,s22,s23,s24,s25,s26,s27,s28,s29,a0,a1,a2,a3,a4,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,第61页,main(),float s15=98.5,97,91.5,60,60,55;,float s210=67.5,89.5,99,69.5,77,89.5,76.5,54,60,99.5;,int i;,f

32、or(i=0;i5;i+),printf(“,for(i=0;i10;i+),printf(“,printf(“the average of class A is,%6.2f n”,average(s1,5);,printf(“the average of class,B is%6.2f n”,average(s2,10);,第62页,例,T8-13.c,用选择法对数组中,5,个整数由小到大排序,方法是:先在,a0a4,中找出最小数与,a0,对换,再在,a1a4,中找最小数与,a1,对换,.,void sort(int b,int n),int i,j,k,t;,for(i=0;in-1;i+

33、),k=i;,for(j=i+1;jn;j+),if(bj bk)k=j;,t=bk;bk=bi;bi=t;,for(i=0;in;i+),printf(“,3 -1,2 2,-1 3,8 6,6 8,a0 b0,a2 b2,a1 b1,a3 b3,a4 b4,ffcc,ffce,ffd0,ffd2,ffd4,地址 前 后,a,、,b,数组,第63页,main(),int a5,i;printf(“enter the array a:n”);,for(i=0;i5;i+)scanf(“%d”,for(i=0;i5;i+),printf(“,sort(a,5);,for(i=0;i5;i+),p

34、rintf(“,运行结果:,enter the array a:3 2 -1 8 6,&a0=ffd4,a0=3&b0=ffd4,b0=-1&a0=ffd4,a0=-1,&a1=ffd6,a1=2&b1=ffd6,b1=2&a1=ffd6,a1=2,&a2=ffd8,a2=-1&b2=ffd8,b2=-3&a2=ffd8,a2=3,&a3=ffda,a3=8&b3=ffda,b3=6&a3=ffda,a3=6,&a4=ffdc,a4=6&b4=ffdc,b4=8&a4=ffdc,a4=8,第64页,8.8,局部变量和全局变量,8.8.1,局部变量,变量:按其作用域,可分为局部和全局,局部:作用

35、域仅限在所定义函数或复合语句内部,特点:,(1),在不一样函数中允许同名,它们占据不一样内存单元相互之间互不影响。,(,2),形参属局部变量,只能在其所在函数内部使用。,第65页,例,T8-14-1.c,f1(),int a=10,b=25,c=30;,printf(“f1:a=%d,b=%d,c=%d n”,a,b,c);,f2(int a,int b),int c;a=a+2;c=a+b+3;,printf(“f2:a=%d,b=%d,c=%d n”,a,b,c);,main(),int a=1,b=2,c=5;,printf(“1.main:a=%d,b=%d,c=%d n”,a,b,c

36、);f1();,printf(“2.main:a=%d,b=%d,c=%d n”,a,b,c);f2(a,b);,printf(“3.main:a=%d,b=%d,c=%d n”,a,b,c);,运行结果:,1.main:a=1,b=2,c=5,f1:a=10,b=25,c=30,2.main:a=1,b=2,c=5,f2:a=3,b=2,c=8,3.main:a=1,b=2,c=5,第66页,例,T8-14-2.c,复合语句中局部变量例子,main(),int a=1,b=2,c=3;,int c;c=a-b;,printf(“a=%d,b=%d,c=%d n”,a,b,c);,printf

37、(“a=%d,b=%d,c=%d n”,a,b,c);,运行结果:,a=1,b=2,c=-1,a=1,b=2,c=3,第67页,8.8.2,全局变量,全局变量:在一个文件全部函数以外定义变量称为外部或全局变量。,作用域:从定义变量位置开始到源程序结束。,几点说明:,在源程序开始定义全局变量,对源程序中全部函数有效,在源程序中间定义全局变量,仅对其后面全部函数有效,在函数或复合语句中定义局部变量假如与全局变量同名,则局部变量优先,全局变量不起作用,.,这里指是当程序执行进入该函数或复合语句时情况,.,全局变量使用,增加了函数间数据联络渠道,同一文件中全部函数都能引用全局变量值,当,某函数改变了全

38、局变量值时,便会影响其它函数。,第68页,例,T8-14-3.c,全局变量作用域及其使用情况,int a=1;,f1()int b;b=a+3;printf(“f1:a=%d,b=%d n”,a,b);,f2()int a,b;a=5;b=a+3;printf(“f2:a=%d,b=%d n”,a,b);,f3()int b;a=6;b=a+3;printf(“f3:a=%d,b=%d n”,a,b);,main(),int b=3;,printf(“1.main:a=%d,b=%d n”,a,b);f1();,printf(“2.main:a=%d,b=%d n”,a,b);f2();,pr

39、intf(“3.main:a=%d,b=%d n”,a,b);f3();,printf(“4.main:a=%d,b=%d n”,a,b);,可见:全局变量增加了函数间传送数据联络,运行:,1.main:a=1,b=3,f1:a=1,b=4,2.main:a=1,b=3,f2:a=5,b=8,3.main:a=1,b=3,f3:a=6,b=9,4.main:a=6,b=3,第69页,例,T8-15.c,用一维数组存放,10,个学生成绩,在函数中求最高分、最低分和平均值。,float max=0,min=0;,float average(float array,int n);,int i;flo

40、at aver,sum=array0;,printf(“,printf(“,for(i=0;in;i+),printf(“&array%d=%x,array%d=,%6.2f n”,i,max=min=array0;,for(i=1;i max)max=arrayi;,else if(arrayi min)min=arrayi;,sum=sum+arrayi;,aver=sum/n;return(aver);,99,45,78,97,100,67.5,89,92,66,43,ffae,ffb2,ffb6,ffba,ffbe,ffc2,ffc6,ffca,ffce,ffd2,score0,sco

41、re1,score2,score3,score4,score5,score6,score7,score8,score9,array0,array1,array2,array3,array4,array5,array6,array7,array8,array9,第70页,main(),float ave,score10;int i;printf(“input 10 numbers:n”);,for(i=0;i10;i+)scanf(“%f”,for(i=0;i10;i+),printf(“,ave=average(score,10);,printf(“&max=%x,max=%6.2f n&,m

42、in=%x,min=%6.2f n”,printf(“&ave=%x,ave=,%6.2f n”,运行:,input 10 numbers:,99 45 78 97 100 67.5,89 92 66 43,&max=194,max=100.00,&min=198,min=43.00,&ave=ffb2,ave=77.65,99,45,78,97,100,67.5,89,92,66,43,ffb6,ffba,ffbe,ffc2,ffc6,ffca,ffce,ffd2,ffd6,ffda,score0,score1,score2,score3,score4,score5,score6,score

43、7,score8,score9,第71页,外部(全局)变量几点说明:,1.,定义性申明,:,指出变量类型(整、实,.,),为其分配内存单元,在文件中仅定义一次。,2.,引用性申明,:,对已定义外部变量为了引用而作说明,为了需要,在不一样文件(函数)中可屡次使用,extern,进行申明。,3.,定义点之后:,引用外部变量可省略申明。,4.,在定义点之前,或其它文件中引用外部变量则要用,extern,加以申明。,第72页,8.9,变量存放类别,8.9.1,动态存放方式与静态存放方式,在,C,中,变量有类型之分:整、实、字符,从变量值存在时间即生成期来看,又可分为:,(,1,)静态存放方式:,即程序

44、运行期间为其,分配存放单元是固定。,(,2,)动态存放方式:,程序运行期间依据需要为其分配存放单元。,第73页,程序运行时,在内存中存放情况:,C,中每个变量和函数有两个属性:,即数类型和存放方式,,类型前已讨论,现讨论存放方式。,程序区,静态存放区,动态存放区,代码段,数据段,编译、连接后生成指令代码。,外部、局部静态(,static),:,程序运行开始到结束一直占用,形参、局部动态、函数调用时,现场保护和返回值等。,函数调用时分配存放单元,,调用结束时释放,第74页,8.9.2 auto,变量,函数内部无,static,申明局部量均为动态存放类别,被分配在动态区,未赋初值其值为零。,存放类

45、别为自动时,申明符,auto,可省;自动变量被 分配在动态区,未赋初值时,其值未定义,每次调用重新赋值。,比如:,int f(int a),auto int b,c=3;/*,定义,b,、,c,为自动变量,*/,又如:,auto int b,c=3;,int b,c=3;/*,二者等价,*/,第75页,8.9.3,用,static,申明局部变量,若希望函数调用结束后,其值不消失,下次调用函数时继续使用,则用,static,对变量加以申明。,例,T8-17.c,考查静态局部变量值,f(int a),auto int b=0;,static int c=3;,b=b+1;c=c+1;,return

46、(a+b+c);,main(),int a=2,i;,for(i=0;i3;i+),printf(“%d ”,f(a);,main(),i a f(a),0 2 f(2),1 2 f(2),2 2 f(2),f(a),a b c return(a+b+c),2 0 3,1 4 return(7),2 0 4,1 5 return(8),2 0 5,1 6 return(9),运行结果:,7 8 9,第76页,静态局部变量申明:,(1),分配在静态区,程序运行结束释放存放单元。,(2),仅开始时赋初值一次(未赋初值时为,0,),以后每次调用函数时,变量不再赋值,前次 操作结果被保留。,(3),局

47、部动态变量若未赋初值,其值是不确定,所分配存放单元是不固定;,而局部静态变量未赋初值,其值为,0(,字符型变量值为,0),,所分配存放单元是固定。,(4),静态局部变量在函数调用结束后虽存在,但其它函数不能引用它。,第77页,使用局部静态变量有以下几个情况,(1),需要保留上一次调用结束时值,例,T8-18.c,打印,15,阶乘值,int fac(n),int n;,static int f=1;,f=f*n;return(f);,main(),int i;,for(i=1;i=5;i+),printf(“%d!=%dn”,i,fac(i);,main(),i fac(i),1 fac(1),

48、2 fac(2),3 fac(3),4 fac(4),5 fac(5),fac(n),输出结果,n f=f*n f=1,1 f=1*1 1!=1,2 f=1*2=2 2!=2,3 f=2*3=6 3!=6,4 f=6*4=24 4!=24,5 f=24*5=24 5!=120,第78页,(2),初始化后变量只被引用而不改变其值,则用静态局部变量较方便,,缺点:从程序运行开始到结束一直占用内存,这么会浪费系统资源。,问题:,1.,将,static,改为,auto 2.,其它函数能否使用局部静态变量,?,第79页,T8-18-1.c,f(int a),auto int b=0;static int

49、 c=3;b=b+1;c=c+1;,printf(“f:,printf(“f:,printf(“f:,return(a+b+c);,main(),int a=2,i;system(“cls”);,printf(“main=%pn”,main);printf(“f=%pn”,f);,printf(“main:,printf(“main:,for(i=0;i3;i+),printf(“%dn”,f(a);,system(“pause”);,main=026f,f=01fa,main:&a=ffd8,a=2,main:&i=ffda,i=252,f:&a=ffd6,a=2,f:&b=ffd0,b=1

50、,f:&c=0194,c=4,7,f:&a=ffd6,a=2,f:&b=ffd0,b=1,f:&c=0194,c=5,8,f:&a=ffd6,a=2,f:&b=ffd0,b=1,f:&c=0194,c=6,9,第80页,8.9.4 register,变量,CPU,内部有存放器组可用来存放数据,若把数据申明为存放器类型,则将该类型数据存放在存放器中,,其优点在于:,降低数据与内存之间交换频率,提升程序效率和速度。,CPU,存放器组,内存,第81页,例,T8.19.c,使用存放器变量,int fac(int n),register int i,f=1;,for(i=1;i=n;i+),f=f*i;

展开阅读全文
部分上传会员的收益排行 01、路***(¥15400+),02、曲****(¥15300+),
03、wei****016(¥13200+),04、大***流(¥12600+),
05、Fis****915(¥4200+),06、h****i(¥4100+),
07、Q**(¥3400+),08、自******点(¥2400+),
09、h*****x(¥1400+),10、c****e(¥1100+),
11、be*****ha(¥800+),12、13********8(¥800+)。
相似文档                                   自信AI助手自信AI助手
搜索标签

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服