C语言程序设计-函数与宏定义

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第6章函数与宏定义第6章函数与宏定义本章主要内容1.函数的概念①函数的声明和调用②函数的传值方式2.变量的作用域和存储类型3.内部函数与外部函数4.递归函数的设计和调用5.预处理6.综合范例6.1函数的概念模块化程序设计的核心:函数设计。重要概念:①把解决问题的方案设计成一个个独立的模块;②程序通过调用模块功能来解决问题。③这些模块通过函数来实现,又称为函数模块。④每一个函数具有独立的功能,程序通过各模块之间的协调工作完成复杂的程序功能。6.1函数的概念C语言的函数分为两类:①系统定义的标准函数,又称为库函数。函数声明一般是放在系统的include目录下以.h为后缀的头文件中,如在程序中要用到某个库函数,必须在调用该函数之前用#include头文件名命令将库函数信息包含到本程序中。常用的库函数请查阅附录C。②自定义函数。按要求设计的。C语言程序设计的核心之一:自定义函数。6.1函数的概念6.1.1函数的定义自定义函数的形式:[存储类型符][返回值类型符]函数名([形参说明表]){函数语句体}几点说明:1.[存储类型符]指的是函数的作用范围,只有两种形式:static和extern。static说明的函数称为内部函数,只能作用于其所在的源文件,extern说明的函数称为外部函数,可被其他源文件中的函数调用。缺省情况为extern。6.1函数的概念[存储类型符][返回值类型符]函数名([形参说明表]){函数语句体}2.[返回值类型符]指的是函数体语句执行完成后,函数返回值的类型。如int,float,char等。若函数无返回值,则用空类型void来定义函数的返回值。默认情况为int型(有些编译器不支持默认情况)。3.函数名由任何合法的标识符构成。建议将函数名的命名与函数内容有一定关系。说明6.1函数的概念4.[形参说明表]是一系列用逗号分开的形参变量说明。如:intx,inty,intz表示形参变量有3个:x,y,z。类型都是int型的。注意:不能直接写成:intx,y,z。5.在古典式函数定义中,[形参表]只要形参名,不要类型名。如:x,y,z表示形参变量有3个。形参的类型通过形参说明语句说明。如:intx,y,z。[形参说明表]或[形参表]都可以缺省,缺省时表示函数无参数。[存储类型符][返回值类型符]函数名([形参说明表]){函数语句体}说明6.1函数的概念6.函数语句体是放在一对花括号{}中,由局部数据类型描述和功能实现两部分组成。函数返回语句通常用返回语句来结束函数的调用。两种形式的返回语句:①函数无返回值的情况return;②函数有返回值的情况return(表达式的值);[存储类型符][返回值类型符]函数名([形参说明表]){函数语句体}说明6.1函数的概念例如,编写自定义函数abs_sum(),求两个任意整数的绝对值的和。intabs_sum(intm,intn){if(m0)m=−m;if(n0)n=−n;return(m+n);}或直接调用系统函数来实现:intabs_sum(intm,intn){return(abs(m)+abs(n));}注意:函数abs()的声明在头文件math.h。6.1函数的概念6.1.2函数的声明和调用通常情况下,自定义的函数在使用之前要先进行函数声明,才能在程序中进行函数调用。1.函数声明函数声明语句的形式:[存储类型符][返回值类型符]函数名([形参说明表]);如:intabs_sun(intm,intn);2.函数调用函数定义好后,若不通过函数调用,不会发挥任何作用。函数调用是通过函数调用语句来实现的。①函数无返回值情况:函数名([实参表]);6.1函数的概念②函数有返回值的情况:变量名=函数名([实参表]);注意:变量名的类型必须与函数的返回值类型相同。函数调用时,会去执行函数中的语句内容,函数执行完毕后,回到函数的调用处,继续执行程序中函数调用后面的语句。例如:…intx=5,y=−10;intz;…z=abs_sum(x,y);/*函数调用*/…6.1函数的概念6.1.3函数的传值方式函数传值的4个要点:①对于带有参数的函数,调用函数时,将实参表中每一个实参的值对应地传递给每一个形参变量;②形参变量接收到实参传来的值后,会在内存临时开辟新的空间,保存形参变量的值;③函数执行完毕时,释放临时开辟的内存空间;④形参的值在函数中不论是否发生变化,实参变量的值均不会发生变化。自定义函数在程序中的使用方式有两种形式:①先进行函数声明,再进行函数调用,函数定义放在main函数的后面。②先定义函数,再调用函数(不需要在调用前函数声明)。6.1函数的概念例1:编写程序,通过调用函数intabs_sum(inta,intb),求任意两个整数的绝对值的和。第1种形式:先进行函数声明;再进行函数调用;最后给出函数定义。/*example6_1.c*/#includestdio.hintabs_sum(intm,intn);/*函数声明*/main(){intx,y,z;scanf(%d%d,&x,&y);z=abs_sum(x,y);/*函数调用*/printf(|%d|+|%d|=%d\n,x,y,z);}intabs_sum(intm,intn)/*函数定义*/{if(m0)m=-m;if(n0)n=-n;returnm+n;}6.1函数的概念第2种形式:先定义函数;再调用函数。(不需要在调用前函数声明)思考:1.怎样求任意3个整数的绝对值之和?参考答案见程序:example6_2.c2.怎样求任意2个数的乘积?参考答案见程序:example6_3.c/*example6_1.c*/#includestdio.hintabs_sum(intm,intn)/*函数定义*/{if(m0)m=-m;if(n0)n=-n;returnm+n;}main(){intx,y,z;scanf(%d%d,&x,&y);z=abs_sum(x,y);/*函数调用*/printf(|%d|+|%d|=%d\n,x,y,z);}6.1函数的概念重要概念函数传值调用的性质:实参的值在函数调用前和函数调用后不会发生变化。如有程序:分析程序的运行结果。/*exanple6_交换?*/#includestdio.hvoidexchange(inta,intb){inttemp;printf(3---a=%d,a=%d\n,a,a);temp=a;a=b;b=temp;printf(4---a=%d,a=%d\n,a,a);}main(){intx=10,y=20;printf(1---x=%d,y=%d\n,x,y);exchange(x,y);/*函数调用*/printf(2---x=%d,y=%d\n,x,y);}6.2变量的作用域和存储类型根据变量的作用域不同,可分为局部变量和全局变量两种。1.变量的作用域变量的作用域:变量起作用的范围。①局部变量:在函数内部或某个控制块的内部定义的变量。局部变量的作用域:函数内部。作用:增强了函数模块的独立性。②全局变量:在函数外面定义的变量称为全局变量。全局变量的作用域:从该变量定义的位置开始,直到源文件结束。作用:在同一文件中,所有函数都可以引用全局变量。增强了各函数间数据的联系。局部变量和全局变量的作用域如图所示:6.2变量的作用域和存储类型结束┆inti;main(){floata,b;……{chars;……}function();……}intk;voidfuction();{intm;……}局部变量s的作用域局部变量a,b的作用域全局变量i的作用域全局变量k的作用域局部变量的作用域例2:阅读程序【例6-4】的程序,了解变量作用域。请注意区分局部变量和全局变量的作用域。程序:example6_4.c6.2变量的作用域和存储类型2.变量的存储类型变量的存储类型指的是变量的存储属性,它说明变量占用存储空间的区域。在内存中,供用户使用的存储区由程序区、静态存储区和动态存储区3部分组成。变量的存储类型:auto、register、static和extern4种。①auto型变量存储在内存的动态存储区;②register型变量保存在寄存器中;③static型和extern变量存储在静态存储器。6.2变量的作用域和存储类型局部变量的存储类型默认值为auto型。全局变量的存储类型默认值为extern型。注意:①一般情况下,常用auto型register型定义局部变量。②static型既可作为局部变量,又可作为全局变量。作为局部变量时,局部变量的值将被保留,若定义时没有赋初值,则系统会自动为其赋0值;作为全局变量时,其有效范围为它所在的源文件,其他源文件不能使用。6.2变量的作用域和存储类型例3:设计一个函数:longfac(intn),用来计算正整数的阶乘,编写程序进行测试。分析:由于计算机对变量的字节长度分配有限,整型变量的最大值是一定的,因此,目前计算整数的阶乘只能针对较小的整数。假定要计算1~5的阶乘。算法的核心思想:对于任意正整数n,如果知道(n−1)!,则n!=n×(n−1)!。可在函数中定义一个static型变量,用来保存每一次阶乘的计算结果。6.2变量的作用域和存储类型程序如下:/*example6_5.c*/#includestdio.hlongfac(intn)/*计算n!的函数*/{staticintf=1;f=f*n;returnf;}main(){inti;for(i=1;i=5;i++)printf(%d!=%ld\n,i,fac(i));}6.2变量的作用域和存储类型思考:1.这个程序计算最大正整数的阶乘是多少?2.如果不用循环,能否直接求出某个整数的阶乘?6.3内部函数与外部函数自定义的函数有两种:内部函数和外部函数。1.内部函数若函数的存储类型为static型,则称其为内部函数(内部函数又称为静态函数),它表示在由多个源文件组成的同一个程序中,该函数只能在其所在的文件中使用,在其他文件中不可使用。内部函数的声明形式:static返回值类型函数名(参数);例如:staticintStatistic();2.外部函数若函数的存储类型定义为extern型,则称其为外部函数,它表示该函数能被其他源文件调用。函数的默认存储类型为extern型。6.3内部函数与外部函数例4:外部函数的应用示例。下面的程序由3个文件组成:file1.c、file2.c、example6_6.c。在file1.c、file2.c中分别定义了两个外部函数;在example6_6.c中可以分别调用这两个函数。1.file1.c/*file1.c外部函数定义*/externintadd(intm,intn){return(m+n);}2.file2.c/*file2.c外部函数定义*/externintmod(inta,intb){return(a%b);}6.3内部函数与外部函数3.example6_6.c/*example6_6.c调用外部函数*/#includestdio.hexternintmod(inta,intb);/*外部函数声明*/externintadd(intm,intn);/*外部函数声明*/main(){intx,y,result1,result2,result;printf(Pleaseenterxandy:\n);scanf(%d%d,&x,&y);result1=add(x,y);/*调用file1中的外部函数*/printf(x+y=%d\n,result1);if(result10)result2=mod(x,y);/*调用file2中的外部函数*/result=result1-result2;printf(mod(x,y)=%d\n,result2);printf((x+y)-mod(x,y)=%d

1 / 50
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功