第7章用函数实现模块化程序设计.ppt

上传人:本田雅阁 文档编号:3131925 上传时间:2019-07-15 格式:PPT 页数:182 大小:2.42MB
返回 下载 相关 举报
第7章用函数实现模块化程序设计.ppt_第1页
第1页 / 共182页
第7章用函数实现模块化程序设计.ppt_第2页
第2页 / 共182页
第7章用函数实现模块化程序设计.ppt_第3页
第3页 / 共182页
第7章用函数实现模块化程序设计.ppt_第4页
第4页 / 共182页
第7章用函数实现模块化程序设计.ppt_第5页
第5页 / 共182页
点击查看更多>>
资源描述

《第7章用函数实现模块化程序设计.ppt》由会员分享,可在线阅读,更多相关《第7章用函数实现模块化程序设计.ppt(182页珍藏版)》请在三一文库上搜索。

1、7.1 函数是什么 7.2 函数的定义和调用 7.3 函数的嵌套调用和递归调用 7.4 数组作为函数参数 7.5 变量的作用域和生存期 7.6 内部函数和外部函数 7.7 提高部分,第7章 用函数实现模块化程序设计,P168,7.1 函数是什么,如果程序的功能比较多,规模比较大,把所有的程序代码都写在一个主函数中,就会使主函数变得庞杂、头绪不清,使阅读和维护程序变得困难。,P168,有时程序中要多次实现某一功能,就需要多次重复编写实现此功能的程序代码。这使程序冗长,不精炼。,7.1 函数是什么,P168,采用“组装”的办法简化程序设计过程 事先编好一批函数实现各种不同的功能 用到什么函数就直接

2、装使用就可以 这就是模块化的程序设计,7.1 函数是什么,P168,函数就是功能(Function) 每一个函数用来实现一个特定的功能 函数的名字应反映其代表的功能,7.1 函数是什么,P168,在设计一个较大的程序时,往往把它分为若干个程序模块,每一个模块包括一个或多个函数,每个函数实现一个特定的功能。,7.1 函数是什么,P168,一个程序可由一个主函数和若干个其他函数构成。由主函数调用其他函数,其他函数也可以互相调用。同一个函数可以被一个或多个函数调用任意多次,7.1 函数是什么,P168,7.1 函数是什么,P168,main,a,b,c,f,g,h,d,e,i,e,除了可以使用库函数

3、外,还可以编写一些本领域或本单位常用到一些专用函数,供本领域或本单位的人员使用。、 在程序设计中要善于利用函数,可以减少各人重复编写程序段的工作量,同时可以方便地实现模块化的程序设计。,7.1 函数是什么,P168,7.1 函数是什么,P168,例7.1 输出以下的结果,用函数调用实现。 * How do you do! *,7.1 函数是什么,P168,解题思路: 在输出的文字上下分别有一行“*”号,显然不必重复写这段代码,用一个函数print_star来实现输出一行“*”号的功能。 再写一个print_message函数来输出中间一行文字信息 用主函数分别调用这两个函数,#include

4、void main() void print_star(); void print_message(); print_star(); print_message(); print_star(); void print_star () printf(*n); void print_message() printf( How do you do!n);,输出18个*,输出一行文字,#include void main() void print_star(); void print_message(); print_star(); print_message(); print_star(); voi

5、d print_star () printf(*n); void print_message() printf( How do you do!n);,声明函数,定义函数,说明: (1) 一个程序由一个或多个程序模块组成,每一个程序模块作为一个源程序文件。对于较大的程序,一般不把所有内容全放在一个源程序文件中,而是将它们分别放在若干个源文件中,由若干个源程序文件组成一个C程序。这样便于分别编写、分别编译,提高调试效率。一个源程序文件可以为多个C程序所调用。,说明: (2) 一个源程序文件由一个或多个函数以及其他有关内容组成。一个源程序文件是一个编译单位,在程序编译时是以源程序文件为单位进行编译的

