函数与编译预处理讲稿.ppt
《函数与编译预处理讲稿.ppt》由会员分享,可在线阅读,更多相关《函数与编译预处理讲稿.ppt(67页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、关于函数与编译预处理关于函数与编译预处理第一页,讲稿共六十七页哦第第7章章 函数与函数与预处理命令理命令7.1 概述概述7.2 函数的定义与调用函数的定义与调用7.3 变量作用域与存储方式变量作用域与存储方式7.4 编译预处理编译预处理2第二页,讲稿共六十七页哦7.1 概述概述 程序结构清晰,可读性好。程序结构清晰,可读性好。程序结构清晰,可读性好。程序结构清晰,可读性好。减少重复编码的工作量。减少重复编码的工作量。减少重复编码的工作量。减少重复编码的工作量。可多人共同编制一个大程序,缩短程序设计周期,可多人共同编制一个大程序,缩短程序设计周期,可多人共同编制一个大程序,缩短程序设计周期,可多
2、人共同编制一个大程序,缩短程序设计周期,提高程序设计和调试的效率。提高程序设计和调试的效率。提高程序设计和调试的效率。提高程序设计和调试的效率。使用函使用函使用函使用函数的数的数的数的好处好处好处好处C程序程序源程序文件源程序文件n函数函数1函数函数m 源程序文件源程序文件1函数函数1函数函数n3第三页,讲稿共六十七页哦【例例7.1】求一个整数的立方。求一个整数的立方。int cube(int x)/*函数定义函数定义*/return(x*x*x);main()int f,a;printf(nEnter an integer number:);scanf(%d,&a);f=cube(a);pr
3、intf(%d*%d*%d=%dn,a,a,a,f);程序运行情况如下:程序运行情况如下:Enter an integer number:2 2*2*2=8函数调用函数调用函数调用函数调用程序的执行总是程序的执行总是从从main函数开始函数开始4第四页,讲稿共六十七页哦 一个一个C C源程序源程序源程序源程序可以由可以由一个或多个源程序文件一个或多个源程序文件一个或多个源程序文件一个或多个源程序文件组成。组成。C编译系统在对编译系统在对C源程序进行编译时是以文件为单位进源程序进行编译时是以文件为单位进行的。行的。一个一个C C源程序文件源程序文件源程序文件源程序文件可以由可以由一个或多个函数一
4、个或多个函数一个或多个函数一个或多个函数组成。所组成。所有函数都是独立的。主函数可以调用其它函数,其它函数有函数都是独立的。主函数可以调用其它函数,其它函数可以相互调用。可以相互调用。在一个在一个C程序中,有且仅有一个主函数程序中,有且仅有一个主函数main。C程序程序的执行总是从的执行总是从main函数开始,调用其它函数后最终回函数开始,调用其它函数后最终回到到mainmain函数,在函数,在mainmain函数中结束整个程序的运行。函数中结束整个程序的运行。说明说明5第五页,讲稿共六十七页哦 函数的种函数的种类从函数定从函数定义形式分:形式分:有参函数有参函数有参函数有参函数在主调(用)函
5、数和被调(用)在主调(用)函数和被调(用)在主调(用)函数和被调(用)在主调(用)函数和被调(用)函数之间通过参数进行数据传函数之间通过参数进行数据传函数之间通过参数进行数据传函数之间通过参数进行数据传递,递,递,递,如:如:如:如:int cube(int x)无参函数无参函数无参函数无参函数如:如:如:如:getchar()getchar()在调用无参函数时,主调函在调用无参函数时,主调函在调用无参函数时,主调函在调用无参函数时,主调函数不需要将数据传递给无参数不需要将数据传递给无参数不需要将数据传递给无参数不需要将数据传递给无参函数。函数。函数。函数。从使用的角度看:从使用的角度看:从使
6、用的角度看:从使用的角度看:标准函数(库函数)标准函数(库函数)库函数是由系统提供的。库函数是由系统提供的。库函数是由系统提供的。库函数是由系统提供的。如:如:getchargetchar()()、sin(x)sin(x)等。等。等。等。在程序中可在程序中可以直接调用它们。附录以直接调用它们。附录A A列出了列出了C C的部分库函数。的部分库函数。用户自定义函数用户自定义函数如如如如:例例例例7.17.1中的中的中的中的cubecube函数。函数。函数。函数。6第六页,讲稿共六十七页哦【例例7.2】无参函数的定无参函数的定义与与调用。用。void welcome()printf(*n);pri
7、ntf(*n);printf(Welcome to China n);printf(Welcome to China n);printf(*n);printf(*n);main()main()welcome();程序的输出结果如下:程序的输出结果如下:*Welcome to China*7第七页,讲稿共六十七页哦7.2.1 函数的定函数的定义函数定义的一般形式函数定义的一般形式函数定义的一般形式函数定义的一般形式函数类型函数类型 函数名函数名(类型名类型名 形式参数形式参数1,)说明语句说明语句 执行语句执行语句 例如:求两个数的最大值。例如:求两个数的最大值。int max(int x,in
8、t y)int z;z=x y?x:y;return(z);类型省略时类型省略时类型省略时类型省略时默认为默认为默认为默认为intint类类类类型型型型有形式参数,有形式参数,有形式参数,有形式参数,maxmax为为为为有参函数有参函数有参函数有参函数 8第八页,讲稿共六十七页哦int max(x,y)int max(x,y)int x,y;int x,y;int z;int z;z=x y?x:y;z=x y?x:y;return(z);return(z);int max(x,y)int x,y;或或int max(int x,y)int max(int x,y)或或int max(x,y)
9、int x,y,z;z=x y?x:y;return(z);花括号中也可以为空,这种函数叫花括号中也可以为空,这种函数叫花括号中也可以为空,这种函数叫花括号中也可以为空,这种函数叫空函数空函数空函数空函数 。例如:例如:null()null()null()null()不能在函数体内定义其他函数,即函数不能在函数体内定义其他函数,即函数不能在函数体内定义其他函数,即函数不能在函数体内定义其他函数,即函数不能嵌套定义不能嵌套定义不能嵌套定义不能嵌套定义。形参也可以这样定义形参也可以这样定义如下定义都是错误的如下定义都是错误的 9第九页,讲稿共六十七页哦函数名(实参表列)函数名(实参表列)在在C语言
10、中,把函数调用也作为一个表达式。因语言中,把函数调用也作为一个表达式。因此凡是表达式可以出现的地方都可以出现函数调用。此凡是表达式可以出现的地方都可以出现函数调用。例如:例如:welcome();if(iabs(a)max)max=iabs(a);m=max(c,max(a,b);7.2.2 函数的调用函数的调用函数调用的一般形式:函数调用的一般形式:10第十页,讲稿共六十七页哦int sum()int sum()int i,t=0;int i,t=0;for(i=1;i=100;i+)t+=i;t+=i;return(t);return(t);main()main()int s;int s;
11、s=sum();s=sum();printf(%dn,s);printf(%dn,s);程序输出结果:程序输出结果:5050int sum(int x)int i,t=0;for(i=1;iy?x:y;return(z);return(z);/*/*返回返回返回返回z z的的的的值值*/main()main()int a,b,c;scanf(%d,%d,&a,&b);scanf(%d,%d,&a,&b);c=c=maxmax(a,b);printf(max is%dn,c);15第十五页,讲稿共六十七页哦函数的返回函数的返回值是通是通过returnreturn语语句句句句带带回到主回到主回到主
12、回到主调调函数的。函数的。函数的。函数的。功能:功能:功能:功能:终终止函数的运行,返回主止函数的运行,返回主止函数的运行,返回主止函数的运行,返回主调调函数,若有返回函数,若有返回函数,若有返回函数,若有返回值值,将返回将返回将返回将返回值带值带回主回主回主回主调调函数。函数。函数。函数。说明:说明:说明:说明:若函数没有返回值,若函数没有返回值,若函数没有返回值,若函数没有返回值,return语句可以省略。语句可以省略。语句可以省略。语句可以省略。returnreturn语句中的表达式类型一般应和函数的类型一语句中的表达式类型一般应和函数的类型一语句中的表达式类型一般应和函数的类型一语句中
13、的表达式类型一般应和函数的类型一致,致,致,致,如果不一致,如果不一致,如果不一致,如果不一致,VCVC系统警告的同时自动将表达式类系统警告的同时自动将表达式类系统警告的同时自动将表达式类系统警告的同时自动将表达式类型转换为函数类型型转换为函数类型型转换为函数类型型转换为函数类型。函数的返回值函数的返回值return 语句格式:语句格式:return (表达式表达式表达式表达式);return return 表达式表达式;return;return;16第十六页,讲稿共六十七页哦【例例7.6】计算并输出圆的面积。计算并输出圆的面积。s(int r)return 3.14*r*r;main()i
14、nt r,area;scanf(%d,&r);printf(%dn,s(r);自动转换自动转换自动转换自动转换为为为为intint型型型型 思考:思考:若要得到双精度实型的圆面积,程序应如何修改若要得到双精度实型的圆面积,程序应如何修改程序运行情况如下:程序运行情况如下:2 1217第十七页,讲稿共六十七页哦 7.2.4 对被调函数的声明和函数原型对被调函数的声明和函数原型变量要变量要变量要变量要先定义后使用先定义后使用先定义后使用先定义后使用,函函函函数也如此数也如此数也如此数也如此。即。即。即。即被调函数的定义要被调函数的定义要被调函数的定义要被调函数的定义要出现在主调函数的定义之前出现在
15、主调函数的定义之前出现在主调函数的定义之前出现在主调函数的定义之前。如。如。如。如swapswapswapswap函数函数函数函数:允许整型函数(且参数也允许整型函数(且参数也允许整型函数(且参数也允许整型函数(且参数也是整型)的定义出现在主调函是整型)的定义出现在主调函是整型)的定义出现在主调函是整型)的定义出现在主调函数之后。如数之后。如数之后。如数之后。如maxmaxmaxmax函数函数:如果非整型函数在主调函如果非整型函数在主调函如果非整型函数在主调函如果非整型函数在主调函数之后定义,则应在主调函数数之后定义,则应在主调函数数之后定义,则应在主调函数数之后定义,则应在主调函数中或主调函
16、数之前对中或主调函数之前对中或主调函数之前对中或主调函数之前对被调函数被调函数进行声明。进行声明。void swap(int x,int y)main()swap(a,b);main()main()c=max(a,b);c=max(a,b);max(int x,int y)18第十八页,讲稿共六十七页哦对被被调函数函数进行声明的一般形式行声明的一般形式 函数函数函数函数类类型型型型 函数名(函数名(函数名(函数名(参数参数参数参数类类型型型型1 1 1 1 参数名参数名参数名参数名1 1 1 1,);或或或或 函数函数函数函数类类型型型型 函数名(函数名(函数名(函数名(参数参数参数参数类类型
17、型型型1 1 1 1,参数参数参数参数类类型型型型2 2 2 2,);思考思考:以下哪种情况需要以下哪种情况需要以下哪种情况需要以下哪种情况需要在主调函数中在主调函数中在主调函数中在主调函数中对被调函数对被调函数对被调函数对被调函数声明声明声明声明被调函数定义在前被调函数定义在前,主调函数定义在后主调函数定义在后主调函数定义在后主调函数定义在后。主调函数定义在前主调函数定义在前主调函数定义在前主调函数定义在前,被调函数定义在后被调函数定义在后被调函数定义在后被调函数定义在后,且被调函数,且被调函数的类型不是整型的。的类型不是整型的。被调函数定义在后被调函数定义在后被调函数定义在后被调函数定义在
18、后,但被调函数的类型是,但被调函数的类型是,但被调函数的类型是,但被调函数的类型是整型整型整型整型。第二种形式省略了参数名,此种形式也称为第二种形式省略了参数名,此种形式也称为函数的原型函数的原型。19第十九页,讲稿共六十七页哦main()void calc(float x,float y,char opr);float a,b;char opr;printf(nInput expression:);scanf(%f%c%f,&a,&opr,&b);calc(a,b,opr);void calc(float x,float y,char opr)switch(opr)case +:printf
19、(%5.2f%c%5.2f=%6.2fn,x,opr,y,x+y);return;case -:printf(%5.2f%c%5.2f=%6.2fn,x,opr,y,x-y);return;case *:printf(%5.2f%c%5.2f=%6.2fn,x,opr,y,x*y);return;case /:printf(%5.2f%c%5.2f=%6.2fn,x,opr,y,x/y);return;default:printf(Operator err!n);对被调函数对被调函数的声明的声明【例例7.7】计算并算并输出两个数的和、差、出两个数的和、差、积、商。、商。第二十页,讲稿共六十七页
20、哦7.2.5 数数组作函数参数作函数参数1.一一维数数组元素元素作函数参数作函数参数main()int a5,i,m;for(i=0;i5;i+)scanf(%d,&ai);m=a0;for(i=1;i5;i+)m=min(m,ai);printf(%dn,m);【例例7.8】求求5个数中的最小值。个数中的最小值。int min(int x,int y)return(xy?x:y);用打擂台方法求最用打擂台方法求最用打擂台方法求最用打擂台方法求最小小小小值值。mm相当于擂相当于擂相当于擂相当于擂主主主主单向值传递单向值传递21第二十一页,讲稿共六十七页哦2.一一维数数组名名作函数参数作函数参数
21、数组名数组名作为函数参数,在调用函数时,传递的是数作为函数参数,在调用函数时,传递的是数组的组的地址,地址,因为因为数组名数组名表示数组在内存中的表示数组在内存中的起始地起始地址,址,这种传递称为这种传递称为地址传递地址传递。例如例如:数组数组a在内存中从在内存中从20002000地址开始存放地址开始存放,则则a的值的值为为2000。2000是地址值,是指针类型的数据(第是地址值,是指针类型的数据(第8中中将介绍指针类型),不能把它看成是整型或其他类将介绍指针类型),不能把它看成是整型或其他类型数据。型数据。实参是数组名实参是数组名,形参也应定义为,形参也应定义为数组形式数组形式,形参数,形参
22、数组的长度可以省略,但组的长度可以省略,但 不能省,否则就不是数组不能省,否则就不是数组形式了。形式了。【例例7.9】用冒泡法将用冒泡法将10个整数排序。个整数排序。22第二十二页,讲稿共六十七页哦void sort(void sort(int int bb ,int n);,int n);void printarr(void printarr(intint b ););main()main()int a10=int a10=11,22,63,97,58,80,45,11,22,63,97,58,80,45,32,73,36;32,73,36;printf(Before sort:n);pri
23、ntarr(a);printarr(a);sort(a,10);printf(After sort:n);printf(After sort:n);printarr(a);printarr(a);void printarr(int void printarr(int b10 b10)int i;int i;for(i=0;i10;i+)for(i=0;i10;i+)printf(%5d,bi);printf(%5d,bi);printf(n);void sort(int int bb ,int n,int n)int i,j,t;for(i=1;in;i+)for(i=1;in;i+)for(
24、j=0;jn-i;j+)for(j=0;jbj+1)t=bj;bj=bj+1;bj+1=t;地址传递地址传递23第二十三页,讲稿共六十七页哦 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 b0 b1 b2 b3 b4 b5 b6 b7 b8 b911 22 63 97 58 80 45 32 73 36(a)排序前排序前a0 a1 a2 a3 a4 a5 a6 a7 a8 a9b0 b1 b2 b3 b4 b5 b6 b7 b8 b911 22 32 36 45 58 63 73 80 97(b)排序后排序后图图7.3 调用调用sort函数函数2000b形参形参形参形参 b b
25、实际是一个实际是一个实际是一个实际是一个可以存放地址的变量可以存放地址的变量可以存放地址的变量可以存放地址的变量a:2000实参赋给形参实参赋给形参首地址:首地址:2000首地址:首地址:200024第二十四页,讲稿共六十七页哦#include stdio.h#include stdio.hmain()main()void scat(char str1,char str2);void scat(char str1,char str2);char s150,s250;int i,k;char s150,s250;int i,k;printf(Input s1:);printf(Input s1:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 函数 编译 预处理 讲稿
限制150内