《C语言程序设计--函数ppt课件.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计--函数ppt课件.ppt(77页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能第八章 函数为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院例子:求多边形面积。AreaTAreaT1AreaT2 AreaT3求三角形面积:ns=(a+b+c)/2;narea=sqrt(s*(s-a)*(s-b)*(s-c);T1T2T3Tabcdefg为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院程序s=(a+b+c
2、)/2;area1=sqrt(s*(s-a)*(s-b)*(s-c);s=(d+e+c)/2;area3=sqrt(s*(s-d)*(s-e)*(s-c);s=(e+f+g)/2;area2=sqrt(s*(s-e)*(s-f)*(s-g);area=area1+area2+area3;T1T2T3Tabcdefg除了三角形的边长不一样之外,这三段代码几乎完全相同。为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院问题:是否有办法减少代码的重复呢?为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国
3、教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院float Tarea(float x,float y,float z)int s,area;s=(x+y+z)/2;area=sqrt(s*(s-x)*(s-y)*(s-z);return area;void main()float area;area=Tarea(a,b,c)+Tarea(d,e,c)+Tarea(e,f,g);printf(“%f”,area);函数返回为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能C程序的构成一个程序可由一个主函数main和若干个
4、其他函数构成。通常,一个较大的程序可分为若干个程序模块,每一个模块用来实现一个特定的功能。C语言中,模块由函数来实现。青岛农业大学理信学院为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能函数间的调用关系由主函数调用其他函数,其他函数也可以互相调用。同一个函数可以被一个或多个函数调用任意多次。青岛农业大学理信学院为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院主要内容一、函数的概念:定义、参数和返回值二、函数的调用三、数组作为函数参数四、局部变量和全局变
5、量五、变量的存储类别六、内部函数和外部函数为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院一、函数的概念1、函数的定义:返回值类型 函数名(参数1,参数n)声明部分;语句部分;遵循C语言标识符命名规范!如不需要可以省略没有参数的函数称为无参函数;否则,称为有参函数。例子为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院2、参数参数用于在主调函数和被调函数之间传递数据。函数定义时,括号中的参数称为形式参数,简称形参。函数被调用时,括号中
6、的参数称为实际参数,简称实参。为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院例例8.8.调用函数时的数据传递调用函数时的数据传递#include int max(int,int)int z;z=xy?x:y;return(z);void main()int,;scanf(”%d,%d”,&a,&b);cmax(,);printf(“Max is“,);运行情况如下:运行情况如下:,Max is 形参在此必须要指定形参的类型实参1、实参的类型应该与形参类型相同或者赋值兼容。2、实参必须有确定的值,可以是常量、变量
7、或者表达式。为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院“值传递”1)函数定义时,形参并不分配内存空间;2)函数调用时,才为形参分配空间,并由实参将值传递给形参;该过程是一个单向的“值传递”;3)函数调用结束后,形参空间释放。注意:在内存中,实参和形参是不同的单元。为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院3、返回值函数的返回值指函数调用结束后返回给主调函数的值。为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,
8、贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院1)如何获得函数返回值?return 语句:作用是将某个确定值返回给主调函数。形式:return(需要返回的值);int max(int x,int y)return xy?x:y;括号可以省略,中间加空格分隔;需要返回的值可以是变量,也可以是表达式。为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院2)返回值类型函数定义时,由函数名前面的类型标识符指定。比如,int max(int x,int y)注意:return语句后面的值类型要与返回值类
9、型一致。如果不一致,也要求必须赋值兼容,并以函数定义时的类型为准,进行自动类型转换。为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院例例8.3 8.3 返回值类型与函数类型不同返回值类型与函数类型不同#include int max(float,float)float z;z=xy?x:y;return(z);void main()float,;int;scanf(”%f,%f”,&a,&b);cmax(,);printf(“Max is“,);运行情况如下:运行情况如下:.2,6.5Max is 7 为深入学习
10、习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院3)void类型如果不希望函数有返回值,可以在定义的时候,将函数返回值声明为void类型。此时,函数体中不得出现return语句。void printfstar()printf(“*n”);为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院二、函数的调用函数调用的一般形式:函数名(实参列表);n有参函数:实参和形参应该个数相等,类型匹配。n无参函数:实参列表省略,但括号不能省略。为深入学习习近平新
11、时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院1、函数调用的方式1)函数语句n比如,printfstar();2)函数表达式nc=max(a,b);3)函数参数nm=max(a,max(b,c);为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院2、被调函数声明#include int max(int,int)return(xy?x:y);void main()int,;scanf(”%d,%d”,&a,&b);cmax(,);printf(“Max
12、 is“,);#include void main()int max(int x,int y);int,;scanf(”%d,%d”,&a,&b);cmax(,);printf(“Max is“,);int max(int,int)return(xy?x:y);为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院被调函数声明如果被调函数位于主调函数的后面,并且二者位于同一文件,则应该在主调函数中对被调函数作声明。作用:将函数名、参数个数、类型等信息通知编译系统,便于在编译阶段对函数调用进行合法性检查。为深入学习习近平
13、新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院以上的声明称为函数原型声明(function prototype)。两种形式:nfloat add(float,float);nfloat add(float a,float b);为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院注意:“定义”与“声明”不同函数的定义是指对函数功能的确立,包括指定函数名,函数值类型、形参及其类型、函数体等,它是一个完整的、独立的函数单位。函数的声明则是把函数的名字、函
14、数类型以及形参的类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查。为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院3、函数的嵌套调用被调函数中又调用了另外的函数,称为函数的嵌套调用。为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院例子include“stdio.h”void main()int i=10,j=20;int f1(int x,int y);int f2(int x,int y);i=f1(i,j);
15、printf(“%d”,i);int f1(int x,int y)x=x*y;y=f2(x,y);return x+y;int f2(int x,int y)return x-y;为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院4、函数的递归调用被调函数中间接或者直接调用了该函数本身,称为函数的递归调用。例如:例如:int f(int x)int y,z;z=f(y);return(2*z);直接调用了函数自身为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室
16、育人功能青岛农业大学理信学院间接调用 int f(int x)int y,z;z=f1(y);return(2*z);int f1(int x)return f(x)*0.5+10;为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院例分析:例例8.88.8用递归方法求!用递归方法求!n!=n*(n-1)!(n1)1 (n=1)int f(int n)if(n=1)return 1;else return n*f(n-1);为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小
17、学图书室育人功能青岛农业大学理信学院三、数组作为函数的参数1、数组元素作为函数实参由于实参可以是表达式,而数组元素可以是表达式的组成部分,因此数组元素可以作为函数的实参,与变量作实参一样,是单向传递,即“值传递”方式。为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院例例 8.10 8.10 有两个数组和,各有个元素,将它们对应地逐个相比(即与比,与比)。如果数组中的元素大于数组中的相应元素的数目多于b数组中元素大于a数组中相应元素的数目(例如,aibi6次,biai3次,其中i每次为不同的值),则认为a数组大于b
18、数组,并分别统计出两个数组相应元素大于、等于、小于的次数。为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院#include void main()int large(int x,int y);/*函数声明*/int 10,10,,;printf(enter array a);for(;)scanf(,);printf();printf(enter array);for(;)scanf(,);printf();for(;)if(large(i,i)=);else if(large(i,i)=)=+;else;为深入
19、学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院printf(aibi%d timesnai=bi%d timesnaik)printf(array a is larger than array bn);else if(nk)printf(array a is smaller than array bn);else printf(array is equal to array bn);large(int,int)int;if();else if()flag;else flag;return(flag);为深入学习习近平
20、新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院2、数组名作为函数参数用数组名作函数参数时,此时形参应当用数组名或指针变量。例例8.11 8.11 有一个一维数组score,内放10个学生成绩,求平均成绩。为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院#include void main()float average(float array10);/*函数声明*/float score10,aver;int;printf(input scores
21、:);for(;scanf(,score);printf();averaverage(score);printf(average score is.n,aver);为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院float average(float array10)int;float aver,;for (;);return(aver);运行情况如下:运行情况如下:input scores:.5 .5 average score is 83.40 为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻
22、全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院第一种情况:形参以及对应的实参都是数组,要求二者类型一致、长度相同。为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院例例 8.形参数组不定义长度形参数组不定义长度#include void main()float average(float array,int)float score_15,.,;float score_210=67.5,89.5,99,6.5,77,89.5,76.5,54,60,99.5;printf(“the average
23、of class A is%6.2fn”,average(score_1,5);printf(“the average of class B is%6.2fn”,average(score_2,10);为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院float average(float array,int)int;float aver,;for(;sumsumarray;aversum;return();运行结果如下:运行结果如下:the average of class A is 80.40The avera
24、ge of class is 78.20为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院第二种情况:在形参数组长度无法确定的情况下,可以不指定大小;而是另设一个形参,用于传递需要处理的数组元素个数。为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院强调:“地址传递”数组名代表数组第一个元素的地址。数组名做实参的时候,是将实参数组的首地址传递给形参数组,是“地址传递”或者叫做“引用传递”。即:二者共享同一段内存空间。为深入学习习近平新时
25、代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院#include void main()int f(int x10);int a10,b;b=f(a);294522211097542 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 x0 x1 x2 x3 x4 x5 x6 x7 x8 x9起始地址1000为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院3、多维数组名作为函数参数多维数组名作为函数实参和形参,在被调函数中对形参数组定义时可以指
26、定每一维的大小,也可以不指定第一维大小。程序:程序:#include void main()max_value(int 4);int a34=1,3,5,7,2,4,6,8,15,17,34,12;printf(max value is,max_value(a));为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院max_value(int array34)int,max;max=;for(=;)for(;if(array)max=array;return(max);运行结果如下:运行结果如下:Max value
27、is 34为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院四、局部变量和全局变量1、局部变量在一个函数内部定义的变量称内部变量。它只在本函数范围内有效,即:只有在本函数内才能使用这些变量,故称为“局部变量”。为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院局部变量内部变量1)形式参数也是局部变量,仅在函数体范围内有效。2)在复合语句块中定义的变量是局部变量,这些变量只在本复合语句范围内有效。3)函数体中定义的变量是局部变量,仅在函数
28、体范围内存在。因此不同函数中可以使用相同名字的变量,互不冲突。为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院float f1(int a)int b,c;.char f2(int x,int y)int i,j;main()int m,n;.a,b,c有效有效x,y,i,j有效有效m,n有效有效#define N 5main()int i;int aN=1,2,3,4,5;for(i=0;iN/2;i+)int temp;temp=ai;ai=aN-i-1;aN-i-1=temp;for(i=0;iN;i+)p
29、rintf(%d ,ai);为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院例例 不同函数中同名变量不同函数中同名变量main()int a,b;a=3;b=4;printf(main:a=%d,b=%dn,a,b);sub();printf(main:a=%d,b=%dn,a,b);sub()int a,b;a=6;b=7;printf(sub:a=%d,b=%dn,a,b);为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院2、全
30、局变量函数之外定义的变量称为外部变量。外部变量可以为本文件中其他函数所共用。它的有效范围为从定义变量的位置开始到本源文件结束。所以也称全局变量。为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院float max,min;float average(float array,int n)int i;float sum=array0;max=min=array0;for(i=1;imax)max=arrayi;else if(arrayimin)min=arrayi;sum+=arrayi;return(sum/n);
31、main()int i;float ave,score10;/*Input */ave=average(score,10);printf(max=%6.2fnmin=%6.2fn average=%6.2fn,max,min,ave);作作用用域域maxmin为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院若全局变量和局部变量同名,则局部变量有效,全局变量被屏蔽掉。为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院例例 8.8.6 6
32、 外部变量与局部变量同名外部变量与局部变量同名#include int a=3,b=5;/*a,b为外部变量*/a,b作用范围void main()int a=8;/*a为局部变量*/局部变量a作用范围 printf(%d,max(a,b);全局变量b的作用范围 max(int a,int b)/*a,b为局部变量*/int c;c=ab?ab;形参a、b作用范围 return(c);运行结果为运行结果为 8 8 为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院应尽量少使用全局变量,因为:应尽量少使用全局变量,因
33、为:Y全局变量在程序全部执行过程中占全局变量在程序全部执行过程中占用存储单元用存储单元Y降低了函数的通用性、可靠性,可降低了函数的通用性、可靠性,可移植性移植性Y降低程序清晰性,容易出错降低程序清晰性,容易出错为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院变量的作用域即:变量起作用的范围,或者可以使用该变量的范围。n从该变量定义之处起n至该变量存储空间被释放止n函数调用结束时,形参和函数体中定义的变量被释放n复合语句结束时,该复合语句内部定义的变量被释放两个同名变量的作用域重叠时,范围小的那个起作用为深入学习习
34、近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院五、变量的存储类别从变量的作用域(空间角度)来分,变量可以分为全局变量和局部变量从变量的生存期(时间角度)来分,变量可以分为静态变量和动态变量n静态,指程序运行期间系统为变量分配固定的存储空间n动态,指程序运行期间系统根据需要进行动态的变量空间分配为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院内存中供用户程序使用的存储空间程序区动态存储区静态存储区存放程序运行代码全局变量和静态变量函数的形参函数
35、调用时为形参分配空间;自动变量不使用static声明的局部变量;函数调用时的现场保护和返回地址。为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院变量的存储类别C语言中的变量和函数都具有两种属性:n数据类型n数据的存储类别数据在内存中的存储方式n自动的 auton静态的 staticn寄存器的 registern外部的 externn根据变量的存储类别,可以知道变量的作用域和生存期。为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院au
36、to变量不专门声明为static存储类别的局部变量都是动态分配存储空间,在调用该函数时系统会给它们分配存储空间,在函数调用结束时就自动释放这些存储空间。因此这类局部变量称为自动变量。函数中的形参和在函数中定义的变量(包括在复合语句中定义的变量),都属此类。自动变量用关键字auto作存储类别的声明。为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院例如:例如:int(int)*定义f函数,为形参*auto int,;/*定义、为自动变量*为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神
37、,充分发挥中小学图书室育人功能青岛农业大学理信学院static变量当函数中的局部变量的值在函数调用结束后不消失而保留原值时,该变量称为静态局部变量。用关键字static进行声明。为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院例例87 考察静态局部变量的值#include void main()int(int);int,;for(;printf(,();int(int)auto int;static;return();为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学
38、图书室育人功能对静静态局部局部变量的量的说明:明:(1)静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,占动态存储区空间而不占静态存储区空间,函数调用结束后即释放。(2)对静态局部变量是在编译时赋初值的,即只赋初值一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能(3)如在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值(对数值型变量)或空
39、字符(对字符变量)。而对自动变量来说,如果不赋初值则它的值是一个不确定的值。(4)虽然静态局部变量在函数调用结束后仍然存在,但其他函数不能引用它。为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能例例88 输出到的阶乘值#include void main()int fac(int);int;for(;)printf(%!=,fac();Int fac(int)static int;*;return();为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院r
40、egister变量 变量的值是存放在内存中的。当程序中用到哪一个变量的值时,由控制器发出指令将内存中该变量的值送到运算器中。经过运算器进行运算后,如果需要存数,再从运算器将数据送到内存存放。为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能如果有一些变量使用频繁,则为存取变量的值要花费不少时间。为提高执行效率,语言允许将局部变量的值放在CPU中的寄存器中,需要用时直接从寄存器取出参加运算,不必再到内存中去存取。由于对寄存器的存取速度远高于对内存的存取速度,因此这样做可以提高执行效率。这种变量叫做寄存器变量寄存器变量,用关键字regis
41、terregister作声明。青岛农业大学理信学院为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院例819使用寄存器变量#include void main()long fac(long);long i,n;scanf(%ld,&n);for(i=1;i=n;i+)printf(%ld!=%ldn,i,fac(i);long fac(long n)register long i,f=1;/*定义寄存器变量*/for(i=1;i=n;i+)f=f*i;return(f);为深入学习习近平新时代中国特色社会主义思想和
42、党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院extern变量外部变量是在函数的外部定义的全局变量,它的作用域是从变量的定义处开始,到本程序文件的末尾。在此作用域内,全局变量可以为程序中各个函数所引用。编译时将外部变量分配在静态存储区。用extern来声明外部变量,以扩展外部变量的作用城。为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能1.在一个文件内声明外部在一个文件内声明外部变量量例例820 用用extern声明外部变量,扩展它在程序文件中声明外部变量,扩展它在程序文件中的作用域的作用域#
43、include void main()int max(int,int);*外部变量声明*extern A,B;printf(%dn,max(A,B);int A=13,B=-8;*定义外部变量*int max(int x,int y)*定义函数*int z;z=xy?x:y;return(z);为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能2.在多文件的程序中声明外部在多文件的程序中声明外部变量量#include int A;/*定义外部变量*/void main()int(int);/*函数声明*/int,;printf(ent
44、er the number a and its power m:n);scanf(,A,);A*;printf(*,A,);();printf(*n,A,);例例8.8.用extern将外部变量的作用域扩展到其他文件。本程序的作用是给定的值,输入和,求和am的值。文件file.中的内容为:为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能文件file中的内容为:extern A;/*声明A为一个已定义的外部变量*/int powre(int);int,;for(;)*A;return();为深入学习习近平新时代中国特色社会主义思想和党
45、的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能3.3.用用staticstatic声明外部变量声明外部变量在程序设计中,某些外部变量只限于被本文件引用,而不能被其他文件引用。这时可以在定义外部变量时加一个staitic声明。例如:例如:file1.c file2.cstatic int A;extern int A;void main()void fun(int n)A=A*n;此时A不可访问,提示编译错误!为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能关于变量的声明和定义关于变量的声明和定义定义定义:需要建立存
46、储空间。n如:int a;声明声明:不需建立存储空间。n如extern a;青岛农业大学理信学院为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能注意:声明包括定义,但并非所有的声明都是定义。n对“int a;”而言,它既是声明,又是定义。n而对“extern a;”而言,它是声明而不是定义。青岛农业大学理信学院为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能青岛农业大学理信学院 六、内部函数和外部函数用于定义该函数是否能够被其他源文件调用n内部函数:static关键字声明
47、,只能被本文件中的其他函数调用n外部函数:函数定义时使用extern关键字声明,可以被其他文件中的函数调用。n在需要调用此函数的文件中,还需要使用extern对函数做声明,表明该函数是定义在其他文件中的外部函数。n如果在定义函数时省略extern,则隐含为外部函数。为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能例8.22 有一个若干字符的字符串,今输入一个字符,要求程序将字符串中该字符删去。用外部函数实现。File.c(文件)(文件)#include void main()extern void enter_string(char
48、 str);extern void detele_string(char str,char ch);extern void print_string(char str);*以上3行声明在本函数中将要调用的在其他文件中定义的3个函数*char c;char str80;scanf(%c,&c);detele_string(str,c);print_string(str);为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能file(文件)(文件)#include void enter_string(char str80)*定义外部函数 e
49、nter-string*gets(str);*向字符数组输入字符串*file(文件)(文件)void delete_string(char str,char ch)*定义外部函数 delete_string*int i,j;for(i=j=0;stri!=0;i+)if(stri!=ch)strj+=stri;stri=0;为深入学习习近平新时代中国特色社会主义思想和党的十九大精神,贯彻全国教育大会精神,充分发挥中小学图书室育人功能file(文件)(文件)#include void print_string(char str)printf(%sn,str);运行情况如下:运行情况如下:(输入)输入)(输入要删去的字符)(输入要删去的字符)(输出已删去指定字符的字符串)(输出已删去指定字符的字符串)