6、,而不是以函数为单位进行编译的。,说明: (3) 不论main函数出现在什么位置,总是从main函数开始执行。如果在main函数中调用其他函数,在调用后流程返回到main函数,在main函数中结束整个程序的运行。,说明: (4) 所有函数都是平行的,即在定义函数时是分别进行的,是互相独立的。一个函数并不从属于另一个函数,即函数不能嵌套定义。函数间可以互相调用,但不能调用main函数。main函数是由系统调用的。,说明: (5) 从用户使用的角度看,函数有两种。 库函数,它是由系统提供的,用户不必自己定义而直接使用它们。应该说明,不同的C语言编译系统提供的库函数的数量和功能会有一些不同,当然许多

7、基本的函数是共同的。 用户自己定义的函数。它是用以解决用户专门需要的函数。,说明: (6) 从函数的形式看,函数分两类。 无参函数。函数没有参数,一般用来执行固定的一组操作。无参函数可以带回或不带回函数值,但一般以不带回函数值的居多。 有参函数。在调用函数时,要给出实参。主调函数在调用被调用函数时,通过参数向被调用函数传递数据,一般情况下,执行被调用函数时会得到一个函数值,供主调函数使用。,7.2 函数的定义和调用,7.2.1 为什么要定义函数 7.2.2 函数定义 7.2.3 函数的调用 7.2.4 对被调用函数的声明和函数原型,P170,C语言要求,在程序中用到的所有函数,必须“先定义,后

8、使用” 指定函数名字、函数返回值类型、函数实现的功能以及参数的个数与类型,将这些信息通知编译系统。,7.2.1 为什么要定义函数,P170,指定函数的名字,以便以后按名调用 指定函数类型,即函数返回值的类型 指定函数参数的名字和类型,以便在调用函数时向它们传递数据 指定函数的功能。这是最重要的,这是在函数体中解决的,7.2.1 为什么要定义函数,P170,如果程序中要调用库函数,只需用#include指令把有关的头文件包含到本文件模块中即可。 如果想使用库函数中没有的函数,需要程序设计者在程序中自己定义。,7.2.1 为什么要定义函数,P170,7.2.2 函数定义,1.怎样定义无参函数 函数

9、名后面圆括号中空的,没有参数 定义无参函数的一般形式为: 类型名 函数名() 函数体 ,P171,包括声明部分和语句部分,指定函数值的类型,7.2.2 函数定义,1.怎样定义无参函数 函数名后面圆括号中空的,没有参数 定义无参函数的一般形式为: 类型名 函数名() 函数体 ,P171,表示不需要带回函数值,void,7.2.2 函数定义,2. 怎样定义有参函数 定义有参函数的一般形式为: 类型标识符 函数名(形式参数表列) 函数体 ,P171,7.2.2 函数定义,2. 怎样定义有参函数 int max (int x,int y) int z; if(xy) z=x; else z=y; re

10、turn(z); ,P171,函数的功能是什么?,求x和y二者中大者,7.2.3 函数的调用,1.调用无参函数的形式 函数名() 如print_star() 2. 调用无参函数的形式 函数名(实参表列) 如max(a,b),P172,如果有多个参数,用逗号隔开,例7.2 输入两个整数,输出二者中的大者。要求在主函数中输入两个整数,用一个函数max求出其中的大者,并在主函数中输出此值。,解题思路: 题目要求用一个max函数实现比较两个整数,并将得到的大数带回主函数。显然,二个整数中的大者也应该是整数,因此max函数应当是int型。 两个数是在主函数中输入的,在max函数中进行比较,因此应该定义为

11、有参函数,在函数调用时进行数据的传递。,#include int max(int x,int y) int z; if (xy) z=x; else z=y; return(z); ,参数类型,函数类型,定义函数,定义函数内使用的变量,#include void main() int max(int x,int y); int a,b,c; printf(”please input two number:”); scanf(“%d,%d”, ,调用函数,c=max(a,b); (main函数) int max(int x, int y) (max函数) int z; z=xy?x:y; ret

