版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第5章 函 数2019年3月1主要内容 5.1 概述5.2 函数的定义与调用5.3 数组作函数参数5.4 函数的嵌套调用和递归调用5.5 局部变量和全局变量及其作用域5.6 变量的存储类别及变量的生存期5.7 函数的存储分类2019年3月25.1 概述 程序结构清晰,可读性好。 减少重复编码的工作量。 可多人共同编制一个大程序,缩短程序设计周期,提高程序设计和调试的效率。使用函数的好处C程序源程序文件n函数1函数m 源程序文件1函数1函数n2019年3月3【例5.1】求一个整数的立方。int cube (int x) /* 函数定义 */ return (x * x * x); main( )
2、 int f, a; printf(nEnter an integer number:); scanf(%d, &a); f = cube (a); printf(%d * %d * %d = %dn, a, a, a, f);程序运行情况如下:Enter an integer number:22 * 2 * 2 = 8函数调用程序的执行总是从main函数开始2019年3月4 一个C源程序可以由一个或多个源程序文件组成。C编译系统在对C源程序进行编译时是以文件为单位进行的。 一个C源程序文件可以由一个或多个函数组成。所有函数都是独立的。主函数可以调用其它函数,其它函数可以相互调用。 在一个C程
3、序中,有且仅有一个主函数main。C程序的执行总是从main函数开始,调用其它函数后最终回到main函数,在main函数中结束整个程序的运行。说明2019年3月5 函数的种类从函数定义形式分: 有参函数:在主调(用)函数和被调(用)函数之间通过参数进行数据传递, 如: int cube (int x) 无参函数:如:getchar( )在调用无参函数时,主调函数不需要将数据传递给无参函数。从使用的角度看: 标准函数(库函数)库函数是由系统提供的。如:getchar( )、sin(x)等。在程序中可以直接调用它们。附录3列出了C的部分库函数。 用户自定义函数。如:例5.1中的cube函数。201
4、9年3月6【例5.2】无参函数的定义与调用。void welcome ( ) printf(*n); printf( Welcome to China n); printf(*n);main( ) welcome( ); 程序的输出结果如下:* Welcome to China*2019年3月75.2.1 函数的定义函数定义的一般形式函数类型 函数名(类型名 形式参数1, ) 说明语句 执行语句例如:求两个数的最大值。 int max(int x,int y) int z; z = x y ? x : y; return( z );类型省略时默认为int类型没有形式参数为无参函数 2019年3
5、月8int max(x,y)int x,y; int z; z = x y ? x : y; return( z );int max(x,y) int x,y;或int max(int x,y) 或int max(x,y)int x,y,z; z = x y ? x : y; return( z );花括号中也可以为空,这种函数叫空函数 。不能在函数体内定义其他函数,即函数不能嵌套定义。形参也可以这样定义如下定义都是错误的 2019年3月9函数名(实参表列)在C语言中,把函数调用也作为一个表达式。因此凡是表达式可以出现的地方都可以出现函数调用。例如: welcome( ); if (iabs
6、(a)max) max=iabs(a); m=max(c,max(a,b);5.2.2 函数的调用函数调用的一般形式:2019年3月10int sum100( ) int i,t=0; for (i=1; i=100; i+) t+=i; return (t);main( ) int s; s=sum100( ); printf(%dn, s);程序输出结果:5050int sum ( int x ) int i,t=0; for (i=1; iy?x:y; return (z); /* 返回z的值 */main( ) int a,b,c; scanf(%d,%d,&a,&b); c=max(
7、a,b); printf(max is %dn,c);2019年3月15函数的返回值是通过return语句带回到主调函数的功能:终止函数的运行,返回主调函数,若有返回值,将返回值带回主调函数。说明: 若函数没有返回值,return语句可以省略。 return语句中的表达式类型一般应和函数的类型一致,如果不一致,系统自动将表达式类型转换为函数类型。 函数的返回值return 语句格式:return (表达式); 或 return 表达式 ;或 return;2019年3月16【例5.8】计算并输出圆的面积。s(int r) return 3.14*r*r;main( ) int r,area;
8、scanf(%d,&r); printf(%dn,s(r);自动转换为int型 思考:若要得到单精度实型的圆面积,程序应如何修改程序运行情况如下:212?2019年3月17 5.2.4 对被调函数的声明和函数原型变量要先定义后使用,函数也如此。即被调函数的定义要出现在主调函数的定义之前。如swap函数:允许整型函数(且参数也是整型)的定义出现在主调函数之后。如max函数:如果非整型函数在主调函数之后定义,则应在主调函数中或主调函数之前对被调函数进行声明。void swap(int x, int y) main( ) swap(a,b); main( ) c=max(a,b);max(int x
9、,int y) 2019年3月18对被调函数进行声明的一般形式 函数类型 函数名(参数类型1 参数名1,);或 函数类型 函数名(参数类型1,参数类型2,);思考:以下哪种情况需要在主调函数中对被调函数声明被调函数定义在前,主调函数定义在后。主调函数定义在前,被调函数定义在后。第二种形式省略了参数名,此种形式也称为函数的原型。?2019年3月19main( ) void calc(float x,float y,char opr); float a,b; char opr; printf(nInput expression:); scanf(%f%c%f,&a,&opr,&b); calc(a
10、,b,opr);void calc(float x,float y,char opr) switch(opr) case +:printf(%5.2f%c%5.2f=%6.2fn,x,opr,y,x+y);return; case -:printf(%5.2f%c%5.2f=%6.2fn,x,opr,y,x-y);return; case *:printf(%5.2f%c%5.2f=%6.2fn,x,opr,y,x*y);return; case /:printf(%5.2f%c%5.2f=%6.2fn,x,opr,y,x/y);return; default :printf(Operator
11、 err! n); 对被调函数的声明【例5.9】计算并输出两个数的和、差、积、商。2019年3月205.3 数组作函数参数5.3.1 一维数组元素作函数参数main( ) int a5,i,m ; for (i=0; i5; i+) scanf(%d,&ai); m=a0; for (i=1; i5; i+) m=min(m,ai); printf(%dn, m);【例5.11】求5个数中的最小值。int min(int x, int y) return (xy?x:y); 用打擂台方法求最小值。m相当于擂主2019年3月215.3.2 一维数组名作函数参数数组名表示数组在内存中的起始地址。
12、例如:数组a在内存中从2000地址开始存放,则a的值为2000。2000是地址值,是指针类型的数据(后面将介绍指针类型),不能把它看成是整型或其他类型数据。实参是数组名,形参也应定义为数组形式,形参数组的长度可以省略,但 不能省,否则就不是数组形式了。 【例.12】用冒泡法将10个整数排序。2019年3月22void sort(int b ,int n); void printarr(int b ); main( ) int a10 = 11,22,63,97,58,80,45, 32,73,36; printf(Before sort:n); printarr(a); sort(a,10);
13、 printf(After sort:n); printarr(a);void printarr(int b10) int i; for (i=0; i10; i+) printf(%5d,bi); printf(n);void sort(int b , int n) int i,j,t; for (i=1; in; i+) for (j=0; jbj+1) t=bj;bj=bj+1;bj+1=t; 2019年3月23 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 b0 b1 b2 b3 b4 b5 b6 b7 b8 b911 22 63 97 58 80 45 32 73 36
14、(a) 排序前a0 a1 a2 a3 a4 a5 a6 a7 a8 a9b0 b1 b2 b3 b4 b5 b6 b7 b8 b911 22 32 36 45 58 63 73 80 97(b) 排序后图7.3 调用sort函数2000b形参 b 实际是一个可以存放地址的变量a:2000实参赋给形参首地址: 2000首地址: 20002019年3月24#include stdio.hmain( ) void scat(char str1 ,char str2 ); char s150,s250; int i,k; printf(Input s1:); gets(s1); printf(Inpu
15、t s2:); gets(s2); scat(s1,s2); printf(Output s1:%sn,s1); printf(Output s2:%sn,s2);void scat(char str1 ,char str2 ) int i=0,k=0; while (str1i!=0) i+; while (str2k!=0) str1i=str2k; i+; k+; str1i=0;scat函数还可简化为:void scat(char str1 ,char str2 ) int i=0,k=0; while (str1i) i+; while (str1i+=str2k+);【例5.13】
16、编程序,实现字符串连接。2019年3月255.4 函数的嵌套调用和递归调用main函数 调用函数 A; 函数 A 调用函数 B; 函数 B 5.4.1 函数的嵌套调用2019年3月26【例5.15】函数的嵌套调用main( ) int n=3; printf (%dn,sub1(n); sub1(int n) int i,a=0; for (i=n; i0; i-) a+=sub2(i); return a ; sub2(int n) return n+1; 程序输出结果:9 2019年3月275.4.2 函数的递归调用1递归的基本概念递归调用:一个函数直接或间接地调用了它本身,就称为函数的递
17、归调用。递归函数:在函数体内调用该函数本身。int sub(int x) int y,z; if( ) z=sub(y); else return ;例如:直接调用sub函数本身2019年3月282递归函数的执行过程【例5.16】编一递归函数求n!。思路:以求4的阶乘为例:4!=4*3!,3!=3*2!,2!=2*1!,1!=1,0!=1。递归结束条件:当n=1或n=0时,n!=1。递归公式:n! =1 (n=0, 1)n(n-1)! (n1)2019年3月29程序如下:float fact (int n) float f=0; if(n0) printf(n0)再找出递归结束条件:当n=0时
18、,xn=1。2019年3月32程序如下:long xn(int x,int n) long f=0; if (n0) printf(n0,data error!n); else if (n=0) f=1; else f=x*xn(x,n-1); return (f);main( ) int n,x; long y; scanf(%d,%d,&x,&n); y=xn(x,n); printf(%ldn,y);程序运行情况如下:2,1010242019年3月335.5 局部变量和全局变量及其作用域5.5.1 变量的作用域5.5.2 局部变量及其作用域变量的作用域:变量在程序中可以被使用的范围。根据
19、变量的作用域可以将变量分为局部变量和全局变量。局部变量(内部变量):在函数内或复合语句内定义的变量以及形参。作用域:函数内或复合语句内。【例5.19】分析下面程序的运行结果及变量的作用域。问题:一个变量在程序的哪个函数中都能使用吗?2019年3月34void sub(int a,int b) int c; a=a+b; b=b+a; c=b-a;printf(sub:ta=%d b= %d c= %dn,a,b,c); 局部变量main( ) int a=1,b=1,c=1; printf(main:ta=%d b= %d c= %dn,a,b,c); sub(a,b); printf(mai
20、n:ta=%d b= %d c= %dn,a,b,c); int a=2,b=2; printf(comp:ta=%d b= %d c= %dn,a,b,c); printf(main:ta=%d b= %d c= %dn,a,b,c); 局部变量局部变量“分程序”或“程序块”程序输出结果:main: a=1 b= 1 c= 1sub: a=2 b= 3 c= 1main: a=1 b= 1 c= 1comp: a=2 b= 2 c= 1main: a=1 b= 1 c= 12019年3月355.5.3 全局变量及其作用域全局变量(外部变量):在函数外部定义的变量。作用域:从定义变量的位置开始
21、到本源文件结束。如在其作用域内的函数或分程序中定义了同名局部变量,则在局部变量的作用域内,同名全局变量暂时不起作用。【例5.20】全局变量和局部变量的作用域。2019年3月36int a = 5;void f(int x, int y) int b,c; b=a+x; c=a-y;printf(%dt%dt%dn,a,b,c); 局部变量main( ) int b=6,c=7; f(b,c); printf(%dt%dt%dn,a,b,c); int a=9,b=8; printf(%dt%dt%dn,a,b,c); c=10; printf(%dt%dt%dn, a,b,c); printf
22、(%dt%dt%dn,a,b,c); printf(%dt%dt%dn,a,b,c); 局部变量局部变量程序输出结果:5 11 -25 6 79 8 79 8 109 8 105 6 10全局变量2019年3月375.6 变量的存储类别及变量的生存期5.6.1 变量的生存期与变量的存储分类变量的生存期:变量在内存中占据存储空间的时间。思考:1. 何时为变量分配内存单元? 2. 将变量分配在内存的什么区域? 3. 变量占据内存的时间(生存期)?程序代码区静态存储区动态存储区存储分配动态存储变量静态存储变量2019年3月385.6.2 变量的存储类别变量的属性数据类型:决定为变量分配内存单元的长度
23、,数据的存放形式,数的范围。存储类别:决定了变量的生存期,给它分配在哪个存储区。2019年3月39变量定义语句的一般形式存储类别 数据类型 变量名1, , 变量名n ;auto(自动的) register(寄存器的)static(静态的) extern(外部的)1自动变量(auto类别) 局部变量可以定义为自动变量。main()int x,y; main()auto int x,y; 自动变量等价可省2019年3月40 内存分配调用函数或执行分程序时在动态存储区为其分配存储单元,函数或分程序执行结束,所占内存空间即刻释放。 变量的初值定义变量时若没赋初值,变量的初值不确定;如果赋初值则每次函数
24、被调用时执行一次赋值操作。 生存期 在函数或分程序执行期间。 作用域自动变量所在的函数内或分程序内。自动变量2019年3月412静态变量(static类别)除形参外,局部变量和全局变量都可以定义为静态变量。局部静态变量(或称内部静态变量)全局静态变量(或称外部静态变量)静态变量静态变量static int a; main( ) float x,y; f( ) static int b=1; 全局静态变量局部静态变量自动变量不能省2019年3月42 内存分配编译时,将其分配在内存的静态存储区中,程序运行结束释放该单元。 静态变量的初值若定义时未赋初值,在编译时,系统自动赋初值为0;若定义时赋初值
25、,则仅在编译时赋初值一次,程序运行后不再给变量赋初值 。 生存期整个程序的执行期间。 作用域局部静态变量的作用域是它所在的函数或分程序。全局静态变量的作用域是从定义处开始到本源文件结束。静态变量2019年3月43int c;static int a; main( ) float x,y; char s;f( ) static int b=1; 3.外部变量(extern类别)在函数外定义的变量若没有用 static说明,则是外部变量。外部变量只能隐式定义为extern类别,不能显式定义。全局静态变量自动变量局部静态变量外部变量2019年3月44 内存分配编译时,将其分配在静态存储区,程序运行结
26、束释放该单元。 变量的初值若定义变量时未赋初值,在编译时,系统自动赋初值为0。 生存期整个程序的执行期间。 作用域从定义处开始到本源文件结束。外部变量问题:全局静态变量的作用域可以扩展到本程序的其它文件吗?此外,还可以用extern进行声明,以使其作用域扩大到该程序的其它文件中。2019年3月45外部变量声明的一般格式 extern 数据类型 变量名1,变量名n;或 extern 变量名1,变量名n;注意:外部变量声明用关键字extern,而外部变量的定义不能用extern,只能隐式定义。定义外部变量时,系统要给变量分配存储空间,而对外部变量声明时,系统不分配存储空间,只是让编译系统知道该变量是一个已经定义过的外部变量,与函数声明的作用类似。2019年3月46int p=1,q=5; float f1(int a) extern char c1,c2; char c1,c2; char f2(int x,int y) main( ) 外部变量声明定义外部变量定义外部变量思考:在f1函数中声明c1、c2的作用是什么?如何修改程序使所有函数都可以使用外部变量而又不需要声明?【例5.24】在一个文件内声明外部变量。20
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 淮阴师范学院《分离工程》2022-2023学年第一学期期末试卷
- 2023年黑龙江省绥化市望奎县住房和城乡建设局公务员考试《行政职业能力测验》历年真题及详解
- 淮阴师范学院《灯光照明艺术与技术》2022-2023学年第一学期期末试卷
- 淮阴师范学院《BIM实务》2023-2024学年第一学期期末试卷
- 淮阴工学院《液压与气压传动》2023-2024学年第一学期期末试卷
- 淮阴工学院《图形创意》2021-2022学年第一学期期末试卷
- 2024-2025学年北师版八年级数学上学期 期中综合模拟测试卷1
- 儿童语言发展与教育策略考核试卷
- 水利工程在渔业发展中的贡献与支持考核试卷
- 危险品仓储纸制品管理考核试卷
- 初中语文人教七年级上册要拿我当一挺机关枪使用
- 人教版数学三年级上册《分数的初步认识》课件 (共7张PPT)
- 5000吨每年聚丙烯酰胺工艺流程图
- DB64∕T 1754-2020 宁夏砖瓦用粘土矿产地质勘查技术规程
- PSUR模板仅供参考
- 火力发电企业作业活动风险分级管控清单(参考)
- 《锅炉水容积测试技术规范》团体标准
- 全国第四轮学科评估PPT幻灯片课件(PPT 24页)
- 子宫内膜息肉-PPT课件
- 桥梁施工各工序质量控制措施
- 保安队排班表
评论
0/150
提交评论