《函数与宏定义》PPT课件.ppt
《《函数与宏定义》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《函数与宏定义》PPT课件.ppt(94页珍藏版)》请在三一办公上搜索。
1、,C程序由一个主函数main()和任意个函数组成。由主函数调用其他函数,其他函数也可以互相调用,且同一函数可以被一个或多个函数调用任意次。以此完成下面两个功能:,(1)使程序具有“积木”功能。(模块化),(2)使程序具有“重构”功能,main()a()b()c(),a()a1()b()b1()b2()c()c1(),a1()b1()b2()c1(),1)除main外,其它为标准库函数、用户自定义函数,标准库函数:由系统提供,用户可调用。用户自定义函数:由用户按语法规则编写。,C程序由一个main和任意个函数组成。,在C语言中,函数的含义不是数学中的函数关系,而是一个处理。它可以进行数值运算、信
2、息处理、控制决策,即把一段程序的工作放在函数中进行。,2)除main函数外,其它函数可相互调用,3)函数不可嵌套定义,具有全局性、平行性,4)函数分为有参与无参函数,5)程序从main开始执行,最后又回到main函 数结束。,库函数简介,系统自带的标准库函数根据不同的功能作用放在不同的头文件中。,stdio.h 用于标准输入/输出math.h 用于数学计算ctype.h 用于字符处理string.h 用于字串处理time.h 用于时间/日期的处理dir.h 用于控制目录和路径graphics.h 用于图形操作,dos.h,bios.h,用于接口处理,库函数的作用,(1)使程序更具有“独立性”和
3、“可移植”性。,(2)使用时只需在程序的开头加上一条语句:,#include,根据使用的函数来确定,(3)使程序具有“模块化”。,6.1 函数概念,6.1.1 函数定义,存储类型符 类型标识符 函数名(形参列表),形参说明,说明部分 执行部分,存储类型符 类型标识符 函数名(形参说明表),说明部分 执行部分,例:求二数之最大值 int max(x,y)int x,y;int z;z=xy?x:y;return(z);,本函数中出现了return,语句,其返回值一般与函数类型一致.,int max(int x,int y)int z;z=xy?x:y;return(z);,6.1.2 函数声明和
4、调用,调用函数时应对被调用函数进行声明(说明),使系统知道本函数将要用到某个函数及它的类型,以便主调函数值作处理。(函数名相当于一变量,但应有所区别),函数声明的一般形式:存储类型符返回值类型符 函数名(形参说明表);如:int min(int x,int y);,一、函数的声明,例:求二实数之和。main()float add();float a,b,c;scanf(%f,%f,函数声明,以下几种情况可省略对被调函数的声明:,(1)当返回值为整型、字符型。,(2)在调用之前定义函数。,(3)在整个文件的开头定义函数。,(1)无返回值的情况 函数名(实参表列);(2)有返回值的情况变量名函数名
5、(实参表列);,二、调用方式,例:,int max(int x,int y)int z;z=xy?x:y;return(z);,main(),int a,b,c;,scanf(%d,%d,c=max(a,b);,printf(max=%dn,c);,上例函数调用中参数传递过程为:,c=max(a,b);在main主函数中,max(x,y),int x,y;,int z;,z=xy?x:y;,return(z);,a,b,c,x,y,z,10,15,15,10,15,15,例 阅读下列程序,写出运行结果,swap(x,y),int x,y;,int t;,t=x;x=y;y=t;,printf(
6、x=%d,y=%dn,x,y);,main(),int a,b;,scanf(%d,%d,if(ab)swap(a,b);,printf(a=%d,b=%dn,a,b);,a,b,x,y,t,15,19,15,19,15,19,15,函数被调用时,临时分配单元给形参,调用完毕,这些单元被释放。,实参:出现在调用函数中的参数。,形参:出现被调用函数中的参数。,6.1.3 函数传值方式,一、函数参数,实参可为表达式,其传递为值传递。,实参可为常 量、变量或表达式,实参与形参类型必须一致。,在被定义的函数中,必须指定形参的类型,可在形参说明部分说明,也可在形参表列中说明。如,如:int max(in
7、t x,int y),注:,二、函数返回值语句,或 return 表达式;,通过函数调用使用函数能得到一个确定的值,这就是函数的返回值。,说明:(1)函数的返回值由return获得;一个函数中可以有一个以上的return语句,执行到哪一个return语句,则哪一个语句起作用。,return(表达式);,1、函数无返回值的情况,2、函数有返回值的情况,return;,如:#include stdio.h,main(),int n=4,x=2,s;,s=fun(x,n);,printf(s=%dn,s);,fun(int x,int n),if(n=1)return(x);,else return
8、(xfun(x,n1);,不加类型说明的函数,一律按int型处理。,(2)函数返回值的类型,就是定义函数时指定函数值的类型。,如:int max(x,y),char letter(c1,c2),double f(a,b),函数值为整型,函数值为字符型,函数值为双精度型,(3)当函数值的类型与return语句中表达式类型不一致时,以函数类型为准。对数值型数据,可以自动进行类型转换。即函数类型决定返回值的类型。(这种方法初学者最好不用),(4)若被调函数中没有return语句,将不带加一个确定的、用户希望的函数值。但实际上,并非不带回值,而只是不带回有用的值,带回的是一个不确定的值。,main()
9、,a=printstar();,b=print_message();,c=printstar();,printstar(),printf(*n);,print_message(),printf(How do you do!n);,int a,b,c;,printf(a=%d,b=%d,c=%dn,a,b,c);,如:,则运行结果为:,*How do you do!*,a=16,b=15,c=16,(5)关于main函数的参数,一般情况下,main函数均无参数,但这并不表示main 函数必须为无参函数,在必要时,main函数也可以带有参数。,(6)实参传递给形参时,实参的计算有的系统自左至右,有
10、的自右至左。,例main()int i=2,p;p=f(i,+i);printf(%d,p);int f(int a,int b)int c;if(ab)c=1;else if(a=b)c=0;else c=1;return(c);,我们现在通用的Turbo C是按自右至左的顺序求实参表的值,所以上机运运行结果为0。,(1)若实参表的求值顺序为自左至右,则函数调用相当于f(2,3);,这时,运行结果为:1,(2)若实参表的求值顺序为自右至左,则函数调用相当于f(3,3);,这时,运行结果为:0,说明:,三、函数调用,函数不能嵌套定义,但可嵌套调用,主函数调用其他函数,其他函数也可以互相调用。,
11、例 编写求组合数的函数。组合数的计算公式为:,/*求阶和乘*/unsigned long fac(unsigned int k)unsigned long f=1;unsigned int i;for(i=1;i=k;i+)f=f*i;return f;,/*求组合数*/unsigned long comb(unsigned int n,unsigned int m)unsigned long c;c=fac(m)/(fac(n)*fac(m-n);,#include main()unsigned int n,m;unsigned long c;scanf(“%u,%u”,从程序中可以看到:,
12、(2)二个函数的定义均在主函数之前,所以在主函数中不必再对它们进行声明(说明);,(1)在定义函数时,函数fac、comb是互相独立的;,(3)程序从主函数main()开始执行,首先执行的scanf(),输入数,然后调用comb(n,m),调用comb的过程中,要调用fac()。fac()的调用是嵌套在函数comb()的调用中进行的,其嵌套调用过程如下:,6.2 变量作用域及存储类型,1、局部变量,凡在函数(含main 函数)内部定义的变量称为局部变量。,局部性:局部变量仅在函数内部有效,它包括:,一、变量作用域,根据变量的有效作用范围,变量可分为局部变量和全局变量。,2.形式参数;,3.在复
13、合语句中可定义仅复合语句中有效的临时变量。,不同的函数可具有同名的变量,它们占不同的内存单元,互不影响。,1.函数中定义的变量;,2、全局变量,一个源文件中,在所有函数之外定义的变量为全局变量。,有效性:自定义位置开始至文件结尾全部有效。,char f2(x,y);int c,y;int i,j;main(),例:int p=1,q=5;float f1(a)int a;int b,c;char c1,c2;,p,q的作用范围,c1,c2的作用范围,1.全局变量所作用到的函数,相当于这些函数的公共变量。于是,当一个函数对其值进行改变后,另一个函数使用该变量的值亦相应改变。好处:函数之间值传递。
14、,2.不要随意使用全局变量。一是始终占据内存单元;二是由于函数依赖于外部定义的变量,减少了通用性。,3.不在全局变量作用域内的函数。若要使用全局(外)变量,需在函数体内加上extern保留字于以说明。,4.全局和局部变量同名时,局部变量有效。,例:分析m作为全局变量和局部变量在程序中各个部分时的值。,其运行结果为:,m2=13/*全局变量的m的值*/,m1=3/*局部变量m的值*/,3/*函数调用的结果*/,float f1(x)int x;extern int a,b;int a0;b=1 main(),a,b作用域,例:,二、变量的存储类型,1、变量的存储类别,C语言特有的方式。表达了一个
15、变量存在的时间。,静态存储变量:存放于静态存储区,在程序整个运行过程中,始终占据固定的内存单元。,动态存储变量:存放于动态存储区,根据程序的运行状态(如:函数调用)而临时分配的单元,且单元并不固定。,以上为两大类,又分为四种具体形式,2.静态(static)变量,3.寄存器型变量,4.外部(extern)变量,前面学习的局部、全局变量均以上述方式中的一种形式存储。,1.自动型变量(auto),局部变量既可以静态方式,又可以动态方式存储。动态方式:auto int a,b;,2、局部变量存储形式,则:a,b为自动型,存入动态区。在该函数被调用时才分配单元,函数调用结束时释放。,auto一般省略。
16、以前用到的变量均为auto型,(除加static说明的之外)。,(1)若定义时赋初值,则程序运行中仅在第一次调用时赋初值,第二次调用不再赋初值,而是使用上一次调用的值。,则:a,b存入静态区。函数中的a,b始终占据固定存储单元。,静态方式:static int a,b;,int fac(n)int n;static int f=1;f=fn;return(f);main()int i;for(i=1;i=5;i+)printf(%d!=%dn,i,fac(i);,例:求n!,运行结果为:1!1 2!2 3!6 4!24 5!120,每一次调用fac(i),打印一个i!,同时保留这个i!的值以便
17、下次再乘(i+1)。,(2)若不赋初值,则系统置初值0,而动态变量不赋初值则值不确定。,当动态局部变量在一个函数中反复被用达到数百次以上时,为了提高效率,可将其存入寄存器中(有限个),不存入内存的动态区中。,说明方式 register int i,j=1;,不可多,一般13个,必要时使用。,2、全局变量存储形式,在函数外部中定义,它们一定存放在静态存贮区中。,全局变量即可被本文件中各函数用,亦可被其它源文件中的函数引用。,(1)只被本文件中的函数引用,全局变量本身一定是存放在静态区的。但若加上 static.即:,static int a,b;float f1(x)int,则表明a,b只被本文
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 函数与宏定义 函数 定义 PPT 课件
链接地址:https://www.31ppt.com/p-5469805.html