多函数程序设计教学PPT.ppt

上传人:仙人指路1688 文档编号:2221236 上传时间:2023-02-02 格式:PPT 页数:25 大小:183.50KB
返回 下载 相关 举报
多函数程序设计教学PPT.ppt_第1页
第1页 / 共25页
多函数程序设计教学PPT.ppt_第2页
第2页 / 共25页
多函数程序设计教学PPT.ppt_第3页
第3页 / 共25页
多函数程序设计教学PPT.ppt_第4页
第4页 / 共25页
多函数程序设计教学PPT.ppt_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《多函数程序设计教学PPT.ppt》由会员分享,可在线阅读,更多相关《多函数程序设计教学PPT.ppt(25页珍藏版)》请在三一办公上搜索。

1、第12讲,多函数程序设计-2,2,上节重点,掌握多函数程序设计方法理解为何定义多函数?函数的定义、调用、声明格式理解函数的调用过程(程序的执行过程),3,#include#define PI 3.14float l(float);/*函数声明*/float s(float);/*函数声明*/float l(float r)/*函数定义:求周长*/return PI*r*2;float s(float r)/*函数定义:求面积*/return PI*r*r;void main()float r,l,s;printf(please input r:);scanf(%f,问题,若这样起名会怎样?,会

2、有错误提示,因为变量名与函数名相同导致了冲突。,4,#include#define PI 3.14float l(float);/*函数声明*/float s(float);/*函数声明*/float l(float r)/*函数定义:求周长*/return PI*r*2;float s(float r)/*函数定义:求面积*/return PI*r*r;void main()float r,cir,area;printf(please input r:);scanf(%f,问题,若这样起名又会怎样?会冲突吗?,不会,它们虽然是不同的r,但因为它们的作用域不同,所以不会产生冲突。,5,涉及的语

3、法-作用域,作用域:即作用范围可分为:局部变量全局变量,6,局部变量,局部变量在语句块内(即 内)定义的变量形式参数也是局部变量特点定义时不会自动初始化,除非程序员指定初值进入语句块时获得内存,仅能由语句块内语句访问,退出语句块时释放内存,不再有效 并列语句块各自定义的同名变量互不干扰,7,void main()int i=1,j=2;printf(i=%d,j=%dn,i,j);int i=3,a=4;printf(i=%d,a=%dn,i,a);j+;int i=5;printf(i=%dn,i);j+;printf(i=%d,j=%dn,i,j);,运行结果为:i=1,j=2i=3,a=

4、4i=5i=1,j=4,例,运行结果?,+是一个运算符,j+表示将j变量的值加1,8,例3,运行结果?,#include void swap(int a,int b);/*函数声明*/void main()int a=3,b=5;printf(11a=%d,b=%dn,a,b);/*调用交换函数之前*/swap(a,b);/*调用交换函数swap*/printf(12a=%d,b=%dn,a,b);/*调用交换函数之后*/*函数定义:交换两个变量的值的函数*/void swap(int a,int b)int temp;printf(21 a=%d,b=%dn,a,b);/*交换变量值之前*/

5、temp=a;a=b;b=temp;/*交换器:交换变量x,y的值*/printf(22 a=%d,b=%dn,a,b);/*交换变量值之后*/,3,5,3,实参a,b的值没发生变化!单向值传递!即由实参向形参的方向传递数值!而不会朝相反的方向!,9,如何用全局变量解决例3,#include int a=3,b=5;void swap(void);/*函数声明*/void main()printf(11 a=%d,b=%dn,a,b);/*调用交换函数之前*/swap();/*调用交换函数swap*/printf(12 a=%d,b=%dn,a,b);/*调用交换函数之后*/void swap

6、(void)/*函数定义,没有参数*/int temp;printf(21 a=%d,b=%dn,a,b);/*交换变量值之前*/temp=a;a=b;b=temp;/*交换变量a,b的值*/printf(22 a=%d,b=%dn,a,b);/*交换变量值之后*/,虽然得以解决,但并不是一个好办法!为什么?因为它破坏了函数的封闭性!学指针的时候我们会学另外一种方法!即便要用全局变量,一般也是在只读不写的时候才用!,10,全局变量,全局变量在所有函数之外定义的变量特点默认作用范围:在源程序.c中,从定义它的位置以后都有效在定义点之前或在其他.c文件中引用,应该进行如下声明:extern 类型名

7、 变量名;从程序运行起即占据内存,程序运行过程中可随时访问,程序退出时释放内存 使函数之间的数据交换更容易,也更高效但是尽量少用,因为谁都可以改写全局变量,所以很难确定是谁改写了它破坏了函数的独立性(封装性),11,例:使用全局变量解决,#include#define PI 3.14float r;float l(void);/*函数声明*/float s(void);/*函数声明*/float l(void)/*函数定义:求周长*/return PI*r*2;float s(void)/*函数定义:求面积*/return PI*r*r;void main()float cir,area;pr

