《C语言程序设计教程》课件--第7章.pptx
《《C语言程序设计教程》课件--第7章.pptx》由会员分享,可在线阅读,更多相关《《C语言程序设计教程》课件--第7章.pptx(76页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、2005年3月1第7章 函数与预处理命令 7.1 7.1 概述概述概述概述7.2 7.2 函数的定义与调用函数的定义与调用函数的定义与调用函数的定义与调用7.3 7.3 数组作函数参数数组作函数参数数组作函数参数数组作函数参数7.4 7.4 函数的嵌套调用和递归调用函数的嵌套调用和递归调用函数的嵌套调用和递归调用函数的嵌套调用和递归调用7.5 7.5 局部变量和全局变量及其作用域局部变量和全局变量及其作用域局部变量和全局变量及其作用域局部变量和全局变量及其作用域7.6 7.6 变量的存储类别及变量的生存期变量的存储类别及变量的生存期变量的存储类别及变量的生存期变量的存储类别及变量的生存期7.7
2、 7.7 函数的存储分类函数的存储分类函数的存储分类函数的存储分类7.8 7.8 编译预处理编译预处理编译预处理编译预处理7.9 7.9 多文件程序的调试方法多文件程序的调试方法多文件程序的调试方法多文件程序的调试方法第1页/共76页2005年3月27.1 概述 程序结构清晰,可读性好。程序结构清晰,可读性好。减少重复编码的工作量。减少重复编码的工作量。可多人共同编制一个大程序,缩短程序可多人共同编制一个大程序,缩短程序设计周期,提高程序设计和调试的效率。设计周期,提高程序设计和调试的效率。使用函使用函数的数的好处好处C程序源程序文件n函数1函数m 源程序文件1函数1函数n第2页/共76页20
3、05年3月3【例7.1】求一个整数的立方。int cube(int x)int cube(int x)/*/*函数定义函数定义*/return(x*x*x);return(x*x*x);main()int f,a;printf(nEnter an integer number:);scanf(%d,&a);f=cube(a);cube(a);printf(%d*%d*%d=%dn,a,a,a,f);程序运行情况如下:Enter an integer number:2 2*2*2=8函数调用函数调用程序的执行总是从main函数开始第3页/共76页2005年3月4 一个C源程序可以由一个或多个源程
4、序文件组成。C编译系统在对C源程序进行编译时是以文件为单位进行的。一个C源程序文件可以由一个或多个函数组成。所有函数都是独立的。主函数可以调用其它函数,其它函数可以相互调用。在一个C程序中,有且仅有一个主函数main。C程序的执行总是从main函数开始,调用其它函数后最终回到main函数,在main函数中结束整个程序的运行。说明第4页/共76页2005年3月5 函数的种类从函数定义形式分:有参函数:在主调(用)函数和被调(用)函数之间通过参数进行数据传递,如:int cube(int x)无参函数:如:getchar()在调用无参函数时,主调函数不需要将数据传递给无参函数。从使用的角度看:从使
5、用的角度看:标准函数(库函数)标准函数(库函数)库函数是由系统提供的。库函数是由系统提供的。如:如:getchar()getchar()、sin(x)sin(x)等。等。在程序中可以直接调在程序中可以直接调用它们。附录用它们。附录A A列出了列出了C C的部分库函数。的部分库函数。用户自定义函数。用户自定义函数。如如:例例7.17.1中的中的cubecube函数。函数。第5页/共76页2005年3月6【例7.2】无参函数的定义与调用。void welcome()printf(*n);printf(Welcome to China n);printf(*n);main()welcome();程序
6、的输出结果如下:*Welcome to China*第6页/共76页2005年3月77.2.1 函数的定义函数定义的一般形式函数定义的一般形式函数类型 函数名(类型名 形式参数1,)说明语句 执行语句 例如:求两个数的最大值。int max(int x,int y)int z;z=x y?x:y;return(z);类型省略时默认为int类型没有形式参数为无参函数 第7页/共76页2005年3月8int max(x,y)int x,y;int z;z=x y?x:y;return(z);int max(x,y)int x,y;或int max(int x,y)或int max(x,y)int
7、x,y,z;z=x y?x:y;return(z);花括号中也可以为空,这种函数叫花括号中也可以为空,这种函数叫空函数空函数 。不能在函数体内定义其他函数,即函数不能在函数体内定义其他函数,即函数不能嵌套定义不能嵌套定义。形参也可以这样定义如下定义都是错误的如下定义都是错误的 第8页/共76页2005年3月9函数名(实参表列)在C语言中,把函数调用也作为一个表达式。因此凡是表达式可以出现的地方都可以出现函数调用。例如:welcome();if(iabs(a)max)max=iabs(a);m=max(c,max(a,b);7.2.2 函数的调用函数的调用函数调用的一般形式:第9页/共76页20
8、05年3月10int sum100()int i,t=0;for(i=1;i=100;i+)t+=i;return(t);main()int s;s=sum100();printf(%dn,s);程序输出结果:5050int sum(int x)int sum(int x)int i,t=0;int i,t=0;for(i=1;i=x;i+)for(i=1;iy?x:y;z=xy?x:y;return(z);/*return(z);/*返回返回z z的值的值*/main()main()int a,b,c;int a,b,c;scanf(%d,%d,&a,&b);scanf(%d,%d,&a,&
9、b);c=max(a,b);c=max(a,b);printf(max is%dn,c);printf(max is%dn,c);第14页/共76页2005年3月15函数的返回值是通过return语句带回到主调函数的功能:功能:终止函数的运行,返回主调函数,若有返回值,将返回值带回主调函数。说明:说明:若函数没有返回值,若函数没有返回值,returnreturn语句可以省略。语句可以省略。returnreturn语句中的表达式类型一般应和函数的类语句中的表达式类型一般应和函数的类型一致,型一致,如果不一致,系统自动将表达式类型转换为函数类型。函数的返回值函数的返回值return return
10、语句格式:语句格式:return return(表达式表达式););或或 return return 表达式表达式;或或 return;return;第15页/共76页2005年3月16【例例7.8】计算并输出圆的面积。计算并输出圆的面积。s(int r)return 3.14*r*r;main()int r,area;scanf(%d,&r);printf(%dn,s(r);自动转换自动转换为为intintintint型型 思考:思考:若要得到单精度实型的圆面积,程序应如何修改若要得到单精度实型的圆面积,程序应如何修改程序运行情况如下:2 12第16页/共76页2005年3月17 7.2.4
11、 对被调函数的声明和函数原型对被调函数的声明和函数原型变量要变量要先定义后使用先定义后使用,函数也如此函数也如此。即。即被调函数的被调函数的定义要出现在主调函数的定定义要出现在主调函数的定义之前义之前。如。如swapswapswapswap函数函数:允许整型函数(且参数允许整型函数(且参数也是整型)的定义出现在主也是整型)的定义出现在主调函数之后。如调函数之后。如maxmaxmaxmax函数函数:如果非整型函数在主调如果非整型函数在主调函数之后定义,则应在主调函数之后定义,则应在主调函数中或主调函数之前对函数中或主调函数之前对被被调函数进行声明。调函数进行声明。void swap(int x,
12、int y)main()swap(a,b);main()main()c=max(a,b);c=max(a,b);max(int x,int y)max(int x,int y)第17页/共76页2005年3月18对被调函数进行声明的一般形式 函数类型 函数名(参数类型1 参数名1,);或 函数类型 函数名(参数类型1,参数类型2,);思考思考思考思考:以下哪种情况需要以下哪种情况需要以下哪种情况需要以下哪种情况需要在主调函数中在主调函数中在主调函数中在主调函数中对被调函数对被调函数对被调函数对被调函数声明声明声明声明被调函数定义在前被调函数定义在前被调函数定义在前被调函数定义在前,主调函数定义
13、在后主调函数定义在后主调函数定义在后主调函数定义在后。主调函数定义在前主调函数定义在前主调函数定义在前主调函数定义在前,被调函数定义在后被调函数定义在后被调函数定义在后被调函数定义在后,且被调,且被调,且被调,且被调函数的类型不是整型的。函数的类型不是整型的。函数的类型不是整型的。函数的类型不是整型的。被调函数定义在后被调函数定义在后被调函数定义在后被调函数定义在后,但被调函数的类型是,但被调函数的类型是,但被调函数的类型是,但被调函数的类型是整型整型整型整型。第二种形式省略了参数名,此种形式也称为函数的原型。第18页/共76页2005年3月19main()void calc(float x,
14、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(%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
15、*y);return;case /:printf(%5.2f%c%5.2f=%6.2fn,x,opr,y,x/y);return;default:printf(Operator err!n);对被调函数的声明【例7.9】计算并输出两个数的和、差、积、商。第19页/共76页2005年3月20 图 7.2 验证哥德巴赫猜想输入n的值 for(a=6;a=n;a+=2)for(b=3;b=a/2;b+=2)b是素数?T F c=a-b c是素数?T F 输出:a、b、c的值 break;【例例例例7.107.10】哥德巴赫猜想之一是任何一个大于哥德巴赫猜想之一是任何一个大于哥德巴赫猜想之一是任何一个
16、大于哥德巴赫猜想之一是任何一个大于5 5的偶的偶的偶的偶数都可以表示为两个素数之和。验证这一论断。数都可以表示为两个素数之和。验证这一论断。数都可以表示为两个素数之和。验证这一论断。数都可以表示为两个素数之和。验证这一论断。第20页/共76页2005年3月21#include math.h#include math.hint prime(int n);int prime(int n);main()main()int a,b,c,n;int a,b,c,n;scanf(%d,&n);scanf(%d,&n);for(a=6;a=n;a+=2)for(a=6;a=n;a+=2)for(b=3;b=
17、a/2;b+=2)for(b=3;b=a/2;b+=2)if(prime(b)if(prime(b)c=a-b;c=a-b;if(prime(c)if(prime(c)printf(%d=%d+%dn,a,b,c);printf(%d=%d+%dn,a,b,c);break;break;/*穷举法判断素数*/int prime(int n)int i;for(i=2;i=sqrt(n);i+)if(n%i=0)return 0;return 1;可以在main函数的前面对prime函数进行声明。实际上,该声明可以省略,为什么?程序如下:第21页/共76页2005年3月227.3 数组作函数参数
18、7.3.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.11】求5个数中的最小值。int min(int x,int y)return(xy?x:y);用打擂台方法求最小用打擂台方法求最小用打擂台方法求最小用打擂台方法求最小值。值。值。值。mm相当于擂主相当于擂主相当于擂主相当于擂主第22页/共76页2005年3月237.3.2 一维数组名作函数参数数组名表示数组在内存中的起始地址。例如:数组a在内存中从2000地址开始存放,则a
19、的值为2000。2000是地址值,是指针类型的数据(第8中将介绍指针类型),不能把它看成是整型或其他类型数据。实参是数组名,形参也应定义为数组形式,形参数组的长度可以省略,但 不能省,否则就不是数组形式了。【例7.12】用冒泡法将10个整数排序。第23页/共76页2005年3月24void sort(int b,int void sort(int b,int n);n);void printarr(int b);void printarr(int b);main()main()int a10=int a10=11,22,63,97,58,80,411,22,63,97,58,80,45,32,
20、73,36;5,32,73,36;printf(Before printf(Before sort:n);sort:n);printarr(a);printarr(a);sort(a,10);sort(a,10);printf(After printf(After sort:n);sort:n);printarr(a);printarr(a);void printarr(int void printarr(int b10b10)int i;int i;for(i=0;i10;i+)for(i=0;i10;i+)printf(%5d,bi);printf(%5d,bi);printf(n);pr
21、intf(n);void sort(void sort(int b,int nint b,int n)int i,j,t;int i,j,t;for(i=1;in;i+)for(i=1;in;i+)for(j=0;jn-i;j+)for(j=0;jbj+1)if(bjbj+1)t=bj;bj=bj+1;bj+1=t;t=bj;bj=bj+1;bj+1=t;第24页/共76页2005年3月25 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
22、 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 实际是一个实际是一个可以存放地址的变量可以存放地址的变量a:2000实参赋给形参首地址:2000首地址:2000第25页/共76页2005年3月26#include stdio.hmain()void scat(char str1,char str2);char s150,s250;int i,k;printf(Input s1:);gets(s1);printf(Inpu
23、t s2:);gets(s2);scat(s1,s2);printf(Output s1:%sn,s1);printf(Output s2:%sn,s2);void scat(char void scat(char str1,str1,char char str2)str2)int i=0,k=0;int i=0,k=0;while(str1i!=0)i+;while(str1i!=0)i+;while(str2k!=0)while(str2k!=0)str1i=str2k;str1i=str2k;i+;k+;i+;k+;str1i=0;str1i=0;scatscat函数还可简化为:函数还可
24、简化为:函数还可简化为:函数还可简化为:void scat(char str1,char str2)void scat(char str1,char str2)int i=0,k=0;int i=0,k=0;while(str1i)i+;while(str1i)i+;while(str1i+=str2k+);while(str1i+=str2k+);【例7.13】编程序,实现字符串连接。第26页/共76页2005年3月27以二维数组为例。二维数组名作实参时,对应以二维数组为例。二维数组名作实参时,对应的形参也应该定义为一个二维数组形式。对形参数的形参也应该定义为一个二维数组形式。对形参数组定义
25、时可以指定每一维的大小,也可以省略第一组定义时可以指定每一维的大小,也可以省略第一维的大小说明。维的大小说明。【例例7.147.14】编程序,将矩阵转置。设转置前为编程序,将矩阵转置。设转置前为a a矩阵,转置后为矩阵,转置后为b b矩阵,如下所示:矩阵,如下所示:a=a=1 2 3 4 1 2 3 4 5 6 7 85 6 7 89 10 11 129 10 11 121 1 5 5 9 92 2 6 6 10103 3 7 7 11114 4 8 8 1212b=b=思路:将思路:将a00a00b00b00,a01a01 b10 b10,a02a02b20b20,a10a10b01b01,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言程序设计教程 语言程序设计 教程 课件
限制150内