版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第12讲,多函数程序设计-2,2,上节重点,掌握多函数程序设计方法 理解为何定义多函数? 函数的定义、调用、声明格式 理解函数的调用过程(程序的执行过程),3,#include #define PI 3.14 float 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:); sca
2、nf(%f, ,问题,若这样起名会怎样?,会有错误提示,因为变量名与函数名相同导致了冲突。,4,#include #define PI 3.14 float 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, ,问题,若这样起名又会怎样?会冲突吗?,
3、不会,它们虽然是不同的r,但因为它们的作用域不同,所以不会产生冲突。,5,涉及的语法-变量的作用域,作用域:即作用范围 可分为: 局部变量 全局变量,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; pr
4、intf(i=%dn,i); j+; printf(i=%d,j=%dn,i,j); ,运行结果为: i=1,j=2 i=3,a=4 i=5 i=1,j=4,例,运行结果?,+是一个运算符,j+表示将j变量的值加1,8,例3,运行结果?,#include void swap(int a,int b); /* 函数声明 */ int a=3,b=5; void main( ) printf(11a=%d, b=%dn,a,b);/* 调用交换函数之前 */ swap( ); /* 调用交换函数swap */ printf(12a=%d, b=%dn,a,b);/* 调用交换函数之后 */ /*
5、函数定义:交换两个变量的值的函数 */ void swap( int a,int b ) int temp; printf(21 a=%d, b=%dn,a,b); /* 交换变量值之前 */ 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); /* 函数声明 */ vo
6、id main( ) printf(11 a=%d, b=%dn,a,b);/* 调用交换函数之前 */ swap(); /* 调用交换函数swap */ printf(12 a=%d, b=%dn,a,b);/* 调用交换函数之后 */ void swap(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); /* 交换变量值之后 */ ,虽然得以解决,但并不是一个好办
7、法! 为什么? 因为它破坏了函数的封闭性! 学指针的时候我们会学另外一种方法! 即便要用全局变量,一般也是在只读不写的时候才用!,10,全局变量,全局变量 在所有函数之外定义的变量 特点 默认作用范围:在源程序.c中,从定义它的位置以后都有效 在定义点之前或在其他.c文件中引用,应该进行如下声明: extern 类型名 变量名; 从程序运行起即占据内存,程序运行过程中可随时访问,程序退出时释放内存 使函数之间的数据交换更容易,也更高效 但是尽量少用,因为谁都可以改写全局变量,所以很难确定是谁改写了它 破坏了函数的独立性(封装性),11,例:使用全局变量解决,#include #define P
8、I 3.14 float 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; printf(please input r:); scanf(%f, ,r一旦被赋值,其值不再发生变化,只是拿来用。,12,#include int global;/*定义全局变量*/ void GlobalPlusPlus(void); v
9、oid main() global = 1; printf(Before GlobalPlusPlus(), it is %dn, global); GlobalPlusPlus(); printf(After GlobalPlusPlus(), it is %dn, global); /* 函数功能: 对全局变量global加1,并打印加1之前与之后的值 函数入口参数: 无 函数返回值: 无 */ void GlobalPlusPlus(void) printf(Before +, it is %dn, global); global+; printf(After +, it is %dn,
10、 global); ,例4-1,Before GlobalPlusPlus(), it is 1 Before +, it is 1 After +, it is 2 After GlobalPlusPlus(), it is 2,注意:全局变量具有记忆性 。,13,#include void GlobalPlusPlus(void); void main() int global = 1; printf(Before GlobalPlusPlus(), it is %dn, global); GlobalPlusPlus(); printf(After GlobalPlusPlus(), i
11、t 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 1 Before +, it is 1 After +, it is 2 After GlobalPlusPlus(), i
12、t is 1,14,另一个具有记忆性的变量类型:静态变量(static),一般的内部变量 在函数退出后失效,再次进入函数,变量值重新初始化 静态变量 在变量类型前面用static修饰 static int i; 变量存在静态存储区,当函数结束时,内存空间不被释放,因此,变量的值可以保存到下次进入函数,即变量具有记忆功能,15,涉及的语法-变量的存储类型,编译器为变量分配内存的方式 它决定变量的生存期,动态存储 根据需要临时分配存储空间,离开即释放 静态存储 在程序运行期间分配固定的存储空间不释放,内存分配,16,根据存储类型可分为,自动变量(auto) 静态变量(static) 寄存器变量(r
13、egister) 外部变量(extern),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
14、(s). Func() was called 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 vo
15、id Func(void); void main() int i; for (i=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). Fun
16、c() 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).,2,2,19,自动变量 (auto ),我们以前定义的那些变量,都默认是这种类型 自动体现在 进入语句块时自动申请内存,退出时自动释放内存 标准定义格式 auto 类型名 变量名; 特点: 动态局部变量 缺省的存储类型 不初始化时,值是不确定的,20,寄存器
17、变量(register),寄存器 CPU的内部容量很有限、但速度极快的存储器 使用频率比较高的变量声明为register ,可以使程序更小、执行速度更快 register 类型名 变量名; register int i; 现代编译器有能力自动把普通变量优化为寄存器变量,并且可以忽略用户的指定,所以一般无需特别声明变量为register,21,静态变量和全局变量,相同点:都是静态存储类型 自动初始化为0 都存储在静态存储区,整个程序运行期间一直占据内存 不同点:作用域不同 全局变量在所有的源程序文件中都可用 静态变量又分为静态局部变量和静态全局变量,作用域分别是所在函数和所在源文件,22,读程序
18、功能,#include double Fac(int n); void main() int i,n; double result; printf(please input n:); scanf(%d, ,程序功能: 求1-n的阶乘 分析: 虽然函数中只乘了一个数,但由于是static变量,所以“记住”了以前乘的结果,23,#include int 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
19、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以内成立(提示:至少应定义两个函数,一个判断素数,一个进行分解) 编写函数判断一个数是否是完数。再编写主函数找出
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025乌兰察布市第三批次企业人才需求96人笔试历年参考题库附带答案详解
- 2025中国建材所属企业招聘15人笔试历年参考题库附带答案详解
- 2025下半年四川成都成华科技创业投资有限公司招聘投资岗位工作人员1人笔试历年参考题库附带答案详解
- 广东佛山市新质高中联盟2025-2026学年第二学期高一年级期中联考试卷数学学科(含答案)
- 2026年奶茶店水果切配服务合同协议
- 2026年传统戏曲入门课程
- 2025模具配件厂(模具配件生产设备安装)合同
- 汽车机械基础课件 平面连杆机构的演化
- 新苏教版三年级数学下册第四单元《垃圾回收与利用》教案
- 2026年高等教育刑法试题及答案
- 2026深圳中考历史考前冲刺卷含答案
- 2026哈尔滨兰兴资产运营管理有限公司公开招聘备考题库(含答案详解)
- 卫生院信用管理工作制度
- 2026年新疆投资发展集团有限责任公司校园招聘笔试备考试题及答案解析
- 2026四川省现代种业发展集团成都农业开发有限公司社会化招聘拟人员笔试历年典型考点题库附带答案详解
- 物流公司运输调度工作流程
- 血液内科三基三严考试题库及答案
- 【《中国智能手机出口现状分析概述》3000字】
- DB43-T 3447-2025 烟花爆竹生产企业对标改造技术指南
- 电力系统概述课件
- 道路桥梁建设进展调研报告
评论
0/150
提交评论