第6章-函数与宏定义_第1页
第6章-函数与宏定义_第2页
第6章-函数与宏定义_第3页
第6章-函数与宏定义_第4页
第6章-函数与宏定义_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6章函数与宏定义6.1函数的概念

6.2变量的作用域和存储类型6.3

内部函数与外部函数

6.4

递归函数的设计和调用6.5

预处理

6.6综合范例6.7本章小结6.1函数的概念函数的分类:库函数(标准函数)子函数的三要素:

函数的调用函数的声明函数的定义自定义函数:①主函数:main②子函数[返回值类型符]

函数名([形参说明表]){说明语句;可执行语句;

return(表达式);}函数头函数体函数返回值return(表达式);[返回值类型符]函数类型形参说明表要素1:函数的定义

每一个形参都要单独定义数据类型。例:intabs_sum(intm,intn)

intabs_sum(intm,n)错误正确函数也可以没有形参,此时最好标记为void类型。例:floatfun(void){……}若函数无返回值,则用空类型void来定义函数的返回值。void

abs_sum(intm,intn){if(m<0)m=-m;if(n<0)n=-n;

printf(“Thesumis%d\n”,m+n);

return;

}若在函数的首部省略了函数返回值的类型名,则默认函数返回值的类型为int类型。[int]abs_sum(intm,intn){if(m<0)m=-m;if(n<0)n=-n;

return(m+n);

}return语句

格式1:return(表达式);

return只能返回0或1个值,而不能返回多个值。intfun(inta,intb){intc;c=a+b;

return(a,b,c);}错误格式3:return;格式2:return表达式;等价函数类型为void时用,可以缺省函数体中可以有多个return语句,但只有一个

return语句被执行到。intfun(inta){if(a<0)a=-a;returna;}intfun(inta){if(a>0)returna;elsereturn–a;}函数中没有return语句,并不代表函数没有return值,只是表示函数的返回值是一个不确定的数。函数无返回值时:函数名([实参表]);要素2:函数的调用函数有返回值时:变量名=函数名([实参表]);例6-1分析:P117main7-12abs_sumxyzmn719-1212例6-1:求任意两个整数的绝对值的和。#include<stdio.h>intabs_sum(intm,intn);voidmain(){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(m<0)m=-m;if(n<0)n=-n;return(m+n);}函数调用:实参函数定义:形参方法1:形参变量在接收到实参表传过来的值时,会在内存临时开辟新的空间,以保存形参变量的值。当函数执行完毕时,这些临时开辟的内存空间空间会被释放。形参的值在函数中不论是否发生变化,都不会影响到实参变量的值。实参与形参要求在个数、类型、次序上匹配。

实参/形参的名称可以相同,也可以不同。方法2:#include<stdio.h>voidabs_sum(intx,inty);voidmain(){intx,y;scanf(“%d%d”,&x,&y);

abs_sum(x,y);}voidabs_sum(intx,inty){if(x<0)x=-x;if(y<0)y=-y;printf(“Thesumis%d\n”,x+y);}例6-2:求任意三个整数的绝对值的和。方法1:#include<stdio.h>intabs_sum(intm,intn);voidmain(){intx,y,z,sum;scanf(“%d%d%d”,&x,&y,&z);

sum=abs_sum(abs_sum(x,y),z);printf(“|%d|+|%d|+|%d|=%d\n”,x,y,z,sum);}intabs_sum(intm,intn){if(m<0)m=-m;if(n<0)n=-n;return(m+n);}函数调用:实参函数定义:形参方法2:#include<stdio.h>intabs_sum(intl,intm,intn);voidmain(){intx,y,z,sum;scanf(“%d%d%d”,&x,&y,&z);

sum=abs_sum(x,y,z);printf(“|%d|+|%d|+|%d|=%d\n”,x,y,z,sum);}intabs_sum(intl,intm,intn){if(l<0)l=-l;if(m<0)m=-m;if(n<0)n=-n;return(l+m+n);}例6-3:求任意两数的乘积。#include<stdio.h>floatmul(floata,floatb);voidmain(){floatx,y,z;scanf(“%f%f”,&x,&y);

