资源预览内容
第1页 / 共49页
第2页 / 共49页
第3页 / 共49页
第4页 / 共49页
第5页 / 共49页
第6页 / 共49页
第7页 / 共49页
第8页 / 共49页
第9页 / 共49页
第10页 / 共49页
亲,该文档总共49页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义第六章第六章函数与宏定义函数与宏定义 6.1函数概念函数概念 6.2变量作用域和存储类型变量作用域和存储类型 6.3内部函数与外部函数内部函数与外部函数 6.4递归函数设计和调用递归函数设计和调用 6.6综合范例综合范例 9/18/20241C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义6.1函数概念函数概念 C语言允许把问题设计成一个一个的模块,程序通过调用语言允许把问题设计成一个一个的模块,程序通过调用模块功能来解决问题。这些模块通常都是通过函数来实模块功能来解决问题。这些模块通常都是通过函数来实现的,又可称其为现的,又可称其为函数模块函数模块。 C语言中,函数可分为两类语言中,函数可分为两类:一类是由系统定义的一类是由系统定义的标准函数标准函数,又称为,又称为库函数库函数,其函数,其函数声明一般是放在系统的声明一般是放在系统的include目录下以目录下以.h为后缀的头文为后缀的头文件中,如在程序中要用到某个库函数,必须在调用该函件中,如在程序中要用到某个库函数,必须在调用该函数之前用数之前用#include命令将库函数信息包含到命令将库函数信息包含到本程序中。本程序中。另一类函数是另一类函数是自定义函数自定义函数,两种形式:,两种形式:第一种:第一种:函数声明、函数调用、函数定义。函数声明、函数调用、函数定义。第二种:第二种:函数定义、函数调用。函数定义、函数调用。9/18/20242C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义6.1.1函数定义函数定义函数定义的一般形式可以有两种。函数定义的一般形式可以有两种。形式一:形式一:存存储储类类型型符符返返回回值值类类型型符符函函数数名名(形形参参说说明明表表)函数语句体函数语句体形式二:形式二:存存储储类类型型符符返返回回值值类类型型型型符符函函数数名名(形形参参表表)形参说明;形参说明;函数语句体函数语句体9/18/20243C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义说明:说明:1存储类型符存储类型符指的是函数的作用范围,它只有两种指的是函数的作用范围,它只有两种形式:形式:static和和extern。static说明函数只能作用于其所在的源文件,用说明函数只能作用于其所在的源文件,用static说说明的函数又称为明的函数又称为内部函数内部函数。extern说明函数可被其它源文件中的函数调用,用说明函数可被其它源文件中的函数调用,用extern说明的函数,又称为说明的函数,又称为外部函数外部函数。缺省缺省情况为情况为extern。2返返回回值值类类型型符符指指的的是是函函数数体体语语句句执执行行完完成成后后,函函数数返返回回的的值值的的类类型型,如如int,float,char等等等等,若若函函数数无返回值,则用无返回值,则用空类型空类型void来定义函数的返回值。来定义函数的返回值。缺省缺省情况为情况为int型。型。9/18/20244C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义3函数名函数名由任何合法的标识符构成。建议将函数名由任何合法的标识符构成。建议将函数名的命名与函数内容有一定关系。的命名与函数内容有一定关系。4在在第第一一种种函函数数定定义义的的形形式式中中,形形参参说说明明表表是是一一系系列用逗号分开的每个形参变量说明。列用逗号分开的每个形参变量说明。如:如:intx,inty,intz这表示形参变量有三个:这表示形参变量有三个:x,y,z。它们的类型都是它们的类型都是int型。型。在在第第二二种种函函数数定定义义的的形形式式中中,形形参参表表是是一一系系列列用用逗号分开的形参变量。如:逗号分开的形参变量。如:x,y,z5函数语句体函数语句体是放在一对花括号是放在一对花括号中,由局部数据中,由局部数据类型描述和功能实现两部分组成。类型描述和功能实现两部分组成。9/18/20245C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义6函数返回语句函数返回语句的形式有以下两种:的形式有以下两种:函数无返回值的情况:函数无返回值的情况:return;函数有返回值的情况:函数有返回值的情况:return(表达式的值表达式的值);在在第第种种情情况况下下要要注注意意“表表达达式式的的值值”的的类类型型必必须须与与函数返回值的类型相一致。函数返回值的类型相一致。例例如如:求求两两个个任任意意整整数数的的绝绝对对值值的的和和,用用函函数数abs_sum()实现。实现。/*直接调用库函数来计算直接调用库函数来计算m和和n的绝对值的绝对值*/intabs_sum(intm,intn)return(abs(m)+abs(n);/*函数函数abs()是在头文件是在头文件math.h中声明的中声明的*/9/18/20246C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义函数定义如下:函数定义如下:intabs_sum(intm,intn)if(m0)m=-m;if(n0)n=-n;return(m+n);6.1.2函数声明和调用函数声明和调用一函数的声明一函数的声明函数声明的一般形式:函数声明的一般形式:存存储储类类型型符符返返回回值值类类型型符符函函数数名名(形形参参说说明明表表);如:如:intabs-sun(intm,intn);9/18/20247C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义二函数调用二函数调用函数调用是通过函数调用语句来实现的,分两种形式:函数调用是通过函数调用语句来实现的,分两种形式:无返回值的情况:无返回值的情况:函数名函数名(实参表实参表);有有返返回回值值的的情情况况:变变量量名名函函数数名名(实实参参表表);该变量名的类型必须与函数的返回值类型相同。该变量名的类型必须与函数的返回值类型相同。函函数数调调用用时时都都会会去去执执行行函函数数语语句句中中的的内内容容,函函数数执执行行完完毕后,回到函数的调用处,继续执行下面的语句。毕后,回到函数的调用处,继续执行下面的语句。9/18/20248C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义6.1.3函数的传值方式函数的传值方式函数的传值方式函数的传值方式:采用实参表将每一个实参的值相应地传递给每一个形采用实参表将每一个实参的值相应地传递给每一个形参变量,形参变量在接收到实参表传过来的值时,会在内参变量,形参变量在接收到实参表传过来的值时,会在内存存临时开辟新的空间临时开辟新的空间,以保留形参变量的值,当函数执行,以保留形参变量的值,当函数执行完毕时,这些完毕时,这些临时开辟的内存空间会被释放临时开辟的内存空间会被释放,并且形参的,并且形参的值在函数中不论是否发生变化,值在函数中不论是否发生变化,都不会影响到实参变量的都不会影响到实参变量的值的变化值的变化,这就是函数的传值方式。,这就是函数的传值方式。自定义函数在程序中的使用顺序有两种形式:自定义函数在程序中的使用顺序有两种形式:先进行函数声明,再进行函数调用,先进行函数声明,再进行函数调用,函数定义放在函数定义放在函数调用之后。函数调用之后。函数声明在函数调用之前。函数声明在函数调用之前。函数定义放在函数调用之前。函数定义放在函数调用之前。9/18/20249C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义【例例6-1】编编程程序序,通通过过调调用用函函数数abs-sum(),求求任任意意两个整数的绝对值的和。两个整数的绝对值的和。/*exam6_1.c调用函数求两整数绝对值的和调用函数求两整数绝对值的和*/#includeintabs_sum(intm,intn);main()intx,y,z;scanf(%d%d,&x,&y);z=abs_sum(x,y);printf(sumis%d,z);intabs_sum(intm,intn)if(m0)m=-m;if(n0)n=-n;returnm+n;程序运行结果程序运行结果程序运行结果程序运行结果: :712712 sumis19sumis199/18/202410C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义用传值方式调用函数时,实参也可以是函数调用语句用传值方式调用函数时,实参也可以是函数调用语句【例【例6-2】求任意三个数的绝对值的和。】求任意三个数的绝对值的和。/*exam6_2.c调用函数求三个整数绝对值的和调用函数求三个整数绝对值的和*/#includeintabs_sum(intm,intn);main()intx,y,z,sum;scanf(%d%d%d,&x,&y,&z);sum=abs_sum(abs_sum(x,y),z);printf(sumis%d,sum);intabs_sum(intm,intn)if(m0)m=-m;if(n0)n=-n;returnm+n;程序运行结果程序运行结果:7125 sumis249/18/202411C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义注意:注意:对于有返回值的函数,调用时若没有把它赋给某个变量,对于有返回值的函数,调用时若没有把它赋给某个变量,仍然是可以的,只是函数的返回值有可能会被丢失。仍然是可以的,只是函数的返回值有可能会被丢失。【例【例6-3】求任意两数的乘积。求任意两数的乘积。自定义一个函数自定义一个函数mul(),用于求两数的乘积,程序:用于求两数的乘积,程序:/*exam6_3.c求两个数的乘积求两个数的乘积*/#includefloatmul(floata,floatb);main()floatx,y,z;scanf(%f%f,&x,&y);z=mul(x,y);/*/x=x+10;y=y-10;mul(x,y);/*/9/18/202412C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义x=x*2;y=y*2;printf(z=%f,mul(%f,%f)=%fn,z,x,y,mul(x,y);/*/floatmul(floata,floatb)returna*b;程序运行结果程序运行结果:56 z=30.000000,mul(30.000000,-8.000000)=-240.0000009/18/202413C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义程序说明程序说明:注释注释处调用函数后的返回值赋给变量处调用函数后的返回值赋给变量z。注释注释处调用函数后的返回值没有赋给任何变量,处调用函数后的返回值没有赋给任何变量,函数的返回值被丢失。函数的返回值被丢失。注释注释处调用函数后的返回值成为了处调用函数后的返回值成为了printf()函数的函数的参数。参数。9/18/202414C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义6.2变量作用域和存储类型变量作用域和存储类型 一变量的作用域一变量的作用域变量的作用域:指的是变量的作用域:指的是变量的有效范围变量的有效范围,针对变量不同,针对变量不同的作用域,可把变量分为局部变量和全局变量。的作用域,可把变量分为局部变量和全局变量。局部变量局部变量:在函数内部或某个控制块的内部定义的变量:在函数内部或某个控制块的内部定义的变量为局部变量,局部变量的有效范围只限于为局部变量,局部变量的有效范围只限于本函数内部本函数内部,退出函数,该变量自动失效。退出函数,该变量自动失效。全局变量全局变量:在函数外面定义的变量称为全局变量,全局变:在函数外面定义的变量称为全局变量,全局变量的作用域是从该变量定义的位置开始,直到源文件结束。量的作用域是从该变量定义的位置开始,直到源文件结束。在在同一文件同一文件中的所有函数都可以引用全局变量。中的所有函数都可以引用全局变量。9/18/202415C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义局部变量和全局变量的局部变量和全局变量的作用域作用域如图所示:如图所示:9/18/202416C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义【例【例6-4】变量作用域应用举例,阅读下面的程序,变量作用域应用举例,阅读下面的程序,注意区分局部变量和全局变量的作用域。注意区分局部变量和全局变量的作用域。/*exam6_4.c变量作用域举例变量作用域举例*/#includevoida(void);voidb(void);voidc(void);intx=1;main()intx=5;printf(localxinouterscopeofmainis%dn,x);9/18/202417C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义intx=7;printf(localxininnerscopeofmainis%dn,x);printf(localxinouterscopeofmainis%dn,x);a();b();c();a();b();c();前三次前三次输出输出结果结果:localxinouterscopeofmainis5localxininnerscopeofmainis7localxinouterscopeofmainis59/18/202418C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义printf(localxinmainis%dn,x);getchar();return0;voida(void)intx=25;printf(nlocalxinais%dafterenteringan,x);+x;printf(localxinais%dbeforeexitingan,x);9/18/202419C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义voidb(void)staticintx=50;printf(nlocalstaticxis%donenteringbn,x);+x;printf(localstaticxis%donexitingbn,x);voidc(void)printf(nglobalxis%donenteringcn,x);x*=10;printf(globalxis%donexitingcn,x);9/18/202420C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义程序运行结果程序运行结果:后后6次次函数调用函数调用localxinais25afterenteringalocalxinais26beforeexitingalocalstaticxis50onenteringblocalstaticxis51onexitingbglobalxis1onenteringcglobalxis10onexitingclocalxinais25afterenteringalocalxinais26beforeexitingalocalstaticxis51onenteringblocalstaticxis52onexitingbglobalxis10onenteringcglobalxis100onexitingc最后一次输出:最后一次输出:localxinmainis59/18/202421C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义二变量的存储类型二变量的存储类型变量的存储类型:指的是变量的变量的存储类型:指的是变量的存储属性存储属性,它说明,它说明变量变量占用存储空间的区域。占用存储空间的区域。在内存中,供用户使用的存储区由在内存中,供用户使用的存储区由程序区程序区、静态存储区静态存储区和和动态存储区动态存储区三部分组成。三部分组成。变量的存储类型有四种:变量的存储类型有四种:auto型、型、register型、型、static型和型和extern型。型。auto型型变量存储在内存的变量存储在内存的动态存储区动态存储区。register型变量保存在型变量保存在寄存器寄存器中。中。static型变量和型变量和extern型变量型变量存储在存储在静态存储器静态存储器。9/18/202422C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义局部变量局部变量的存储类型缺省值为的存储类型缺省值为auto型型。全局变量全局变量的存储类型缺省值为的存储类型缺省值为extern型型。auto型变量和型变量和register型变量只用于定义局部变量。型变量只用于定义局部变量。static型变量即可定义成局部变量,又可定义成全局变量。型变量即可定义成局部变量,又可定义成全局变量。【例【例6-5】设计一个函数:设计一个函数:longfac(intn),可用来计算可用来计算15的阶乘。的阶乘。分析:可在函数中定义一个分析:可在函数中定义一个static型变量,用来保存型变量,用来保存上次的计算结果。上次的计算结果。9/18/202423C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义/*exam6_5.c用用static型型变变量量保保留留上上次次阶阶乘乘的的值值*/#includelongfac(intn)staticintf=1;f=f*n;returnf;main()inti;for(i=1;i=5;i+)printf(%d!=%ldn,i,fac(i);程序运行结果程序运行结果:1!=12!=23!=64!=245!=120局部变量局部变量局部变量局部变量f f被定义成被定义成被定义成被定义成staticstatic型的,因型的,因型的,因型的,因此,它只在该函数第此,它只在该函数第此,它只在该函数第此,它只在该函数第1 1次被调用的次被调用的次被调用的次被调用的时候初始化其值为时候初始化其值为时候初始化其值为时候初始化其值为1 1,以后再调用,以后再调用,以后再调用,以后再调用该函数时,不再进行初始化,而该函数时,不再进行初始化,而该函数时,不再进行初始化,而该函数时,不再进行初始化,而是使用上一次调用的值。是使用上一次调用的值。是使用上一次调用的值。是使用上一次调用的值。 9/18/202424C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义6.3内部函数与外部函数内部函数与外部函数 一内部函数一内部函数若函数的存储类型为若函数的存储类型为static型,则称其为型,则称其为内部函数内部函数或称或称静态静态函数函数,它表示在同一个程序中(由多个源文件组成),该,它表示在同一个程序中(由多个源文件组成),该函数只能在一个文件中存在,在其它文件中不可使用。函数只能在一个文件中存在,在其它文件中不可使用。如:如:staticintfun-name();内部函数只能被其所在的源文件调用。内部函数只能被其所在的源文件调用。二外部函数二外部函数若函数的存储类型定义为若函数的存储类型定义为extern型,则称其为型,则称其为外部函数外部函数,它表示该函数能被其它源文件调用。函数的缺省存储类它表示该函数能被其它源文件调用。函数的缺省存储类型为型为extern型。型。注意:注意:在需要用到外部函数的文件中,其函数声明必须在需要用到外部函数的文件中,其函数声明必须用用extern进行说明。进行说明。9/18/202425C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义例如:有两个源文件例如:有两个源文件file1.c和和file2.c如下所示:如下所示:/*file1.c调用外部函数调用外部函数*/#includeintmod(inta,intb);externintadd(intm,intn);/*外部函数声明外部函数声明*main()intx,y,result;scanf(“%d%d”,&x,&y);result=add(x,y);/*调用外部函数调用外部函数*/if(result0)result=result-mod(x,y);printf(“result=%dn”,result);9/18/202426C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义intmod(inta,intb)return(a%d);/*file2.c外部函数外部函数*/externintadd(intm,intn)return(m+n);说明:说明:1在文件在文件1(file1.c)中的函数声明:中的函数声明:intmod(inta,intb);实际上相当于:实际上相当于:externintmod(inta,intb);9/18/202427C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义2在文件在文件2(file2.c)中的函数定义:中的函数定义:externintadd(intm,intn)return(m+n);实际上相当于:实际上相当于:intadd(intm,intn)return(m+n);3由多个源文件组成一个程序时,由多个源文件组成一个程序时,main()函数只能函数只能出现在一个源文件中。出现在一个源文件中。9/18/202428C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义4多个源文件的连接方式有三种:多个源文件的连接方式有三种:将各源文件分别编译成目标文件,得到多个目标文件将各源文件分别编译成目标文件,得到多个目标文件(.obj后缀),然后用连接命令(后缀),然后用连接命令(tlink)把多个把多个.obj文件文件连接起来,在连接起来,在Turboc上用如下命令:上用如下命令:tlinkfile1.obj+file2.obj+filen.obj生成一个生成一个file1.exe的可执行文件。的可执行文件。建立项目文件(建立项目文件(.prj后缀),具体操作可参阅各种后缀),具体操作可参阅各种C编译手册。编译手册。使用文件包含命令。使用文件包含命令。9/18/202429C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义6.4递归函数设计和调用递归函数设计和调用 C语言中一个函数中的语句可以是对另一个函数的调用。语言中一个函数中的语句可以是对另一个函数的调用。函数嵌套调用函数嵌套调用图例:图例:调用过程按图中箭头所示的方向和顺序进行,属于一种调用过程按图中箭头所示的方向和顺序进行,属于一种线性调用关系线性调用关系,每次调用后,最终返回到原调用点,继,每次调用后,最终返回到原调用点,继续执行以下语句。续执行以下语句。9/18/202430C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义C语言中还允许在函数中语言中还允许在函数中调用自身调用自身,或函数之间相,或函数之间相互调用,这种调用方式称之为互调用,这种调用方式称之为递归递归。递归又分为。递归又分为直直接递归调用接递归调用和和间接递归调用间接递归调用。直接递归调用;函数直接调用自身。直接递归调用;函数直接调用自身。间接递归调用:函数互相调用对方。间接递归调用:函数互相调用对方。直接递归:直接递归:inttemp(intx)inty,z;z=temp(y);9/18/202431C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义间接递归:间接递归:显然,递归有可能陷入无限递归状态,最终导致错误发显然,递归有可能陷入无限递归状态,最终导致错误发生。因此,生。因此,设计一个递归问题必须具备两个条件设计一个递归问题必须具备两个条件:1后一部分与原始问题类似。后一部分与原始问题类似。2后一问题是原始问题的简化。后一问题是原始问题的简化。9/18/202432C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义【例【例6-6】编程,从键盘输入一个正整数编程,从键盘输入一个正整数n,求求n!。n!的数字表达式为:的数字表达式为:n!=定义一个求定义一个求n!的函数:的函数:longfac(intn)longfac(intn)longresult;if(n=0|n=1)result=1;elseresult=n*fac(n-1);return(result);9/18/202433C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义完整程序如下:完整程序如下:/*exam6_6.c用递归法求用递归法求n!*/#includelongfac(intn)longresult;if(n=0|n=1)result=1;elseresult=n*fac(n-1);returnresult;main()intx;longf;9/18/202434C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义scanf(%d,&x);if(x1)设计一个函数:设计一个函数:longfibonacci(intn)用于计算数用于计算数列中第列中第n项的值,项的值,9/18/202436C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义程序如下所示:程序如下所示:/*exam6_7.c求第求第n项项Fibonacci数列的值数列的值*/#includelongfibonacci(intn);main()intx=0;longresult;doresult=fibonacci(x);printf(fibonacci(%d)=%ldn,x,result);scanf(%d,&x);while(x!=-1);9/18/202437C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义longfibonacci(intn)if(n=0|n=1)returnn;elsereturnfibonacci(n-1)+fibonacci(n-2);程序运行结果程序运行结果程序运行结果程序运行结果: :fibonacci(0)=0fibonacci(0)=03 3 fibonacci(3)=2fibonacci(3)=24 4 fibonacci(4)=3fibonacci(4)=36 6 9/18/202438C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义以以x=4为例,下图说明了为例,下图说明了fibonacci函数是怎样计算函数是怎样计算fibonacci(4)的。图中把的。图中把fibonacci简写成简写成f。9/18/202439C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义6.6综合范例综合范例【例【例6-12】在屏幕上画一个在屏幕上画一个1818大小的棋盘。大小的棋盘。程序如下:程序如下:/*exam6_12.c在屏幕上画一个棋盘在屏幕上画一个棋盘*/#include#include#include/*定义画棋盘所需的制表符定义画棋盘所需的制表符*/#defineLU0xda/*左上角左上角*/#defineRU0xbf/*右上角右上角*/#defineLD0xc0/*左下角左下角*/#defineRD0xd9/*右下角右下角*/#defineL0xc3/*左边左边*/#defineR0xb4/*右边右边*/9/18/202440C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义#defineU0xc2/*上边上边*/#defineD0xc1/*下边下边*/#defineCROSS0xc5/*十字叉十字叉*/*棋盘左上角坐标棋盘左上角坐标*/#defineMAP_X5#defineMAP_Y5voiddraw_cross(intx,inty);voiddraw_map();main()textmode(C40);draw_map();9/18/202441C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义/*函数定义函数定义:*/voiddraw_map()/*画棋盘画棋盘*/inti,j;for(i=0;i19;i+)for(j=0;j19;j+)draw_cross(i,j);voiddraw_cross(intx,inty)gotoxy(x+MAP_X,y+MAP_Y);textcolor(GREEN);if(x=0&y=0)putch(LU);/*画左上角画左上角*/return;9/18/202442C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义if(x=0&y=18)putch(LD);/*画左下角画左下角*/return;if(x=18&y=0)putch(RU);/*画右上角画右上角*/return;if(x=18&y=18)putch(RD);/*画右下角画右下角*/return;9/18/202443C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义if(x=0)putch(L);/*画左边画左边*/return;if(x=18)putch(R);/*画右边画右边*/return;if(y=0)putch(U);/*画上边画上边*/return;9/18/202444C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义if(y=18)putch(D);/*画下边画下边*/return;putch(CROSS);/*画十字叉画十字叉*/程序中程序中宏定义的制表符的值宏定义的制表符的值可从可从ASC码表中查得,如:码表中查得,如:0xbf为十六进制表示,它代表右上角制表符为十六进制表示,它代表右上角制表符“”。该程序必须在纯该程序必须在纯DOS模式下运行,其运行结果是在屏模式下运行,其运行结果是在屏幕上显示一个绿色的幕上显示一个绿色的1818大小的方格棋盘,大小的方格棋盘,如后图所示。如后图所示。9/18/202445C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义该程序显示一个绿色的该程序显示一个绿色的1818大小的方格棋盘大小的方格棋盘9/18/202446C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义【例【例6-13】将一个字符串的字符反向输出到屏幕。将一个字符串的字符反向输出到屏幕。采用递归函数调用方法,程序如下:采用递归函数调用方法,程序如下:/*exam6_13.c反向显示字符串反向显示字符串*/#include#includevoidbackwards(chars,intindex);/*函数声明函数声明*/main()charstr80;/*定义字符数组定义字符数组*/intindex=0;strcpy(str,Showthisstring.);/*字符串拷贝字符串拷贝*/backwards(str,index);/*函数调用函数调用*/9/18/202447C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义voidbackwards(chars,intindex)/*函数定义函数定义*/if(sindex)printf(%c,sindex);/*输出字符输出字符*/backwards(s,index+1);/*递归调用递归调用*/printf(%c,sindex);/*输出字符输出字符*/程序运行结果程序运行结果:Showthisstring.gnirtssihtwohS9/18/202448C C 程序设计基础教程程序设计基础教程第六章第六章函数与宏定义函数与宏定义小小结:介绍了函数的定义和传值调用函数的使用方法介绍了函数的定义和传值调用函数的使用方法。注意:若用全局变量作为函数的参数,则在函数中可注意:若用全局变量作为函数的参数,则在函数中可以使得该全局变量的值发生变化。以使得该全局变量的值发生变化。对于递归函数的设计一定要有可使递归结束的条件,对于递归函数的设计一定要有可使递归结束的条件,否则会使程序产生无限递归。否则会使程序产生无限递归。使用预处理命令时,要注意以下几点:使用预处理命令时,要注意以下几点:1宏替换定义的末尾不能使用分号宏替换定义的末尾不能使用分号“;”。2在有参数的宏定义中,参数加括号和不加括号有时在有参数的宏定义中,参数加括号和不加括号有时会有区别。会有区别。3使用文件包含时,要避免出现变量和函数发生重定使用文件包含时,要避免出现变量和函数发生重定义的现象。义的现象。4要区分条件编译与条件语句的作用。要区分条件编译与条件语句的作用。9/18/202449
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号