




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第六章 函数与宏定义 6.1 函数概念 6.2 变量作用域和存储类型 6.3 内部函数与外部函数 6.4 递归函数设计和调用 6.6 综合范例 10/10/1第1页第1页6.1 函数概念 C语言允许把问题设计成一个一个模块,程序通过调用模块功效来处理问题。这些模块通常都是通过函数来实现,又可称其为函数模块。 C语言中,函数可分为两类 :一类是由系统定义原则函数,又称为库函数,其函数申明普通是放在系统include目录下以.h为后缀头文献中,如在程序中要用到某个库函数,必须在调用该函数之前用#include命令将库函数信息包括到本程序中。另一类函数是自定义函数 ,两种形式: 第一个:函数申明、函
2、数调用、函数定义。第二种:函数定义、函数调用。10/10/2第2页第2页 6.1.1 函数定义 函数定义普通形式能够有两种。形式一: 存储类型符 返回值类型符 函数名(形参阐明表) 函数语句体 形式二: 存储类型符 返回值类型型符 函数名(形参表) 形参阐明; 函数语句体 10/10/3第3页第3页阐明: 1存储类型符指是函数作用范围,它只有两种形式:static和extern。 static阐明函数只能作用于其所在源文献,用static阐明函数又称为内部函数。extern阐明函数可被其它源文献中函数调用,用extern阐明函数,又称为外部函数。缺省情况为extern。 2返回值类型符指是函数
3、体语句执行完毕后,函数返回值类型,如int, float, char等等,若函数无返回值,则用空类型void来定义函数返回值。缺省情况为int型。10/10/4第4页第4页3函数名由任何合法标识符构成。提议将函数名命名与函数内容有一定关系。4在第一个函数定义形式中,形参阐明表是一系列用逗号分开每个形参变量阐明。如:int x, int y, int z这表示形参变量有三个:x, y, z。它们类型都是int型。 在第二种函数定义形式中,形参表是一系列用逗号分开形参变量。如:x, y, z 5函数语句体是放在一对花括号 中,由局部数据类型描述和功效实现两部分构成。 10/10/5第5页第5页6函
4、数返回语句形式有下列两种:函数无返回值情况:return;函数有返回值情况:return(表示式值);在第种情况下要注意“表示式值”类型必须与函数返回值类型相一致。比如:求两个任意整数绝对值和,用函数abs_sum()实现。/*直接调用库函数来计算m和n绝对值 */int abs_sum(int m, int n) return (abs(m)+abs(n); /*函数abs()是在头文献math.h中申明*/ 10/10/6第6页第6页函数定义下列:int abs_sum(int m, int n) if (m0) m=-m; if(n0) n=-n; return(m+n);6.1.2 函
5、数申明和调用 一函数申明函数申明普通形式:存储类型符 返回值类型符 函数名(形参阐明表);如:int abs-sun(int m, int n);10/10/7第7页第7页二函数调用函数调用是通过函数调用语句来实现,分两种形式:无返回值情况: 函数名(实参表);有返回值情况: 变量名函数名(实参表);该变量名类型必须与函数返回值类型相同。函数调用时都会去执行函数语句中内容,函数执行完毕后,回到函数调用处,继续执行下面语句。10/10/8第8页第8页6.1.3 函数传值方式 函数传值方式: 采用实参表将每一个实参值相应地传递给每一个形参变量,形参变量在接受到实参表传过来值时,会在内存暂时开辟新空
6、间,以保留形参变量值,当函数执行完毕时,这些暂时开辟内存空间会被释放,并且形参值在函数中无论是否发生改变,都不会影响到实参变量值改变,这就是函数传值方式。自定义函数在程序中使用顺序有两种形式: 先进行函数申明,再进行函数调用,函数定义放在函数调用之后。函数申明在函数调用之前。 函数定义放在函数调用之前。10/10/9第9页第9页【例6-1】 编程序,通过调用函数abs-sum(),求任意两个整数绝对值和。/*exam6_1.c 调用函数求两整数绝对值和*/#include int abs_sum(int m,int n);main()int x,y,z;scanf(%d%d,&x,&y);z=
7、abs_sum(x,y);printf(sum is %d,z);int abs_sum(int m,int n)if(m0)m=-m;if(n0)n=-n;return m+n;程序运营结果:7 12sum is 1910/10/10第10页第10页用传值方式调用函数时,实参也能够是函数调用语句 【例6-2】求任意三个数绝对值和。/*exam6_2.c 调用函数求三个整数绝对值和*/#include int abs_sum(int m,int n);main()int x,y,z,sum;scanf(%d%d%d,&x,&y,&z);sum=abs_sum(abs_sum(x,y),z);p
8、rintf(sum is %d,sum);int abs_sum(int m,int n)if(m0)m=-m;if(n0)n=-n;return m+n;程序运营结果:7 12 5sum is 2410/10/11第11页第11页注意: 对于有返回值函数,调用时若没有把它赋给某个变量,仍然是能够,只是函数返回值有也许会被丢失。【例6-3】 求任意两数乘积。自定义一个函数mul(),用于求两数乘积,程序:/*exam6_3.c 求两个数乘积*/#include float mul(float a,float b);main()float x,y,z;scanf(%f %f,&x,&y);z=m
9、ul(x,y); /* */x=x+10;y=y-10;mul(x,y); /* */10/10/12第12页第12页x=x*2;y=y*2;printf(z=%f,mul(%f,%f)=%fn,z,x,y,mul(x,y); /* */float mul(float a,float b)return a*b;程序运营结果:5 6z=30.000000,mul(30.000000,-8.000000)=-240.00000010/10/13第13页第13页程序阐明: 注释处调用函数后返回值赋给变量z。 注释处调用函数后返回值没有赋给任何变量,函数返回值被丢失。 注释处调用函数后返回值成为了pr
10、intf()函数参数。10/10/14第14页第14页6.2 变量作用域和存储类型 一变量作用域 变量作用域:指是变量有效范围,针对变量不同作用域,可把变量分为局部变量和全局变量。局部变量:在函数内部或某个控制块内部定义变量为局部变量,局部变量有效范围只限于本函数内部,退出函数,该变量自动失效。 全局变量:在函数外面定义变量称为全局变量,全局变量作用域是从该变量定义位置开始,直到源文献结束。在同一文献中所有函数都能够引用全局变量。 10/10/15第15页第15页局部变量和全局变量作用域如图所表示:10/10/16第16页第16页【例6-4】 变量作用域应用举例,阅读下面程序,注意区别局部变量
11、和全局变量作用域。/*exam6_4.c 变量作用域举例*/#include void a( void );void b( void );void c( void );int x = 1;main()int x = 5;printf(local x in outer scope of main is %dn, x );10/10/17第17页第17页int x = 7;printf( local x in inner scope of main is %dn, x );printf( local x in outer scope of main is %dn, x );a();b();c();
12、a();b();c();前三次输出结果:local x in outer scope of main is 5local x in inner scope of main is 7local x in outer scope of main is 510/10/18第18页第18页printf( local x in main is %dn, x );getchar();return 0;void a( void )int x = 25;printf( nlocal x in a is %d after entering an, x );+x;printf( local x in a is %
13、d before exiting an, x );10/10/19第19页第19页void b( void ) static int x = 50; printf( nlocal static x is %d on entering bn, x ); +x; printf( local static x is %d on exiting bn, x );void c( void )printf( nglobal x is %d on entering cn, x );x *= 10;printf( global x is %d on exiting cn, x );10/10/20第20页第2
14、0页程序运营结果: 后6次函数调用local x in a is 25 after entering alocal x in a is 26 before exiting alocal static x is 50 on entering blocal static x is 51 on exiting bglobal x is 1 on entering cglobal x is 10 on exiting clocal x in a is 25 after entering alocal x in a is 26 before exiting alocal static x is 51 o
15、n entering blocal static x is 52 on exiting bglobal x is 10 on entering cglobal x is 100 on exiting c最后一次输出:local x in main is 510/10/21第21页第21页二变量存储类型 变量存储类型:指是变量存储属性,它阐明变量占用存储空间区域。 在内存中,供用户使用存储区由程序区、静态存储区和动态存储区三部分构成。 变量存储类型有四种:auto型、register型、static型和extern型。auto型变量存储在内存动态存储区。register型变量保留在存储器中。st
16、atic型变量和extern型变量存储在静态存储器。10/10/22第22页第22页局部变量存储类型缺省值为auto型 。全局变量存储类型缺省值为extern型 。auto型变量和register型变量只用于定义局部变量。 static型变量即可定义成局部变量,又可定义成全局变量。 【例6-5】 设计一个函数:long fac(int n),可用来计算15阶乘。分析:可在函数中定义一个static型变量,用来保留上次计算结果。10/10/23第23页第23页/*exam6_5.c 用static型变量保留上次阶乘值*/#include long fac(int n)static int f=1
17、;f=f*n;return f;main()int i;for(i=1;i=5;i+)printf(%d!=%ldn,i,fac(i);程序运营结果:1!=1 2!=2 3!=6 4!=24 5!=120局部变量f被定义成static型,因此,它只在该函数第1次被调用时候初始化其值为1,以后再调用该函数时,不再进行初始化,而是使用上一次调用值。 10/10/24第24页第24页6.3 内部函数与外部函数 一内部函数 若函数存储类型为static型,则称其为内部函数或称静态函数,它表示在同一个程序中(由多个源文献构成),该函数只能在一个文献中存在,在其它文献中不可使用。 如:static int
18、 fun-name();内部函数只能被其所在源文献调用。二外部函数 若函数存储类型定义为extern型,则称其为外部函数,它表示该函数能被其它源文献调用。函数缺省存储类型为extern型。注意:在需要用到外部函数文献中,其函数申明必须用extern进行阐明。10/10/25第25页第25页比如:有两个源文献file1.c和file2.c下列所表示:/* file1.c 调用外部函数*/# include int mod(int a, int b);extern int add (int m, int n); /*外部函数申明*main() int x, y, result; scanf (“%
19、d%d”, &x, &y); result=add(x,y); /*调用外部函数*/ if (result 0) result=result-mod(x,y); printf(“result=%dn”, result);10/10/26第26页第26页int mod(int a, int b) return(a%d);/* file2.c外部函数*/extern int add(int m, int n) return(m+n);阐明:1在文献1(file1.c)中函数申明: int mod(int a, int b);事实上相称于:extern int mod(int a, int b);1
20、0/10/27第27页第27页2在文献2(file2.c)中函数定义: extern int add(int m, int n) return(m+n); 事实上相称于:int add(int m, int n) return(m+n); 3由多个源文献构成一个程序时,main()函数只能出现在一个源文献中。10/10/28第28页第28页4多个源文献连接方式有三种:将各源文献分别编译成目的文献,得到多个目的文献(.obj后缀),然后用连接命令(tlink)把多个.obj文献连接起来,在Turbo c上用下列命令: tlink file1.obj+file2.obj+filen.obj生成一个
21、file1.exe可执行文献。建立项目文献(.prj后缀),详细操作可参阅各种C编译手册。 使用文献包括命令。 10/10/29第29页第29页6.4 递归函数设计和调用 C语言中一个函数中语句能够是对另一个函数调用。函数嵌套调用图例:调用过程按图中箭头所表示方向和顺序进行,属于一个线性调用关系,每次调用后,最后返回到原调用点,继续执行下列语句。 10/10/30第30页第30页C语言中还允许在函数中调用本身,或函数之间互相调用,这种调用方式称之为递归。递归又分为直接递归调用和间接递归调用。 直接递归调用;函数直接调用本身。间接递归调用:函数互相调用对方。直接递归:int temp (int
22、x) int y, z; z=temp(y); 10/10/31第31页第31页间接递归:显然,递归有也许陷入无限递归状态,最后造成错误发生。因此,设计一个递归问题必须具备两个条件:1后一部分与原始问题类似。2后一问题是原始问题简化。10/10/32第32页第32页【例6-6】 编程,从键盘输入一个正整数n,求n!。n!数字表示式为:n!=定义一个求n!函数:long fac(int n)long fac(int n) long result; if (n= = 0 | n= =1) result =1; else result=n*fac(n-1); return(result); 10/1
23、0/33第33页第33页完整程序下列: /*exam6_6.c 用递归法求n!*/#include long fac(int n)long result;if(n=0|n=1)result=1;elseresult=n*fac(n-1);return result;main()int x;long f;10/10/34第34页第34页scanf(%d,&x);if(x1)设计一个函数:long fibonacci (int n)用于计算数列中第n项值, 10/10/36第36页第36页程序下列所表示: /*exam6_7.c 求第n项Fibonacci数列值*/#include long fi
24、bonacci(int n);main()int x=0;long result;doresult=fibonacci(x);printf(fibonacci(%d)=%ldn,x,result);scanf(%d,&x);while(x!=-1);10/10/37第37页第37页long fibonacci(int n)if(n=0|n=1)return n;elsereturn fibonacci(n-1)+fibonacci(n-2);程序运营结果:fibonacci(0)=03fibonacci(3)=24fibonacci(4)=3610/10/38第38页第38页以x=4为例,下图
25、阐明了fibonacci函数是如何计算fibonacci(4)。图中把fibonacci简写成f。10/10/39第39页第39页6.6 综合范例【例6-12】 在屏幕上画一个1818大小棋盘。程序下列: /*exam6_12.c 在屏幕上画一个棋盘*/#include #include #include /*定义画棋盘所需制表符*/#define LU 0 xda /*左上角*/#define RU 0 xbf /*右上角*/#define LD 0 xc0 /*左下角*/#define RD 0 xd9 /*右下角*/#define L 0 xc3 /*左边*/#define R 0 xb
26、4 /*右边*/10/10/40第40页第40页#define U 0 xc2 /*上边*/#define D 0 xc1 /*下边*/#define CROSS 0 xc5 /*十字叉*/*棋盘左上角坐标*/#define MAP_X 5#define MAP_Y 5void draw_cross(int x,int y);void draw_map();main() textmode(C40); draw_map();10/10/41第41页第41页/*函数定义:*/void draw_map() /*画棋盘*/int i,j;for(i=0;i19;i+)for(j=0;j19;j+)d
27、raw_cross(i,j);void draw_cross(int x,int y) gotoxy(x+MAP_X,y+MAP_Y);textcolor(GREEN);if(x=0 & y=0) putch(LU); /*画左上角*/ return; 10/10/42第42页第42页if(x=0 & y=18) putch(LD); /*画左下角*/ return; if(x=18 & y=0) putch(RU); /*画右上角*/ return; if(x=18 & y=18) putch(RD); /*画右下角*/ return; 10/10/43第43页第43页if(x=0) putch(L); /*画左边*/ return; if(x=18) putch(R); /*画右边*/ return; if(y=0) putch
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 种地出租协议书
- 2025年征信考试题库:征信行业信用修复政策与措施试题卷
- 森防火灾应急预案(3篇)
- 火灾应急预案后讨论(3篇)
- 物品消毒协议书
- 小院房屋流转协议书
- 电子监控协议书
- 白酒加工协议书
- 法律合作协议书
- 广西桂林市2016-2017学年高二下学期期中试题(生物)
- 田野考古学-郑州大学中国大学mooc课后章节答案期末考试题库2023年
- 大数据与法律检索-湖南师范大学中国大学mooc课后章节答案期末考试题库2023年
- 应用文写作基础(中职 )PPT完整全套教学课件
- 记叙文阅读之句子赏析复习市公开课金奖市赛课一等奖课件
- 郑丽玲《彩墨游戏》说课x 课件
- 重点中成药品种含濒危野生动物药材调查表
- 2016年社区获得性肺炎(CAP)指南解读与抗生素应用
- 预应力混凝土连续梁张拉记录
- GB/T 41028-2021航空航天流体系统液压软管、管道和接头组件的脉冲试验要求
- 化工环境保护与及安全技术概论考试题及答案
- 精益生产精管理培训课件
评论
0/150
提交评论