




已阅读5页,还剩20页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第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:“); scanf(“%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“, ,问题,若这样起名又会怎样?会冲突吗?,不会,它们虽然是不同的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; printf(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); /* 函数声明 */ 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); /* 交换变量值之前 */ 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(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 类型名 变量名; 从程序运行起即占据内存,程序运行过程中可随时访问,程序退出时释放内存 使函数之间的数据交换更容易,也更高效 但是尽量少用,因为谁都可以改写全局变量,所以很难确定是谁改写了它 破坏了函数的独立性(封装性),11,例:使用全局变量解决,#include #define pi 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); void 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“, 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(), 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 1 before +, it is 1 after +, it is 2 after globalplusplus(), it is 1,14,另一个具有“记忆性“的变量类型:静态变量(static),一般的内部变量 在函数退出后失效,再次进入函数,变量值重新初始化 静态变量 在变量类型前面用static修饰 static int i; 变量存在静态存储区,当函数结束时,内存空间不被释放,因此,变量的值可以保存到下次进入函数,即变量具有记忆功能,15,涉及的语法 -变量的存储类型,编译器为变量分配内存的方式 它决定变量的生存期,动态存储 根据需要临时分配存储空间,离开即释放 静态存储 在程序运行期间分配固定的存储空间不释放,内存分配,16,根据存储类型可分为,自动变量(auto) 静态变量(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 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 void 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). 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).,2,2,19,自动变量 (auto ),我们以前定义的那些变量,都默认是这种类型 “自动“体现在 进入语句块时自动申请内存,退出时自动释放内存 标准定义格式 auto 类型名 变量名; 特点: 动态局部变量 缺省的存储类型 不初始化时,值是不确定的,20,寄存器变量(register),寄存器 cpu的内部容量很有限、但速度极快的存储器 使用频率比较高的变量声明为register ,可以使程序更小、执行速度更快 register 类型名 变量名; 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“, ,程序功能: 求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 square(int i) return i*i;,读程序结果,2,1,6,2,42,3,输出结果:,2,6,3,42,注意:搞
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 手动工具制作工工艺考核试卷及答案
- 集团管理考试试题及答案
- 紫胶色素工知识考核试卷及答案
- 医院停氧、停电应急预案考试试题及答案
- 消防基础理论中级题库及答案
- 2024年中级消防设施操作员证考试题库及答案
- 2025年民营医院聘用合同书7篇
- 2025上半年中小学教师资格证考试真题试卷及答案
- 印染前处理工成本预算考核试卷及答案
- 精密电成型网工成本控制考核试卷及答案
- 鼻炎的培训知识课件
- 剖宫产术后腹胀护理
- 前列腺增生科普课件
- 项目部商务管理办法
- 2025重庆医科大学附属第一医院(编制外)招聘18人考试参考试题及答案解析
- 精麻药品培训知识课件
- 2025细胞与基因治疗科研领域蓝皮书
- 2025年财务核算招聘笔试模拟题
- 2025年高考语文全国二卷真题拓展:语言文字运用“衔接+感情色彩+关联词语+错别字”
- 2025年司法考试题库(附答案)
- 铁路客运市场营销现状分析及策略优化
评论
0/150
提交评论