12、urn(z); ,#include void main() int max(int x,int y); int a,b,c; printf(”please input two number:”); scanf(“%d,%d”, ,if (xy) return(x); else return(y);,#include void main() int max(int x,int y); int a,b,c; printf(”please input two number:”); scanf(“%d,%d”, ,形式参数,实际参数,函数调用的过程:,在定义函数中指定的形参,在未出现函数调用时,它们并

13、不占内存中的存储单元。在发生函数调用时,函数max的形参被临时分配内存单元。,2,a,3,b,x,y,2,3,实参,形参,函数调用的过程:,2,a,3,b,x,y,2,3,实参,形参,调用结束,形参单元被释放 实参单元仍保留并维持原值,没有改变 如果在执行一个被调用函数时,形参的值发生改变,不会改变主调函数的实参的值,调用函数的方式:,按函数在程序中出现的位置来分,可以有以下3种函数调用方式 . 函数语句 调用没有返回值的函数,函数调用单独作为一个语句 如例7.1中的“print_star();”,调用函数的方式:,按函数在程序中出现的位置来分,可以有以下3种函数调用方式 . 函数表达式 函数

14、出现在一个表达式中,这种表达式称为函数表达式 如例7.2中的“c=max(a,b);”,调用函数的方式:,按函数在程序中出现的位置来分,可以有以下3种函数调用方式 . 函数参数 函数调用作为一个函数的实参 如printf (%d, max (a,b);,7.2.4 对被调用函数的声明和函数原型,P175,在一个函数中调用另一个函数需要具备如下条件: (1) 被调用函数必须是已经定义的函数(是库函数或用户自己定义的函数)。 (2) 如果使用库函数,应该在本文件开头加相应的#include指令。 (3) 如果使用自己定义的函数,而该函数的位置在调用它的函数后面,应该进行函数声明,7.2.4 对被调

15、用函数的声明和函数原型,P175,函数原型的一般形式有两种: 如 int max(int x,int y); int max(int,int); 原型说明可以放在文件的开头,这时本文件中所有函数都可以使用此函数,7.3 函数的嵌套调用和递归调用,P177,7.3.1 函数的嵌套调用 7.3.2 函数的递归调用,7.3.1 函数的嵌套调用,调用一个函数的过程中,又可以调用另一个函数,P177,7.3.1 函数的嵌套调用,P177,main函数,调用a函数,结束,a函数,调用b函数,b函数,例7.3 输入4个整数,找出其中最大的数。用一个函数来实现。 解题思路: 定义max_4函数,找4个数中最大

16、者 max_4中再多次调用max,找4个数中的大者,然后把它作为函数值返回main函数,#include void main() int max_4(int a,int b,int c,int d); int a,b,c,d,max; printf(“4 interger numbers:“); scanf(“%d%d%d%d“, ,主函数,对max_4 函数声明,#include void main() int max_4(int a,int b,int c,int d); int a,b,c,d,max; printf(“4 interger numbers:“); scanf(“%d%d

17、%d%d“, ,主函数,输入4个整数,#include void main() int max_4(int a,int b,int c,int d); int a,b,c,d,max; printf(“4 interger numbers:“); scanf(“%d%d%d%d“, ,主函数,调用后肯定是4个数中最大者,输出最大者,int max_4(int a,int b,int c,int d) int max(int a,int b); int m; m=max(a,b); m=max(m,c); m=max(m,d); return(m); ,max_4函数,对max 函数声明,int

18、 max_4(int a,int b,int c,int d) int max(int a,int b); int m; m=max(a,b); m=max(m,c); m=max(m,d); return(m); ,max_4函数,a,b中较大者,a,b,c中较大者,a,b,c,d中最大者,int max_4(int a,int b,int c,int d) int max(int a,int b); int m; m=max(a,b); m=max(m,c); m=max(m,d); return(m); ,max_4函数,int max(int x,int y) if(xy) retur

19、n x; else return y; ,max函数,找x,y中较大者,int max_4(int a,int b,int c,int d) int max(int a,int b); int m; m=max(a,b); m=max(m,c); m=max(m,d); return(m); ,max_4函数,int max(int x,int y) if(xy) return x; else return y; ,max函数,return(xy?x:y);,int max_4(int a,int b,int c,int d) int max(int a,int b); m=max(a,b);

20、m=max(m,c);m=max(m,d); return(m); ,int max(int x,int y) return(xy?x:y); ,#include void main() max=max_4(a,b,c,d); ,7.3.2 函数的递归调用,P179,在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。 语言的特点之一就在于允许函数的递归调用。,7.3.2 函数的递归调用,P179,f2函数 调用f1函数,int f(int x) int y,z; z=f(y); return (2*z); ,f函数 调用f函数,f1函数 调用f2函数,应使用if语句控

21、制结束调用,直接调用本函数,间接调用本函数,例7.6 有5个学生坐在一起 问第5个学生多少岁?他说比第4个学生大2岁 问第4个学生岁数,他说比第3个学生大2岁 问第3个学生,又说比第2个学生大2岁 问第2个学生,说比第1个学生大2岁 最后问第1个学生,他说是10岁 请问第5个学生多大,解题思路: 要求第个年龄,就必须先知道第个年龄 要求第个年龄必须先知道第个年龄 第个年龄又取决于第个年龄 第个年龄取决于第个年龄 每个学生年龄都比其前个学生的年龄大,解题思路: age(5)=age(4)+2 age(4)=age(3)+2 age(3)=age(2)+2 age(2)=age(1)+2 age(

22、1)=10,age(5) =age(4)+2,age(4) =age(3)+2,age(3) =age(2)+2,age(2) =age(1)+2,age(1) =10,age(2) =12,age(3) =14,age(4) =16,age(5) =18,回溯阶段,递推阶段,age(5) =age(4)+2,age(4) =age(3)+2,age(3) =age(2)+2,age(2) =age(1)+2,age(1) =10,age(2) =12,age(3) =14,age(4) =16,age(5) =18,回溯阶段,递推阶段,结束递归的条件,#include int age(int

23、 n) int c; if(n=1) c=10; else c=age(n-1)+2; return(c); void main() printf(“%dn“,age(5); ,age(5) 输出age(5),main,c=age(4)+2,age函数 n=5,c=age(3)+2,age函数 n=4,c=age(1)+2,age函数 n=2,c=age(2)+2,age函数 n=3,c=10,age函数 n=1,age(1)=10,age(2)=12,age(3)=14,age(4)=16,age(5)=18,18,例7.5 分别用递推方法和递归方法求!,即12 n。 1.用递推方法求! 解

24、题思路: 从1开始,乘2,再乘3一直乘到n。这种方法容易理解,也容易实现。递推法的特点是从一个已知的事实出发,按一定规律推下一个事实,再从这个新的已知的事实出发,再向下推出一个新的事实这是和递归不同的。,#include void main() long fac(int n); int n; long fact=0; printf(“input an integer number:”); scanf(“%d”, ,long fac(int n) int i; long fact=1; for(i=1;i=n;i+) fact=fact*i; return fact; ,2.用递归方法求! 解题

25、思路: 递归的思路和递推是相反的,并不是先求1 再 求1 2再 3,直到 n,而是直接从目标出发提出问题: !等于!,而!,而1!是已知的,不必再回溯了,#include void main() long fac(int n); int n,y; printf(“input an integer number:“); scanf(“%d“, ,long fac(int n) long f; if(n0) printf(“n0,data error!”); else if(n=0 | n=1) f=1; else f=fac(n-1)*n; return(f); ,fac(5) 输出fac(5)

26、,main,f=fac(4)5,fac函数 n=5,f=fac(3)4,fac函数 n=4,f=fac(1)2,fac函数 n=2,f=fac(2)3,fac函数 n=3,f=1,fac函数 n=1,fac(1)=1,fac(2)=2,fac(3)=6,fac(4)=24,fac(5)=120,120,递归调用的特点: 执行“未知未知递归边界条件已知已知已知”的过程。,用递归方法解题的条件: (1)所求解的问题能转化为用同一方法解决的子问题。 (2) 子问题的规模比原问题的规模小。 (3) 必须要有递归结束条件,停止递归,否则形成无穷递归,系统无法实现。,7.4 数组作为函数参数,7.4.1

27、数组元素作函数实参 7.4.2 数组名作函数参数,P184,7.4.1 数组元素作函数实参,由于实参可以是表达式,而数组元素可以是表达式的组成部分,因此数组元素可以作为函数的实参。,P185,例7.6 有两个运动队a和b,各有10个队员,每个队员有一个综合成绩。将两个队的每个队员的成绩按顺序一一对应地逐个比较(即a队第1个队员与b队第1个队员比,)。如果a队队员的成绩高于b队相应队员成绩的数目多于b队队员成绩高于a队相应队员成绩的数目(例如,a队蠃6次,b队蠃4次),则认为a队胜。统计出两队队员比较的结果(a队高于、等于和低于b队的次数)。,解题思路: 设两个数组a和b,各有10个元素,分别存

28、放10个队员的成绩 将两个数组的相应元素逐个比较,用3个变量n,m,k分别累计a队队员高于、等于和低于b队队员的次数 用一个函数higher来判断每一次比较的结果,如果a队员高于b队员,结果为1,二者相等,结果为0,a队员低于b队员,结果为-1。最后比较n和k即可得到哪队胜的结果,#include void main() int higher(int x,int y); int a10,b10,i,n=0,m=0,k=0; printf(“enter array a:n“); for(i=0;i10;i+) scanf(“%d“,输入a队队员成绩,输入b队队员成绩,for(i=0;i10;i+

29、) if(higher(ai,bi)=1) n+; else if(higher(ai,bi)=0) m+; else k=k+1; printf(“a higher b %d timesn“,n); printf(“a equal to b %d timesn“,m); printf(“b higher a %d timesn“,k);,比较10个队员,与变量作为实参一样,if(nk) printf(“a wins!n“); else if (nk) printf(“b wins!n“); else printf(“a is equal to bn“); ,higher(int x,int

30、y) int flag; if(xy) flag=1; else if(xy) flag=-1; else flag=0; return(flag); ,7.4.2 数组名作函数参数,P186,希望在函数中处理整个数组的元素时,可以用数组名作为函数实参 注意,此时只是将数组的首元素的地址传递给所对应的形参,因此对应的形参应当是指针变量(见第8章)。,例7.7 有10个学生成绩,用一个函数求全体学生的平均成绩。 解题思路: 在主函数中定义一个实型数组score,将输入的10个学生成绩存放在数组中 设计函数average,用来求学生平均成绩 需要把数组有关信息传递给average函数 采取用数组名