z=mul(x,y);

mul(x,y);printf(“(%f)*(%f)=%f\n”,x,y,mul(x,y));}floatmul(floata,floatb){returna*b;}函数调用1:有变量接收返回值函数调用2:无变量接收返回值函数调用3:直接输出返回值在调用无参函数时,实参表列可以省略,但括号不能省略。#include<stdio.h>voidfun(void);voidmain(){fun();}voidfun(void){inta=1,b=2;printf(“(%d,%d)\n”,a+=3,b-=2);

}return;函数调用:实参可以省略函数定义:形参用void声明#include<stdio.h>voida(void);voidb(void);voidc(void);voidmain(){……

a();b();c();……}voida(void){……}voidb(void){……}voidc(void){……}函数调用:实参可以省略函数定义:形参用void声明例6-4:[返回值类型符]函数名([形参说明表]);例:intabs_sum(intm,intn);intabs_sum(int,int);第1个问题:写法等价要素3:函数的声明函数声明在形式上与函数头完全一致,只是在最后多了一个分号。第2个问题:缺省情况函数返回值类型为int型。被调函数的定义写在前面,主调函数写在后面。编写程序时最好写上函数声明。#include<stdio.h>floatmul(floata,floatb){returna*b;}voidmain(){……}例6-3:第3个问题:作用目的是让C语言的编译程序检查对函数的调用是否正确。例:#include<stdio.h>intabs_sum(intm,intn);voidmain(){intx,y,z,sum;scanf(“%d%d%d”,&x,&y,&z);

sum=abs_sum(x,y,z);printf(“Thesumis%d\n”,sum);}

intabs_sum(intm,intn){……}第4个问题:位置例:#include<stdio.h>

voidfun1(inta,intb);voidmain(){……}

voidfun1(inta,intb){……}

intfun2(floatx,floaty){…..}位置1:在所有函数的外部函数声明函数fun1()可以被main()、fun2()调用。例:#include<stdio.h>voidmain(){voidfun1(inta,intb);……}

voidfun1(inta,intb){……}

intfun2(floatx,floaty){…..}位置2:在某一个函数的内部函数声明函数fun1()只能被main()调用。例:#include<stdio.h>voidmain(){……}

voidfun1(inta,intb){……}

voidfun1(inta,intb);

intfun2(floatx,floaty){…..}位置3:在某两个函数之间函数声明函数fun1()只能被fun2()调用。实参->形参,单向传递,值传递,虚实结合。实参/形参的名称可以相同,也可以不同。

形参与实参各占一个独立的存储空间。在调用函数时,实参的值将传送给对应的形参,但形参的变化不会影响对应的实参。在同一程序中,形参名只要在同一函数中唯一即可,可以与其他函数中的变量同名。

函数的传值方式:例:#include<stdio.h>voidswap(inta,intb);voidmain(){intx=10,y=20;printf(“(1)x=%dy=%d\n”,x,y);

swap(x,y);printf(“(2)x=%dy=%d\n”,x,y);}

voidswap(inta,intb){intt;t=a;a=b;b=t;}main1020swapxyab10201020tintfun2(…){inta1,b1,c1;

return(c1);}intfun1(…){inta,b,c;intfun2(…);

c=fun2(a,b);

return(c);}voidmain(){ints,x,y;intfun1(…);

s=fun1(x,y);

}函数调用过程举例:#include<stdio.h>intprime(intn){……}voidfactor(intn){……if((n%i==0)&&prime(i))……}voidmain(){……

factor(num);

}因子子函数素数子函数实验指导书P181:求整数n的所有素数因子局部变量:在函数内部或复合语句内部定义的变量。6.2变量的作用域和存储类型变量的作用域:①局部变量的有效范围只限于本函数内部,退出函数,该变量自动失效。全局变量:在函数外部定义的变量。①全局变量的作用域是从该变量定义的位置开始,直到源文件结束。②在同一文件中的所有函数都可以引用全局变量。例1:#include<stdio.h>

