C语言-8学习教案

上传人:莉**** 文档编号:110291688 上传时间:2022-06-18 格式:PPTX 页数:90 大小:522.42KB
返回 下载 相关 举报
C语言-8学习教案_第1页
第1页 / 共90页
C语言-8学习教案_第2页
第2页 / 共90页
C语言-8学习教案_第3页
第3页 / 共90页
点击查看更多>>
资源描述
会计学1C语言课件语言课件-8第一页,共90页。共 90 页 第 2 页 本章要点本章要点函数的定义函数的定义函数的调用函数的调用函数间的数据传递函数间的数据传递(chund)变量的存储类型变量的存储类型变量的作用范围变量的作用范围内部函数和外部函数内部函数和外部函数第1页/共90页第二页,共90页。共 90 页 第 3 页C C程序程序(chngx)(chngx)是函数的集是函数的集合体,每个函数是一个独立合体,每个函数是一个独立的程序的程序(chngx)(chngx)模块。模块。有一个主函数,若干个子函有一个主函数,若干个子函数,程序数,程序(chngx)(chngx)总是从主总是从主函数开始执行。函数开始执行。函数可集中或分散存放在一函数可集中或分散存放在一个或多个源程序个或多个源程序(chngx)(chngx)文文件中。件中。所有子函数地位平等,可互所有子函数地位平等,可互相调用、自我调用。相调用、自我调用。 引入函数的优点:引入函数的优点: 减少重复编写程序减少重复编写程序(chngx)(chngx)的工作量;使程序的工作量;使程序(chngx)(chngx)便于调试和阅读。便于调试和阅读。函数函数(hnsh)F1 ( )main ( )F11 ( )F2 ( )F21 ( )F22 ( )第2页/共90页第三页,共90页。共 90 页 第 4 页数学函数数学函数 math.h math.h字符和字符串函数字符和字符串函数 ctype.h, string.h ctype.h, string.h输入输入(shr)/(shr)/输出函数输出函数 stdio.h stdio.h动态存储分配函数动态存储分配函数 calloc(),malloc() calloc(),malloc()形式形式无参无参函数函数有参有参函数函数空函数空函数库函数库函数用户定义函数用户定义函数: :第3页/共90页第四页,共90页。共 90 页 第 5 页例例 输入三个整数,计算它们的和并输出输入三个整数,计算它们的和并输出(shch)运算结果。运算结果。int add(int x, int y, int z) int s; s=x+y+z; return s;函数(hnsh)示例定义定义(dngy)的求和函数的求和函数main( ) int a, b, c, sum ; scanf(%d,%d,%d,&a,&b,&c); sum=add(a,b,c); printf( sum= %dn,sum); 调用求和函数调用求和函数第4页/共90页第五页,共90页。共 90 页 第 6 页定义函数应包括的内容:定义函数应包括的内容:(1)指定函数的名字,以便以后按名调用;)指定函数的名字,以便以后按名调用;(2)指定函数的类型,即函数值的类型;)指定函数的类型,即函数值的类型;(3)指定函数的参数的名字和类型(有参);)指定函数的参数的名字和类型(有参);(4)指定函数执行的操作)指定函数执行的操作(cozu),即函数完成的,即函数完成的功能。功能。在程序中用到的所有在程序中用到的所有(suyu)函数,必须先定义,后函数,必须先定义,后使用。使用。第5页/共90页第六页,共90页。共 90 页 第 7 页定义函数的一般形式定义函数的一般形式类型标识符类型标识符 函数名函数名(形式参数表形式参数表) 说明部分说明部分(b fen) 语句语句若无参数,写若无参数,写void或空。或空。是被初始化的内部变量,是被初始化的内部变量,寿命和可见性仅限于函寿命和可见性仅限于函数内部数内部不说明类型,自动按整不说明类型,自动按整型处理型处理.建议都指定类型建议都指定类型函数体(一段程序,实现函数体(一段程序,实现函数的功能)函数的功能)第6页/共90页第七页,共90页。共 90 页 第 8 页例例8-1 void print_message( ) printf(How are you !n); 第7页/共90页第八页,共90页。共 90 页 第 9 页y; return z; 类型标识符类型标识符 函数名(形式参数表列)函数名(形式参数表列) 说明说明(shumng)部分部分 语句语句 int max ( x, y) int x,y; int z; z=xy?x : y; return z; 形参变量的说明形参变量的说明(传统传统(chuntng)形形式式)形参变量的说明形参变量的说明(shumng)(现代现代形式形式)2. 有参函数的定义形式有参函数的定义形式第8页/共90页第九页,共90页。共 90 页 第 10 页形参是函数的内部变量,只在函数形参是函数的内部变量,只在函数内部才有意义。内部才有意义。对每个形参必须指明其名字和数据对每个形参必须指明其名字和数据类型。类型。多个形参用逗号分隔。多个形参用逗号分隔。第9页/共90页第十页,共90页。共 90 页 第 11 页分析输出分析输出(shch)函数函数的结果:的结果:自右向左:自右向左:4,4自左向右:自左向右:3,4避免这种不确定性:改为避免这种不确定性:改为(i wi): int i=3, j; j=i; printf(”%d,%d”,i,+j);输出结果为:输出结果为:3,4第10页/共90页第十一页,共90页。共 90 页 第 12 页 2. 执行过程执行过程(guchng):计算各个表达式(计算各个表达式(TC2.0,VC+6.0实参求值顺序按自右至左实参求值顺序按自右至左);把得到值赋给对应的形参把得到值赋给对应的形参;执行函数体执行函数体;遇到遇到return语句或执行完最后一条语句语句或执行完最后一条语句,返回到函数调用处返回到函数调用处.第11页/共90页第十二页,共90页。共 90 页 第 13 页(2) 函数表达式:(函数调用出现在一个表达式中)函数表达式:(函数调用出现在一个表达式中) 一般形式:变量名一般形式:变量名=函数表达式函数表达式 使用使用(shyng)情况:这种表达式称为函数表达式。要求函数情况:这种表达式称为函数表达式。要求函数带回带回 一个确定的值参加表达式的运算。一个确定的值参加表达式的运算。 例如:例如:c=3+max(a, b); d=pow(c, i); e= f(x1,x2,x3),(y1,y2); 函数有几个参数?函数有几个参数?第12页/共90页第十三页,共90页。共 90 页 第 14 页8.1.4 函数参数的传递函数参数的传递(chund)方式方式 值传递的优点值传递的优点: :被调用的函数不可能改变调用函数中变量被调用的函数不可能改变调用函数中变量(binling)(binling)的值,的值,而只能改变它的局部的临时副本。而只能改变它的局部的临时副本。 值传递的缺点值传递的缺点: :每个形式参数仅能传递一个数据,不适用需每个形式参数仅能传递一个数据,不适用需要在函数之间传递大量数据。要在函数之间传递大量数据。 地址传递地址传递:将实参的:将实参的地址地址传递给形参,实参和形参指向同一传递给形参,实参和形参指向同一内存空间,对形参的修改,可以直接影响实参。内存空间,对形参的修改,可以直接影响实参。第13页/共90页第十四页,共90页。共 90 页 第 15 页运行运行(ynxng)结果:结果:a=5 ,b=10 x=10 ,y=5a=5 ,b=10第14页/共90页第十五页,共90页。共 90 页 第 16 页的流程返回到调用函数。的流程返回到调用函数。1.定义:通过定义:通过(tnggu)函数调用使主调函数得到一个确函数调用使主调函数得到一个确定定2. 的值,称为函数的返回值。的值,称为函数的返回值。第15页/共90页第十六页,共90页。共 90 页 第 17 页说明:说明:returnreturn语句只能把一个返回值传递给调用函数。语句只能把一个返回值传递给调用函数。返回值的类型为定义的函数类型,若返回值的类型为定义的函数类型,若returnreturn语句中表语句中表达式类型与函数类型不一致,以函数类型为准。达式类型与函数类型不一致,以函数类型为准。返回值可以是有确定值的常量、变量或表达式,也可返回值可以是有确定值的常量、变量或表达式,也可以是地址。当返值是地址时,应该用指针接受。以是地址。当返值是地址时,应该用指针接受。无返回值的函数,定义为无返回值的函数,定义为voidvoid类型类型( (无类型函数)。无类型函数)。一个函数中可以有多个返回语句。一个函数中可以有多个返回语句。exit()exit()函数由函数由ANSC CANSC C定义的,功能定义的,功能(gngnng)(gngnng)是终止是终止和关闭所有程序,结束程序执行,忽略返回值。和关闭所有程序,结束程序执行,忽略返回值。0 0 为正常退出为正常退出 非非0 0 为非正常退出。为非正常退出。第16页/共90页第十七页,共90页。共 90 页 第 18 页 main( ) int a,b,c; scanf (“%d,%d”,&a,&b); c=max(a,b); printf(“Max is %d”,c); 例8-4 int max(int x, int y) int z; z=xy? x:y; return(z); 形参:通知形参:通知(tngzh)系统系统 要预留内存位置要预留内存位置.实参:在运行实参:在运行(ynxng)时把值传给函数时把值传给函数.把函数把函数(hnsh)的的 结果赋给函数结果赋给函数(hnsh)名名第17页/共90页第十八页,共90页。共 90 页 第 19 页main()() int n; double x; scanf(“%d%lf”,&n,&x); printf(“%f”, power(x,n); 第18页/共90页第十九页,共90页。共 90 页 第 20 页int main() printf(The converted string: ); to_str(-123); return 0;运行运行(ynxng)结果:结果:The converted string:-123第19页/共90页第二十页,共90页。共 90 页 第 21 页运行运行(ynxng)结果:结果:Please input the value:5s= 2.28第20页/共90页第二十一页,共90页。共 90 页 第 22 页问题的提出:问题的提出:C语言程序可由若干文件组成,每一个文件可以单独编译语言程序可由若干文件组成,每一个文件可以单独编译。一个源程序文件由一个或多个函数组成。一个源程序文件由一个或多个函数组成。在一个函数中调用另一个函数需要具备如下条件:在一个函数中调用另一个函数需要具备如下条件:1)函数必须是已经)函数必须是已经定义的函数;定义的函数;2)如果使用库函数,应该在文件开头包含库函数的信息)如果使用库函数,应该在文件开头包含库函数的信息(xnx);3)若函数使用在定义之前,必须在调用函数前对函数进行声)若函数使用在定义之前,必须在调用函数前对函数进行声明。明。 同变量一样,函数同变量一样,函数(hnsh)的调用也应该遵循的调用也应该遵循“先说明先说明,后使用,后使用”的原则。的原则。 1. 函数声明的一般形式:函数声明的一般形式: 类型标识符类型标识符 函数名函数名( (类型类型1 1 形参形参1 1,类型,类型2 2 形参形参2,2,) ); ;功能:通知编译程序函数值类型、参数个数及类型,为编功能:通知编译程序函数值类型、参数个数及类型,为编译程序进行类型检查提供依据。译程序进行类型检查提供依据。第21页/共90页第二十二页,共90页。共 90 页 第 23 页main() float add(float x,float y); float a, b, c; scanf(“ %f, %f”, &a, &b); c=add(a,b) ; printf(“ sum is %f ”, c );/*定义定义(dngy)add函数函数*/float add (float x,float y) float z; z=x+y; return (z); 对被调用函数的说明(shumng)作为(zuwi)表达式被调用第22页/共90页第二十三页,共90页。共 90 页 第 24 页2. 函数声明和函数定义函数声明和函数定义(dngy)的区别的区别 函数声明函数声明(shngmng)的作用是把函数的名字、的作用是把函数的名字、函数类型以及形参的类型、个数和顺序通知编译系统函数类型以及形参的类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查。,以便在调用该函数时系统按此进行对照检查。 函数定义是指对函数功能的确立函数定义是指对函数功能的确立(qul),包括指定,包括指定函数名、函数值类型、形参及其类型、函数体等,它是函数名、函数值类型、形参及其类型、函数体等,它是一个完整的、独立的函数单位。一个完整的、独立的函数单位。 第23页/共90页第二十四页,共90页。共 90 页 第 25 页(1) 被调用函数在主调被调用函数在主调(zh dio)函数之前定义函数之前定义 float add (float x, float y) float z; z=x+y; return (z); main() float a, b; scanf(“ %f, %f, “&a, &b); printf(“ sum is %f ”, add(a, b) ); 3. 可省略可省略(shngl)被调用函数声明的二种情况被调用函数声明的二种情况 第24页/共90页第二十五页,共90页。共 90 页 第 26 页(2) 在所有函数在所有函数(hnsh)定义之前说明定义之前说明char letter( char,char);float f(float,float );int i(float,float);main( ) .char letter (char c1,char c2)float f(float x,float y)int i(float,float)在所有在所有(suyu)函数之前函数之前说明函数类型说明函数类型定义定义(dngy)函函数数letter、f和和i第25页/共90页第二十六页,共90页。共 90 页 第 27 页8.2 数组作函数参数数组作函数参数数组元素可以作函数的实参数组元素可以作函数的实参 数组元素作为数组元素作为(zuwi)表达式的组成部分做函数的实表达式的组成部分做函数的实参可以单向将值传递给形参。参可以单向将值传递给形参。 例如:例如: int a10; x=power( a6,5);数组名可以作函数的实参和形参数组名可以作函数的实参和形参 实现批量数据的传递实现批量数据的传递第26页/共90页第二十七页,共90页。共 90 页 第 28 页8.2.1 一维数组作函数参数一维数组作函数参数说明:说明:形参和实参分别定义数组形参和实参分别定义数组数组做函数参数时,实参用数组做函数参数时,实参用数组名数组名, 必须有确切值必须有确切值实参数组和形参数组类型实参数组和形参数组类型(lixng)应一致。应一致。第27页/共90页第二十八页,共90页。共 90 页 第 29 页第28页/共90页第二十九页,共90页。共 90 页 第 30 页printf(“b0=%d,b1=%dn”,b0,b1); 结果结果(ji gu):程序运行演示程序运行演示(ynsh)可不定义 长度b数组a数组在调用函数过程在调用函数过程中改变了原数组中改变了原数组的值,实参数组的值,实参数组与形参数组共享与形参数组共享一组存储空间,一组存储空间,第29页/共90页第三十页,共90页。共 90 页 第 31 页例例8-9:编写函数:编写函数(hnsh)用选择法对数组中用选择法对数组中10个整数由小个整数由小到大排序到大排序.程序设计程序设计(chn x sh j)思想:思想:函数函数(hnsh)sort(array, n) :实现数组元素由小到大排:实现数组元素由小到大排序。序。主程序主程序 :输入输入array数组,调用数组,调用 sort 函数比较,输函数比较,输 出排序后的出排序后的array数组。数组。void sort (int array , int n) int i, j, k, t; for (i=0; in-1; i+) k=i; for (j=i+1; jn; j+) if (arrayjarrayk) k=j; if (k!=i) t=arrayk; arrayk=arrayi; arrayi=t; 用另外一个参数表示数组的长度用另外一个参数表示数组的长度第30页/共90页第三十一页,共90页。共 90 页 第 32 页main ( ) int a10, i; printf(“enter array: n”); for (i=0; i10; i+) scanf (“ %d ”,&ai); sort(a, 10); printf(“the sorted array: n”); for (i=0; i10; i+) printf (“ %d ”, ai); printf(“n”);由于由于(yuy)地址地址传递,实参数组传递,实参数组 a 改变改变数组名做参数数组名做参数(cnsh)的的好处:好处:由于只需复制一个地址值,而无须复制全部需要处由于只需复制一个地址值,而无须复制全部需要处 理的数据理的数据(shj),因此节约存储空间并提高效率。,因此节约存储空间并提高效率。 由于主调函数和被调函数是在相同的内存区域上对由于主调函数和被调函数是在相同的内存区域上对 数据进行操作,因此可以实现数据的同步更新。数据进行操作,因此可以实现数据的同步更新。 函数调用第31页/共90页第三十二页,共90页。共 90 页 第 33 页第32页/共90页第三十三页,共90页。共 90 页 第 34 页答案答案(d n) A: length+ B: str,3,4第33页/共90页第三十四页,共90页。共 90 页 第 35 页array ;错误错误 实参数实参数(cnsh)组可以大于形参数组可以大于形参数(cnsh)组组 例如:实参数例如:实参数(cnsh)组定义为:组定义为:int array 510; 形参数形参数(cnsh)组定义为:组定义为:int array 310; 这时形参数这时形参数(cnsh)组只取实参数组只取实参数(cnsh)组的一部分组的一部分,其余部分不起作用。,其余部分不起作用。第34页/共90页第三十五页,共90页。共 90 页 第 36 页函数调用第35页/共90页第三十六页,共90页。共 90 页 第 37 页8.3 函数函数(hnsh)的嵌套调用和递归调用的嵌套调用和递归调用8.3.1 函数函数(hnsh)的嵌套调用的嵌套调用嵌套定义:在定义一个函数嵌套定义:在定义一个函数(hnsh)时,该函数时,该函数(hnsh)体内包含另一个函数体内包含另一个函数(hnsh)的定义。的定义。嵌套调用:在调用一个函数嵌套调用:在调用一个函数(hnsh)的过程中,又调用另的过程中,又调用另一个函数一个函数(hnsh)。 C语言不能嵌套定义,但可以嵌套调用!语言不能嵌套定义,但可以嵌套调用!第36页/共90页第三十七页,共90页。共 90 页 第 38 页main函数调用A函数结 束A函数调用B函数B函数192873456 两层嵌套的例子两层嵌套的例子(l zi)第37页/共90页第三十八页,共90页。共 90 页 第 39 页 8.3.2 8.3.2 函数函数(hnsh)(hnsh)的递归调用的递归调用f 函数(hnsh)调用(dioyng) f函数1. 1. 递归的概念:递归的概念: 在调用一个函数的过程中在调用一个函数的过程中直接或直接或间接地调用该函数本身。间接地调用该函数本身。直接调用:直接调用:int f(x)int f(x)int x;int x; int y,z; int y,z; z=f(y); z=f(y); return (2 return (2* *z); z); 第38页/共90页第三十九页,共90页。共 90 页 第 40 页int f1(x)int x; int y,z; . z=f2( y); return (2*z); int f2(t)int t; int a,c; . c=f1(a); return (3+c); 间接间接(jin ji)调用:调用:f 1函数函数调用调用 f2函数函数f 2函数函数调用调用 f1函数函数第39页/共90页第四十页,共90页。共 90 页 第 41 页递归函数的执行过程:递归函数的执行过程: -递归调用:记住本次现场,递归调用。递归调用:记住本次现场,递归调用。 -终了调用:返回上次调用现场。终了调用:返回上次调用现场。特点:特点: -是无终止的递归调用,因此,应该给定是无终止的递归调用,因此,应该给定(i dn)一一 个限制递归次数的条件。个限制递归次数的条件。 -结构简练。结构简练。第40页/共90页第四十一页,共90页。共 90 页 第 42 页float fac( int n) float f; if(n0) printf(“n1)例例8-13 用递归法求用递归法求n!调用阶乘函数不能赋给函数(hnsh)名第41页/共90页第四十二页,共90页。共 90 页 第 43 页递归函数递归函数facfac的求解的求解(qi ji)(qi ji)过程,以求过程,以求9 9的阶乘为的阶乘为例:例:fac(9)=9*fac( 8)fac(8)=8*fac( 7)fac(2)=2*fac( 1)fac(1)=1fac(9)=9*fac( 8)fac(8)=8*fac( 7)fac(2)=2*1fac(3)=3*fac( 2)fac(3)=3*2*1下下推推回回代代第42页/共90页第四十三页,共90页。共 90 页 第 44 页void void tranverstranvers(int n)(int n) if(n/10!=0) if(n/10!=0) tranvers(n/10);tranvers(n/10); printf(%c,n%10+0); printf(%c,n%10+0); main( )main( ) int n; int n; printf(“please input an printf(“please input an integral number”);integral number”); scanf(%d,&n); scanf(%d,&n); if(n0) if(n0) printf(“-); printf(“-); n=-1 n=-1* *n;n; tranvers(n);tranvers(n); 第43页/共90页第四十四页,共90页。共 90 页 第 45 页main()函数函数第一次调用第一次调用tranvers函数函数递归函数递归函数tranvers的求解过程示意图的求解过程示意图第二次调用第二次调用tranvers函数函数第三次调用第三次调用tranvers函数函数tranvers(25)输出字符输出字符2tranvers(2)输出字符输出字符5输出字符输出字符6tranvers(256)结束结束第44页/共90页第四十五页,共90页。共 90 页 第 46 页 char 型型 int 型型 float 型型 double 型型(VC+6.0环境)第45页/共90页第四十六页,共90页。共 90 页 第 47 页第46页/共90页第四十七页,共90页。共 90 页 第 48 页形式参数也是局部变量。形式参数也是局部变量。可以在一个函数内部,也可以在可以在一个函数内部,也可以在复合语句中定义变量,这些变复合语句中定义变量,这些变量只在本复合语句中有效量只在本复合语句中有效(yuxio)(yuxio)。8.4.1 局部变量和全局变量局部变量和全局变量char search(char s) char ch; int k; 变量变量(binling)s、ch、k的作用域的作用域编译系统不为局部变量分配内存编译系统不为局部变量分配内存单元,只是当被调用时,根据单元,只是当被调用时,根据(gnj)需要分配临时单元,调用需要分配临时单元,调用结束,空间释放。结束,空间释放。第47页/共90页第四十八页,共90页。共 90 页 第 49 页例:例:main()int m,n; int x,y;变量变量x,y的作用域的作用域变量变量m,n的作用域的作用域第48页/共90页第四十九页,共90页。共 90 页 第 50 页 2,3,5第49页/共90页第五十页,共90页。共 90 页 第 51 页int a,b=3;main( ) float k;char str(char s20) 全局变量全局变量a、b的作用域的作用域全局变量全局变量k的作用域的作用域第50页/共90页第五十一页,共90页。共 90 页 第 52 页 int p=1,q=5; /*外部变量*/ f1( int a) /*定义(dngy)函数*/ int b,c; char c1,c2; /*外部变量*/ f2( int a, int b) /*定义(dngy)函数*/ . main() int m,n 全局变量c1、c2的作用(zuyng)范围全局变量p、q的作用(zuyng)范围第51页/共90页第五十二页,共90页。共 90 页 第 53 页例如例如(lr):#include “stdio.h”int a=7,b=10;main( ) int a=5,c; c=a+b; printf(“c=%dn”,c); 在同一在同一(tngy)源文件中,全局变量和局部变量可以同名,源文件中,全局变量和局部变量可以同名,在局部变量的作用范围内,全局变量不起作用。在局部变量的作用范围内,全局变量不起作用。C=15全局变量局布变量(binling)局部变量全局变量第52页/共90页第五十三页,共90页。共 90 页 第 54 页缺点:缺点:全局变量在程序的全部执行过程中全局变量在程序的全部执行过程中都占用存储单元。都占用存储单元。降低函数的通用性。降低函数的通用性。使用过多,降低程序的清晰性。使用过多,降低程序的清晰性。全局变量应尽可能少用。全局变量应尽可能少用。第53页/共90页第五十四页,共90页。共 90 页 第 55 页#include float zaver=0,faver=0;void saver(int array ,int n) int i,z=0,f=0; for(i=0 ; i0) zaver+=arrayi;z+; if(arrayi0) faver+=arrayi;f+; if(z!=0) zaver=zaver/z; if(f!=0) faver=faver/f; main() int a10=1,-3,4,6,-2,7,9,-8,-5,0; saver(a,10); printf(“正数正数(zhngsh)平均值平均值=%f,负数平均值负数平均值=%fn”,zaver,faver);第54页/共90页第五十五页,共90页。共 90 页 第 56 页答案答案(d n)10,20,40,40 第55页/共90页第五十六页,共90页。共 90 页 第 57 页程序区程序区静态存储区静态存储区动态存储区动态存储区全局变量,局部静态变量全局变量,局部静态变量形式参数形式参数局部变量(自动)局部变量(自动)函数调用的现场函数调用的现场保护和返回地址保护和返回地址8.4.2 8.4.2 变量的存储变量的存储(cn ch)(cn ch)方法方法第56页/共90页第五十七页,共90页。共 90 页 第 58 页变量存贮类型有四种变量存贮类型有四种(s zhn):自动变量(自动变量(auto)静态变量(静态变量(static)外部变量(外部变量(extern)寄存器变量(寄存器变量(register)auto、static、extern和和register为存贮类型说明符。为存贮类型说明符。第57页/共90页第五十八页,共90页。共 90 页 第 59 页(1)自动变量)自动变量 (auto) 函数中的局部变量,不做任何存储类别的说明函数中的局部变量,不做任何存储类别的说明(shumng)都为自动都为自动变量。变量。 定义形式:定义形式:auto 类型说明类型说明(shumng)符符 变量名变量名 ; 说明说明(shumng):“auto”可以省略。可以省略。 以前所使用的全部变量都是自动变量。以前所使用的全部变量都是自动变量。 自动变量必须在一个函数体的内部。自动变量必须在一个函数体的内部。 函数的形参也是自动变量。函数的形参也是自动变量。 例如:例如:int b, c=3 等价于等价于 auto int b, c=3; 作用域:包含变量定义的复合语句或所说明作用域:包含变量定义的复合语句或所说明(shumng)的函数内部的函数内部 ; 在函数被调用时才存在,从函数中返回时即消失,在函数被调用时才存在,从函数中返回时即消失, 值也仅限于说明值也仅限于说明(shumng)它的函数,在其它的函数中不能它的函数,在其它的函数中不能存取存取, 在两个不同的函数中可以分别使用同名的变量。在两个不同的函数中可以分别使用同名的变量。1.局部变量的存储局部变量的存储(cn ch)方法方法第58页/共90页第五十九页,共90页。共 90 页 第 60 页(2)局部静态变量)局部静态变量 定义形式:在变量名前面加定义形式:在变量名前面加 关键字关键字static static 类型说明符类型说明符 变量名;变量名;局部静态变量编译时赋初值,每次调用时不赋初值,局部静态变量编译时赋初值,每次调用时不赋初值,只保留调用结束只保留调用结束(jish)时变量的值。如果不赋初值时变量的值。如果不赋初值,编译时自动赋,编译时自动赋0值。局部静态变量只允许所在函数值。局部静态变量只允许所在函数引用,其它函数不能引用。其值整个程序运行期间引用,其它函数不能引用。其值整个程序运行期间都不释放。都不释放。自动变量不赋初值,其值不确定。每调用一次,重新自动变量不赋初值,其值不确定。每调用一次,重新赋值一次。赋值一次。第59页/共90页第六十页,共90页。共 90 页 第 61 页 int a=2 , i; for(i=0; i3; i+)printf(“%d,”,f(a);第一次调用第一次调用(dioyng)开始开始第一次调用结束第一次调用结束第二次调用开始第二次调用开始0b34410c局部静态变量第60页/共90页第六十一页,共90页。共 90 页 第 62 页 8,17运行(ynxng)结果:第61页/共90页第六十二页,共90页。共 90 页 第 63 页(3)寄存器变量)寄存器变量 (register) 直接放置在运算器的寄存器中的变量称为寄存器变量直接放置在运算器的寄存器中的变量称为寄存器变量. 定义形式:定义形式: register 类型说明符类型说明符 变量名;变量名; 作用作用(zuyng):对于使用频繁的变量,定义为寄存器变量,不必从:对于使用频繁的变量,定义为寄存器变量,不必从内存而是直接从寄存器中取出参加运算,提高程序执行效率。内存而是直接从寄存器中取出参加运算,提高程序执行效率。 说明:说明:只有局部自动变量和形式参数可作为寄存器变量,其它如局部静态变只有局部自动变量和形式参数可作为寄存器变量,其它如局部静态变量和全局变量不可以。量和全局变量不可以。属于动态存储方式,函数开始调用时为变量分配寄存器空间,函数结属于动态存储方式,函数开始调用时为变量分配寄存器空间,函数结束时释放寄存器空间。束时释放寄存器空间。只有只有int、char和指针类型可定义为寄存器变量,而和指针类型可定义为寄存器变量,而long、double和和float型变量不能设定为寄存器型型变量不能设定为寄存器型 。可用于变量空间分配的寄存器个数依赖于具体的机器。通常为可用于变量空间分配的寄存器个数依赖于具体的机器。通常为2到到3个个,若在一个函数中说明多于,若在一个函数中说明多于2到到3个寄存器变量,编译程序会自动个寄存器变量,编译程序会自动地将它们变为自动变量。地将它们变为自动变量。 第62页/共90页第六十三页,共90页。共 90 页 第 64 页prog1.c的内容的内容(nirng)如如下:下:int a;main( ) x=6; f1( );void f1( ) a+=2; printf(a=%dn, a); f2( );prog2.c的内容的内容(nirng)为:为:extern int a;void f2( ) a+; printf(a=%dn, a); 第63页/共90页第六十四页,共90页。共 90 页 第 65 页内有效,在程序的其它文件中不可内有效,在程序的其它文件中不可使用。使用。例如:例如:file1.c file2.c static int a ; extern int a; static int a只能用于只能用于file1.c ,虽然,虽然file2.c中将中将 同名变量同名变量 int a说明说明(shumng)为为extern,但仍无法使,但仍无法使用用file1.c 中的中的 a变量。变量。第64页/共90页第六十五页,共90页。共 90 页 第 66 页8.5 8.5 内部函数内部函数(hnsh)(hnsh)和外部函数和外部函数(hnsh)(hnsh)1 . 内部函数内部函数(静态函数)静态函数)定义:如果一个函数只能被本文件中其它函数调用,称定义:如果一个函数只能被本文件中其它函数调用,称为内部函数。为内部函数。定义格式:定义格式: static 类型标识符类型标识符 函数名(形参表)函数体函数名(形参表)函数体 例如:例如:static int fun(a, b) 作用:函数的作用域限于所在文件,不同文件中同名作用:函数的作用域限于所在文件,不同文件中同名(tngmng)函数互不干扰,便于程序的格式化。函数互不干扰,便于程序的格式化。第65页/共90页第六十六页,共90页。共 90 页 第 67 页 通常不加通常不加 static 标识符的函数都是标识符的函数都是外部函数。外部函数。第66页/共90页第六十七页,共90页。共 90 页 第 68 页3.标号的生存期及作用域标号的生存期及作用域生存期生存期 在在C语言中,由于函数的生存期是全程语言中,由于函数的生存期是全程(qunchng)的,的,即从程序开始至程序结束,标号是函数的一部分,标号的即从程序开始至程序结束,标号是函数的一部分,标号的生存期自然是全程生存期自然是全程(qunchng)的。的。作用域作用域 C语言规定,标号的作用域仅为定义标号的函数,即语言规定,标号的作用域仅为定义标号的函数,即不允许用不允许用goto语句从一个函数转向另一个函数。语句从一个函数转向另一个函数。 第67页/共90页第六十八页,共90页。共 90 页 第 69 页1 1 函数的类型是函数返回值的类型函数的类型是函数返回值的类型2 C2 C要求函数定义的类型,说明的类型和函数定义类型一致要求函数定义的类型,说明的类型和函数定义类型一致3 3 定义的类型与返回值类型不一致时,以定义为准定义的类型与返回值类型不一致时,以定义为准4 4 不定义函数类型,系统默认是不定义函数类型,系统默认是intint。(VC+6.0(VC+6.0必须必须(bx)(bx)指定函数类型)指定函数类型)5 5 不需返回任何返回值时,应定义无类型不需返回任何返回值时,应定义无类型voidvoid。第68页/共90页第六十九页,共90页。共 90 页 第 70 页1 1 定义函数时,括号内为形参定义函数时,括号内为形参2 2 调用函数时,括号内为实参调用函数时,括号内为实参3 3 实参与形参需类型相同,个数相等实参与形参需类型相同,个数相等4 4 形参在函数被调用时才分配存储空间,有值形参在函数被调用时才分配存储空间,有值5 5 实参在主调实参在主调(zh dio)(zh dio)函数内有值,求值顺序是从右向左函数内有值,求值顺序是从右向左6 6 实参与形参是单向的数值传递实参与形参是单向的数值传递7 7 如果实参与形参都是数组名,是地址传递如果实参与形参都是数组名,是地址传递8 8 实参数组与形参数组类型相同,个数可以不同实参数组与形参数组类型相同,个数可以不同第69页/共90页第七十页,共90页。共 90 页 第 71 页1 1 函数函数(hnsh)(hnsh)可以作运算分量,作其他函数可以作运算分量,作其他函数(hnsh)(hnsh)的参数,可构成的参数,可构成语句语句2 2 函数函数(hnsh)(hnsh)调用可以嵌套调用可以嵌套3 3 函数函数(hnsh)(hnsh)中的中的returnreturn语句可以带回一个返回值语句可以带回一个返回值第70页/共90页第七十一页,共90页。共 90 页 第 72 页特点特点生存期生存期作用域作用域未初始化时值未初始化时值自动变量自动变量定义它的函数定义它的函数 (局部变量)(局部变量)随机数随机数外部变量外部变量整个程序中多个文件中的多个函数(全程变量整个程序中多个文件中的多个函数(全程变量 )0 0静静态态局部局部全局全局整个程序整个程序 定义它的函数(静态局部)定义它的函数(静态局部)定义它的文件(静态全程)定义它的文件(静态全程) 0 0 0 0寄存器变量寄存器变量定义它的函数定义它的函数随机数随机数第71页/共90页第七十二页,共90页。共 90 页 第 73 页例:现已定义函数例:现已定义函数plus求两个求两个(lin )数的和,包含在文件数的和,包含在文件file1.c中,在中,在file2.c程序文件中要调用此函数,请将下列程序补充完整,使程序正确。程序文件中要调用此函数,请将下列程序补充完整,使程序正确。file2.c程序程序(chngx):# include _A_main() int a=4,b=5,c; _B_ plus(int ,int); c=plus(a,b); printf(“a+b=%d”n”,c);答案答案 A: “file1.c” B: extern 第72页/共90页第七十三页,共90页。共 90 页 第 74 页/* 文件文件(wnjin)一一 prog1.c*/#include stdio.h#include prog2.cint x=10,y=10; extern void sub() ; void add() int y=5; y=10+x; x*=2; printf(add:y=%d; ,y); main() x+=5; add(); sub();printf(main:x=%d; main:y=%dn,x,y); /* 文件文件(wnjin)二二 prog2.c*/#include “stdio.h”extern int x;void sub() int y=5; x-=y; printf(“sub:y=%d;”,y); 运行结果:运行结果:第73页/共90页第七十四页,共90页。共 90 页 第 75 页C的源程序的源程序 预处理预处理 编译编译(biny) 目标程序目标程序 (*.C) _ (*.OBJ)编译系统中有编译系统中有 : 预处理程序预处理程序(chngx) 编译程序编译程序(chngx)宏替换 #define N 20 文件包含(bohn) #include条件编译 #if( . ) C中的预处理命令中的预处理命令分类分类8.6 8.6 编译预处理编译预处理第74页/共90页第七十五页,共90页。共 90 页 第 76 页宏定义有两种类型宏定义有两种类型(lixng):字符串替换和带参数的宏:字符串替换和带参数的宏替换替换 ( 1) 字符串宏替换字符串宏替换(t hun) 功能:在预处理时功能:在预处理时 ,将程序中宏定义将程序中宏定义(dngy)之后出现之后出现的所有的宏名的所有的宏名,用宏替换体代替。用宏替换体代替。宏替换名宏替换名宏替换体宏替换体例如:例如:#define PI 3.14159 格式:格式:#define 宏名宏名宏定义字符串宏定义字符串 C的编译程序调用预处理程序检查有否的编译程序调用预处理程序检查有否宏名宏名,若有,若有,用用宏替换体宏替换体将其替换,完成之后,将替换后的源程序交将其替换,完成之后,将替换后的源程序交给编译程序。给编译程序。1.1.宏定义宏定义第75页/共90页第七十六页,共90页。共 90 页 第 77 页 用途用途(yngt): 提高程序的可读性,便于修改、调试提高程序的可读性,便于修改、调试。 - 符号常量,如符号常量,如 PI、 数组的长度数组的长度 - 为程序书写带来方便(将程序中多次出现为程序书写带来方便(将程序中多次出现(chxin)相同内相同内容写成宏)容写成宏)#define N 10 /* 编译之前用编译之前用10替换替换(t hun)所所有的有的N */.int aN 说明说明:v 通常放在程序开头通常放在程序开头, ,不加分号不加分号v 是代替是代替, ,不是赋值不是赋值( (不作语法检查不作语法检查) )v 可将多个语句或表达式定义为一个宏替换可将多个语句或表达式定义为一个宏替换v 为区别变量和关键字为区别变量和关键字, ,习惯用大写习惯用大写第76页/共90页第七十七页,共90页。共 90 页 第 78 页#define R 3.0#define PI 3.145926#define L 2.0*PI*R#define S PI*R*Rv 双引号中的不替换双引号中的不替换(t hun)(t hun)v 有效范围有效范围, ,从定义从定义(dngy)(dngy)开始到程序结尾开始到程序结尾例:例: #define PI 3.14159main( ) printf (“PI=%fn”,PI); 结果结果(ji gu):PI=3.14159main( ) printf(“PI=%sn”,”PI”); v 可以嵌套可以嵌套, ,后定义的宏可以包含先定义的宏名后定义的宏可以包含先定义的宏名结果结果:PI=PI第77页/共90页第七十八页,共90页。共 90 页 第 79 页(2) 带参数带参数(cnsh)的的宏定义宏定义 带参数带参数(cnsh)的宏不仅能进行字符串代替,而的宏不仅能进行字符串代替,而且还能进行参数且还能进行参数(cnsh)代换。代换。 格式格式(g shi): #define 宏名(参数表)宏名(参数表) 表表达式达式 功能功能: 带参数的宏将一个带参数的宏将一个带形参带形参的表达式定义为一个带参数的的表达式定义为一个带参数的宏名,预处理程序对程序中所有宏名,预处理程序对程序中所有带实参带实参表的宏名进行表的宏名进行宏展开宏展开替换,替换,用表达式代替宏名,用参数表中的实参代替表达式用表达式代替宏名,用参数表中的实参代替表达式中对应的形参中对应的形参。例:例:#define S( a, b) a*b程序中程序中 S(3, 2) 3*2第78页/共90页第七十九页,共90页。共 90 页 第 80 页 用途用途(yngt):用带参数的宏可以代表一些用带参数的宏可以代表一些(yxi)简短的表达式,提高简短的表达式,提高程序执行的效率。程序执行的效率。* * 对常用的格式输入输出函数对常用的格式输入输出函数printfprintf可以进行可以进行(jnxng)(jnxng)宏宏定义,使程序简化定义,使程序简化* *宏名与参数的圆括号之间不能有空格宏名与参数的圆括号之间不能有空格 s (a,b)s (a,b) 说明:说明:* 宏定义命令要求在一行内写完,如换行,用宏定义命令要求在一行内写完,如换行,用“”表示下表示下一行继续。一行继续。* * 对于宏定义的形参要根据需要加上圆括号,以免对于宏定义的形参要根据需要加上圆括号,以免 发生发生运算错误运算错误第79页/共90页第八十页,共90页。共 90 页 第 81 页例例1 使用使用(shyng)有参宏替换求圆的面积。有参宏替换求圆的面积。 #define PI 3.1415926 #define S(r) PI*r*r main() float a=3.6,area; area=S(a); printf(“r=%fnarea=%fn”,a,area); 宏展开宏展开(zhn ki)替换后:替换后:area=3.1415926*3.6*3.6;第80页/共90页第八十一页,共90页。共 90 页 第 82 页例例2 求下列求下列(xili)语句的循环次数。语句的循环次数。 #include “stdio.h” #define N 2 #define M N+1 #define NUM (M+1)*M/2 main() int i,n=0; for(i=1;i=NUM;i+) n+; printf(“%d”,n); 8第81页/共90页第八十二页,共90页。共 90 页 第 83 页函数要求形参,实参有类型函数要求形参,实参有类型(lixng)(相同)(相同) 宏的形参,实参不要求类型宏的形参,实参不要求类型(lixng),仅是符号,仅是符号函数需事先计算实参表达式的值,再代入形参函数需事先计算实参表达式的值,再代入形参宏展开中不求表达式的值,仅替换宏展开中不求表达式的值,仅替换, 没有没有(mi yu)值传值传递递函数是在运行时处理函数是在运行时处理宏是在编译宏是在编译(biny)之前进行之前进行带参数的宏与函数的区别带参数的宏与函数的区别函数调用影响运行时间,源程序无变化函数调用影响运行时间,源程序无变化宏展开影响编译时间,通常使源程序加长宏展开影响编译时间,通常使源程序加长函数调用有一个返回值函数调用有一个返回值 宏可以有多个结果宏可以有多个结果第82页/共90页第八十三页,共90页。共 90 页 第 84 页 文件包含是指一个程序文件将另一个指定文件包含是指一个程序文件将另一个指定(zhdng)文件的全部内容包含进来。文件的全部内容包含进来。 格式格式(g shi): #include 或或: #include “文件名文件名”2.2.文件文件(wnjin)(wnjin)包含包含 功能功能: 用指定文件的全部内容代换该预处理行用指定文件的全部内容代换该预处理行 ,C程序程序通过通过#include预处理预处理,把一个指定的文件的内容嵌入。把一个指定的文件的内容嵌入。(注:注:只能包含只能包含ASCII文本文件。文本文件。) 与与“ ”的区别的区别: : 在系统指定目录下搜索文件在系统指定目录下搜索文件 “ ” 在用户当前目录下找指定文件在用户当前目录下找指定文件, ,如用户当前目录下如用户当前目录下没有找到没有找到, ,再到系统指定目录下查找。再到系统指定目录下查找。 说明说明 第83页/共90页第八十四页,共90页。共 90 页 第 85 页 只包含源文件只包含源文件, ,不包含可执行文件和目标不包含可执行文件和目标(mbio)(mbio)文件。文件。 可以嵌套可以嵌套例如例如(lr):file1.c(lr):file1.c需包含需包含file2.c,file2.c,file2.cfile2.c包含包含file3.cfile3.c,必须将,必须将file3.hfile3.h放在前面放在前面#include #include #include #include 一个一个#include#include只能包含只能包含(bohn)(bohn)一个文件一个文件第84页/共90页第八十五页,共90页。共 90 页 第 86 页用途用途(yngt) 将符号常量将符号常量 , 带参数的宏及构造类型的变量等定带参数的宏及构造类型的变量等定义在一个独立的文件中义在一个独立的文件中,为其他文件共享。为其他文件
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!