8、intf(please input r:);scanf(%f,r一旦被赋值,其值不再发生变化,只是拿来用。,12,#include int global;/*定义全局变量*/void GlobalPlusPlus(void);void main()global=1;printf(Before GlobalPlusPlus(),it is%dn,global);GlobalPlusPlus();printf(After GlobalPlusPlus(),it is%dn,global);/*函数功能:对全局变量global加1,并打印加1之前与之后的值 函数入口参数:无 函数返回值:无*/voi

9、d GlobalPlusPlus(void)printf(Before+,it is%dn,global);global+;printf(After+,it is%dn,global);,例4-1,Before GlobalPlusPlus(),it is 1Before+,it is 1After+,it is 2After GlobalPlusPlus(),it is 2,注意:全局变量具有记忆性。,13,#include void GlobalPlusPlus(void);void main()int global=1;printf(Before GlobalPlusPlus(),it

10、is%dn,global);GlobalPlusPlus();printf(After GlobalPlusPlus(),it is%dn,global);/*函数功能:对局部变量global加1,并打印加1之前与之后的值 函数入口参数:无 函数返回值:无*/void GlobalPlusPlus(void)int global=1;printf(Before+,it is%dn,global);global+;printf(After+,it is%dn,global);,例4-2,Before GlobalPlusPlus(),it is 1Before+,it is 1After+,it

11、 is 2After GlobalPlusPlus(),it is 1,14,另一个具有记忆性的变量类型:静态变量(static),一般的内部变量在函数退出后失效,再次进入函数,变量值重新初始化静态变量在变量类型前面用static修饰static int i;变量存在静态存储区,当函数结束时,内存空间不被释放,因此,变量的值可以保存到下次进入函数,即变量具有记忆功能,15,涉及的语法-变量的存储类型,编译器为变量分配内存的方式它决定变量的生存期,动态存储根据需要临时分配存储空间,离开即释放静态存储在程序运行期间分配固定的存储空间不释放,内存分配,16,根据存储类型可分为,自动变量(auto)静

12、态变量(static)寄存器变量(register),17,例5-1(静态变量),#include void Func(void);void main()int i;for(i=0;i10;i+)Func();/*函数功能:打印被调用的次数 函数入口参数:无 函数返回值:无*/void Func(void)static int times=1;/*静态局部变量 函数结束时times变量仍然占据静态存储区的存储空间,不释放*/printf(Func()was called%d time(s).n,times+);,Func()was called 1 time(s).Func()was call

13、ed 2 time(s).Func()was called 3 time(s).Func()was called 4 time(s).Func()was called 5 time(s).Func()was called 6 time(s).Func()was called 7 time(s).Func()was called 8 time(s).Func()was called 9 time(s).Func()was called 10 time(s).,2,3,10,18,例5-2(非静态变量),#include void Func(void);void main()int i;for(i

14、=0;i10;i+)Func();/*函数功能:打印被调用的次数 函数入口参数:无 函数返回值:无*/void Func(void)int times=1;printf(Func()was called%d time(s).n,times+);,Func()was called 1 time(s).Func()was called 1 time(s).Func()was called 1 time(s).Func()was called 1 time(s).Func()was called 1 time(s).Func()was called 1 time(s).Func()was calle

15、d 1 time(s).Func()was called 1 time(s).Func()was called 1 time(s).Func()was called 1 time(s).,2,2,19,自动变量(auto),我们以前定义的那些变量,都默认是这种类型自动体现在进入语句块时自动申请内存,退出时自动释放内存 标准定义格式 auto 类型名 变量名;特点:动态局部变量缺省的存储类型不初始化时,值是不确定的,20,寄存器变量(register),寄存器CPU的内部容量很有限、但速度极快的存储器使用频率比较高的变量声明为register,可以使程序更小、执行速度更快register 类型名

16、 变量名;register int i;现代编译器有能力自动把普通变量优化为寄存器变量,并且可以忽略用户的指定,所以一般无需特别声明变量为register,21,静态变量和全局变量,相同点:都是静态存储类型自动初始化为0都存储在静态存储区,整个程序运行期间一直占据内存不同点:作用域不同全局变量在所有的源程序文件中都可用静态变量又分为静态局部变量和静态全局变量,作用域分别是所在函数和所在源文件,22,读程序功能,#include double Fac(int n);void main()int i,n;double result;printf(please input n:);scanf(%d,

17、程序功能:求1-n的阶乘分析:虽然函数中只乘了一个数,但由于是static变量,所以“记住”了以前乘的结果,23,#includeint square(int i);void main()int i=0;i=square(i);for(;i3;i+)static int i=1;i+=square(i);printf(%d,i);printf(%dn,i);int square(int i)return i*i;,读程序结果,2,1,6,2,42,3,输出结果:,2,6,3,42,注意:搞清楚三个I的作用域和存储类型。,24,小结2,按变量作用域,可分为局部变量和全局变量。一般情况下用局部变量,局部变量可以重名,不冲突,但各自为政。极少情况下,当需要考虑到数据的一致性时可以用全局变量。全局变量具有记忆性,所以,一般不随意修改它的值。按存储类型分:可分为auto、static、register变量。static 具有记忆性,一般用做局部变量。auto、register一般不用。,25,作业,编写函数验证哥德巴赫猜想在1000以内成立(提示:至少应定义两个函数,一个判断素数,一个进行分解)编写函数判断一个数是否是完数。再编写主函数找出所有的完数。,

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

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号