voidmain()

{

intx=5;

printf(“xinmainis%d\n”,x);

{

intx=7;

printf(“xininneris%d\n”,x);

}printf(“xinmainis%d\n”,x);

}优先级低优先级高例2:#include<stdio.h>

voida(void);

voidb(void);voidc(void);

intx=1;

voidmain()

{

……}

voida(void)

{……}

voidb(void)

{

……}voidc(void){……}全局变量#include<stdio.h>inta=5,b=7;voidmain(){inta=4,b=5,c;c=plus(a,b);printf(“a+b=%d\n”,c);}plus(intx,inty){intz;z=x+y;return(z);}全局变量,优先级低局部变量,优先级高实验六第三题:变量的存储类型:auto型register型static型extern型内存的动态存储区CPU的寄存器内存的静态存储区程序区静态存储区动态存储区用户区总结局部变量全局变量auto√×register(略)√×static√√extern(略)×√定义变量:[存储类型]数据类型变量名;例:autofloata=2;

staticintx=50;情况1:auto型变量(动态的局部变量)局部变量的存储类型默认值为auto型。

auto型只用于定义局部变量。

auto型变量在进入所在函数时才建立,退出该函数时撤销。

未赋初值的auto变量其值不确定。例:inta,b=3;

autointa,b=3;等价情况2:static型变量(静态的局部变量)在整个程序运行期间,static型变量占据着永久性的存储单元。下次调用该函数时,该变量拥有最近一次退出该函数时的值,该值将被保留。

static型变量的初始化只执行一次。

若定义时没有赋初值,则系统会自动为其赋0值。虽然静态局部变量在函数调用结束后仍然存在,但其他函数不能引用它。例1:#include<stdio.h>intfun(inta);voidmain(){inti,j=2;for(i=0;i<3;i++)printf(“%4d”,fun(j));}

intfun(inta){intb=0;

b++;c++;return(a+b+c);}staticintc=3;输出结果:789staticintc;输出结果:456#include<stdio.h>intd=1;f(intp){staticintd=5;d+=p;printf(“%d”,d);return(d);}voidmain(){inta=3;printf(“%d

”,f(a+f(d)));}输出结果:61515实验六第五题:注意空格源程序(.c)目标程序(.obj)可执行程序(.exe)结果编译建立/链接运行编译预处理所有编译预处理都是以“#”号开头,单占源程序中的一行,一般是放在源程序的首部。6.5预处理C语言提供3种编译预处理命令:宏定义文件包含条件编译6.5.1宏定义情况1:不带参数的宏例:#definePI3.14格式:#define宏名字符串宏定义的作用是用宏名来代表一串字符串。宏名一般采用大写字母。宏替换不进行任何计算,也不进行语法检查。不能替换双引号中与宏名相同的字符串。宏名的有效范围是从定义命令之后,直到源程序文件结束,或遇到宏定义终止命令#undef为止。例:#include<stdio.h>

#defineG9.8

#definePI3.14159voidmain()

{……}#undefPIvoidf1(){……}voidf2(){……}#include<stdio.h>#defineS(a,b)a+bvoidmain(){intm=3,n=2,x=4,y=5,area1,area2;

area1=S(m,n);area2=5*S(x,y);printf(“area1=%d\narea2=%d\n”,area1,area2);}area1=m+n;area2=5*x+y;改成:#defineS(a,b)(a+b)情况2:带参数的宏格式:#define宏名(参数表)字符串#include<stdio.h>#defineS(a,b)(a*b)voidmain(){intm=3,n=2,x=4,y=5,area1,area2;

area1=S(m,n);area2=S(x+1,y+2);printf(“area1=%d\narea2=%d\n”,area1,area2)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论