31、作为实参,把数组地址传给average函数,在该函数中对数组进行处理,#include void main() float average(float array10); float score10,aver; int i; printf(“input 10 scores:n“); for(i=0;i10;i+) scanf(“%f“, ,数组名作实参,float average(float array10) int i; float aver,sum=array0; for(i=1;i10;i+) sum=sum+arrayi; aver=sum/10; return(aver); ,与sc

32、ore共占同一存储单元,实参、形参都是float型,相当于score0,相当于scorei,例7.8 有两个班,学生数不同,编写一个函数,用来分别求各班的平均成绩。,解题思路: 问题的关键是用同一个函数求不同人数的班级平均成绩 在定义形参时不指定大小,函数对不同人数的班级都是适用 由于数组名传递的是数组首地址,可以利用同一个函数求人数不同的班平均成绩 在定义average函数时,增加一个参数n,用来指定当前班级的人数,#include void main() float average(float array ,int n); float score_15=98.5,97,91.5,60,55

33、; float score_210=67.5,89.5,99,69.5, 77,89.5,76.5,54,60,99.5; printf(“%6.2fn”,average(score_1,5); printf(“%6.2fn”,average(score_2,10); ,float average(float array ,int n) int i; float aver,sum=array0; for(i=1;in;i+) sum=sum+arrayi; aver=sum/n; return(aver); ,调用形式为average(score_1,5)时,相当于score_10,相当于sc

34、ore_1i,相当于5,float average(float array ,int n) int i; float aver,sum=array0; for(i=1;in;i+) sum=sum+arrayi; aver=sum/n; return(aver); ,调用形式为average(score_2,10)时,相当于score_20,相当于score_2i,相当于10,例7.9 用一个函数实现用选择法对10个整数按升序排列。 解题思路: 所谓选择法就是先将10个数中最小的数与a0对换;再将a1到a9中最小的数与a1对换每比较一轮,找出一个未经排序的数中最小的一个 共比较9轮,a0 a1

35、 a2 a3 a4,3 6 1 9 4,1 6 3 9 4,1 3 6 9 4,1 3 4 9 6,1 3 4 6 9,小到大排序,#include void main() void sort(int array,int n); int a10,i; printf(“enter the array:n“); for(i=0;i10;i+) scanf(“%d“, ,void sort(int array,int n) int i,j,k,t; for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+) if(arrayjarrayk) k=j; t=arrayk; array

36、k=arrayi; arrayi=t; ,在sortisort9中,找最小数下标,在sortisort9中,最小数与sorti对换,例7.10 有4个学生,5门课的成绩,设计一个函数,用来求出其中的最高成绩。 解题思路: 先使变量max的初值为二维数组中第一个元素的值,然后将二维数组中各个元素的值与max相比,每次比较后都把“大者”存放在max中,取代max的原值。全部元素比较完后,max 的值就是所有元素的最大值。,#include void main() float highest_score(float array45); float score45=61,73,85.5,87,90,

37、72,84,66,88,78, 75,87,93.5,81,96, 65,85,64,76,71 ; printf(“%6.2fn“,highest_score(score); ,float highest_score(float array45) int i,j; float max; max=array00; for(i=0;imax) max=arrayij; return (max); ,7.5 变量的作用域和生存期,7.5.1 变量的作用域-局部变量和全局变量 7.5.2 变量的存储方式和生存期 7.5.3 作用域和生存期的小结,P192,7.5.1 变量的作用域 局部变量和全局变量

38、,1 局部变量 在函数和复合语句内定义的变量,称为内部变量或局部变量 只在本函数或复合语句内范围内有效(从定义点开始到函数或复合语句结束) 在此函数或复合语句以外是不能使用这些变量的,P192,说明: (1) 主函数中定义的变量也只在主函数中有效,主函数也不能使用其他函数中定义的变量。 (2) 不同函数中可以使用相同名字的变量,它们代表不同的对象,互不干扰。 (3) 形式参数也是局部变量。在函数中可以使用本函数定义的形参,在函数外不能引用它。 (4) 在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效。,2 全局变量 一个程序可以包含一个或若干个源程序文件(即程序模块),而

39、一个源文件可以包含一个或若干个函数 在函数之外定义的变量是外部变量,也称为全局变量(或全程变量) 全局变量的有效范围为从定义变量的位置开始到本源文件结束,在此范围内可以为本文件中所有函数所共用,2 全局变量 在一个函数中既可以使用本函数中的局部变量,又可以使用有效的全局变量。 如果在同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被“屏蔽”了,即它不起作用,此时局部变量是有效的。,例7.11有4个学生,5门课的成绩,要求输出其中的最高成绩以及它属于第几个学生、第几门课程。,解题思路: 在例7.10中,通过调用highest_score函数,得到最高分 除了输出最高分以

40、外,还要输出该分数是属于第几个学生、笫几门课的信息,即需要输出3个结果 调用一个函数只能得到一个函数值,因此例7.10程序无法解决这个问题 可以使用全局变量,通过全局变量从函数中得到所需要的值,#include int Row,Column; void main() float highest_score(float array45); float score45=61,73,85.5,87,90, 72,84,66,88,78,75,87,93.5,81,96, 65,85,64,76,71; printf(“he highest score is %6.2fn“, highest_scor

41、e(score); printf(“Student No.is %dn Course No. is %dn“,Row,Column); ,定义全局变量,float highest_score(float array45) int i,j; float max; max=array00; for(i=0;imax) max=arrayij; Row=i; Column=j; return (max); ,行的序号赋给全局变量Row,将列的序号赋给全局变量Column,score 函数调用 Row Column,array max Row Column,main 函数,highest_score

42、函数,建议不在必要时不要使用全局变量,全局变量,Row,Column,7.5.2 变量的存储方式和生存期,变量的生存期:变量值存在的时间 变量的两种存储方式:静态存储方式和动态存储方式 静态存储方式是指在程序运行期间由系统分配固定的存储空间的方式 动态存储方式是在程序运行期间根据需要进行动态的分配存储空间的方式,P195,7.5.2 变量的存储方式和生存期,全局变量采用静态存储方式,在程序开始执行时给全局变量分配存储区,程序执行完毕释放。在程序执行过程中它们占据固定的存储单元,而不是动态地进行分配和释放。,P195,7.5.2 变量的存储方式和生存期,在函数中定义的变量,在函数调用开始时分配动

43、态存储空间,函数结束时释放这些空间。在程序执行过程中,这种分配和释放是动态的。,P195,7.5.2 变量的存储方式和生存期,每一个变量和函数都有两个属性:数据类型和数据的存储类别 数据类型,如整型、浮点型等 存储类别指的是数据在内存中存储的方式(如静态存储和动态存储),P195,1.auto声明自动变量(auto变量) 函数中的形参和在函数中定义的变量(包括在复合语句中定义的变量),都属于此类 在调用该函数时,系统给这些变量分配存储空间,在函数调用结束时就自动释放这些存储空间。因此这类局部变量称为自动变量。 自动变量用关键字auto作存储类别的声明,int f(int a) auto int

44、 b,c=3; ,可以省略,2. static声明静态变量 以下情况需要指定static存储类别: 希望函数中的局部变量值在函数调用结束后不消失而继续保留原值,即其占用的存储单元不释放,在下一次该函数调用时,该变量已有值,就是上一次函数调用结束时的值。这时就应用关键字static指定该局部变量为“静态局部变量”。,例7.12 输出到的阶乘值。 解题思路: 可以编一个函数用来进行一次累乘 如第1次调用时进行1乘1 第2次调用时再乘以2 第3次调用时再乘以3 依此规律进行下去 这时希望上一次求出的连乘值保留,以便下一次再乘上一个数。可以用static。,#include void main() i

45、nt fac(int n); int i; for(i=1;i=5;i+) printf(“%d!=%dn”,i,fac(i); ,int fac(int n) static int f=1; f=f*n; return(f); ,调用五次,每调用一次,开辟新n,但f不是,#include void main() int fac(int n); int i; for(i=1;i=5;i+) printf(“%d!=%dn”,i,fac(i); ,int fac(int n) static int f=1; f=f*n; return(f); ,i=1:第一次调用,1,f,#include vo

46、id main() int fac(int n); int i; for(i=1;i=5;i+) printf(“%d!=%dn”,i,fac(i); ,int fac(int n) static int f=1; f=f*n; return(f); ,1,f,i=2:第二次调用,2,#include void main() int fac(int n); int i; for(i=1;i=5;i+) printf(“%d!=%dn”,i,fac(i); ,int fac(int n) static int f=1; f=f*n; return(f); ,f,i=3:第三次调用,2,6,#include void main() int fac(int n); int i; for(i=1;i=5;i+) printf(“%d!=%dn”,i,fac(i); ,int fac(int n) static int f=1; f=f*n; return(f); ,f,i=4:第四次调用,6,24,#include void main() int fac(int n); int i; for(i=1;i=5;i+) printf(“%d!=%dn”,i,fac(i); ,int fac(int n) static int f=1; f=f

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

当前位置:首页 > 其他


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