C语言课件第八章.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《C语言课件第八章.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课件 第八
- 资源描述:
-
1、 教学目与要求:教学目与要求:明确明确C程序由一个或多个函数构成,掌握函数的定义方法,程序由一个或多个函数构成,掌握函数的定义方法,熟悉函数的传值调用,嵌套调用,递归调用的执行过程;熟悉函数的传值调用,嵌套调用,递归调用的执行过程;掌握变量的类型,作用域,生存期等概念,正确使用动态掌握变量的类型,作用域,生存期等概念,正确使用动态变量,静态变量。变量,静态变量。教学内容:教学内容:概述;函数定义的一般形式;函数的参数和函数的值;函概述;函数定义的一般形式;函数的参数和函数的值;函数的调用;函数的嵌套调用;函数的递归调用;数组作为数的调用;函数的嵌套调用;函数的递归调用;数组作为函数参数;局部变
2、量和全局变量;变量的存储类别;内部函数参数;局部变量和全局变量;变量的存储类别;内部函数和外部函数;如何运行一个多文件的程序。函数和外部函数;如何运行一个多文件的程序。教学重点与难点:教学重点与难点:重点是函数的定义和调用,变量的作用域和生存期难点是重点是函数的定义和调用,变量的作用域和生存期难点是函数的嵌套调用与递归调用。函数的嵌套调用与递归调用。Ch8 函数函数 特点:特点:各模块相对独立、功能单一、结构清晰、接口简单各模块相对独立、功能单一、结构清晰、接口简单控制了程序设计的复杂性控制了程序设计的复杂性缩短开发周期缩短开发周期避免程序开发的重复劳动避免程序开发的重复劳动易于维护和功能扩充
3、易于维护和功能扩充l 8.1 概述概述uC是模块化程序设计语言是模块化程序设计语言 基本思想:将一个大的程序按基本思想:将一个大的程序按功能功能分割成一些分割成一些小模块小模块开发方法开发方法:自上向下,逐步细化自上向下,逐步细化&一个一个C C程序由一个程序由一个 或多个程序模块组成或多个程序模块组成,每个每个 程序模块作为一个源程序文件程序模块作为一个源程序文件&C C是是函数式函数式语言语言,一个源程序文件由一个或多个函数一个源程序文件由一个或多个函数 以及其他有关内容组成以及其他有关内容组成.&一个一个C C程序程序必须有且只能有一个名为必须有且只能有一个名为mainmain的主函数的
4、主函数&C程序的执行总是程序的执行总是从从mainmain函数开始,函数开始,mainmain函数结束时函数结束时结束结束&函数函数不能嵌套定义不能嵌套定义,可以可以嵌套嵌套调用调用,但不能调用但不能调用mainmain函数函数.&所有子函数都是所有子函数都是平行的,平行的,任何函数任何函数都不属于都不属于其他函数其他函数 C是模块化程序设计语言是模块化程序设计语言源程序文件1预编译命令说明部分执行部分函数1函数n源程序文件i源程序文件nC程序C C程序结构程序结构 函数分类函数分类 从从用户角度用户角度标准函数(库函数):由系统提供标准函数(库函数):由系统提供用户自定义函数用户自定义函数
5、从从函数形式函数形式无参函数无参函数有参函数有参函数使用使用库函数库函数应注意:应注意:1、函数、函数功能功能2、函数参数的、函数参数的数目和顺序数目和顺序,及各参数意义和,及各参数意义和类型类型3、函数返回值意义和类型、函数返回值意义和类型4、需要使用的包含文件、需要使用的包含文件 8.2 函数定义的一般格式合法标识符合法标识符函数返回值类函数返回值类型型缺省缺省int型型无返回值无返回值void函数体函数体类型标识符类型标识符 函数名函数名()说明部分说明部分语句部分语句部分例例 空函数空函数 dummy()函数体为空函数体为空例例 无参函数无参函数 printstar()printf(“
6、*n”);或或 printstar(void)printf(“*n”);8.2.18.2.1无参函数无参函数定义的一般格式定义的一般格式 8.2.2 有参函数定义有参函数定义 的一般格式的一般格式合法标识符合法标识符函数返回值类函数返回值类型型缺省缺省int型型无返回值无返回值void函数体函数体类型标识符类型标识符 函数名函数名(形参类型说明表形参类型说明表)说明部分说明部分语句部分语句部分例例 有参函数有参函数 int max(int x,int y)int z;z=xy?x:y;return(z);例例 有参函数号有参函数号 int max(int x,y)int z;z=xy?x:y;
7、return(z);函数类型函数类型 函数名(形参表)函数名(形参表)形参类型说明形参类型说明说明部分说明部分语句部分语句部分传统风格传统风格:例例 有参函数(传统风格)有参函数(传统风格)int max(x,y)int x,y;int z;z=xy?x:y;return(z);8.2.3 空函数空函数void 函数名函数名()作用作用:在程序设计中往往根据需要确定若干模块在程序设计中往往根据需要确定若干模块,分别由一些分别由一些 函数实现函数实现,而在第一阶段中设计最基本的模块而在第一阶段中设计最基本的模块,其他一些其他一些 次要功能或锦上添花的功能则在以后需要时陆续补上次要功能或锦上添花的
8、功能则在以后需要时陆续补上,在编写程序的开始阶段在编写程序的开始阶段,可以在将来要扩充的地方写一可以在将来要扩充的地方写一 个空函数个空函数.8.3.1 形参与实参形参与实参 形式参数:定义函数时函数名后面括号中的变量名形式参数:定义函数时函数名后面括号中的变量名 实际参数:调用函数时函数名后面括号中的参数实际参数:调用函数时函数名后面括号中的参数例例 比较两个数并输出大者比较两个数并输出大者max(int x,int y)int z;z=xy?x:y;return(z);main()int a,b,c;scanf(%d,%d,&a,&b);c=max(a,b);printf(Max is%d
9、,c);8.3 函数参数和函数的值函数参数和函数的值说明:说明:形参在函数被调用前不占内存形参在函数被调用前不占内存;函函数调用时为形参分配内存;调用结数调用时为形参分配内存;调用结束,内存释放束,内存释放实参可为常量实参可为常量,变量或表达式变量或表达式,但但必须有确定的值必须有确定的值,调用时实参的值调用时实参的值传给形参传给形参.形参必须指定类型形参必须指定类型形参与实参形参与实参类型一致,个数相同类型一致,个数相同若形参与实参类型不一致,自动若形参与实参类型不一致,自动按形参类型转换按形参类型转换函数调用函数调用转换转换实参到形参是单向的值传递反过实参到形参是单向的值传递反过来不行来不
10、行.例例 计算计算x的立方的立方#include float cube(float x)return(x*x*x);main()float a,product;printf(Please input value of a:);scanf(%f,&a);product=cube(a);printf(”Cube of%.4f is%.4fn,a,product);xaproduct1.21.21.728返回语句返回语句形式:形式:return(表达式表达式);或或 return 表达式表达式;或或 return;功能功能:使程序控制从:使程序控制从被调用函数被调用函数返回到返回到调用函数调用函数中
11、,中,同时把返同时把返回回值带给调用函数值带给调用函数说明:说明:函数中可有多个函数中可有多个return语句语句若无若无return语句,遇语句,遇时,自动返回调用函数时,自动返回调用函数,返回的是一个返回的是一个不确定的值不确定的值若函数类型与若函数类型与return语句中表达式值的语句中表达式值的类型不一致类型不一致,按前,按前者为准,自动转换者为准,自动转换-函数调用转换函数调用转换void型函数型函数没有返回值没有返回值例例 无返回值函数无返回值函数 void swap(int x,int y)int temp;temp=x;x=y;y=temp;8.3.2 函数的返回值函数的返回值
12、 printstar()printf(*);main()int a;a=printstar();printf(%d,a);例例:下列函数的不同。下列函数的不同。void printstar()printf(*);main()int a;a=printstar();printf(%d,a);*10 编译错误编译错误not an allowed type例例:函数返回值类型转换函数返回值类型转换max(float x,float y)float z;z=xy?x:y;return(z);main()float a,b;int c;scanf(%f%f,&a,&b);c=max(a,b);print
13、f(Max is%dn,c);教学目与要求:教学目与要求:熟悉函数的传值调用熟悉函数的传值调用嵌套调用嵌套调用递归调用的执行过程;递归调用的执行过程;教学内容:教学内容:函数的嵌套调用;函数的嵌套调用;函数的递归调用;函数的递归调用;数组作为函数参数;数组作为函数参数;教学重点与难点:教学重点与难点:函数的嵌套调用与递归调用。函数的嵌套调用与递归调用。Ch8 函数函数(2)8.4 8.4 函数的调用函数的调用8.4.1调用的一般形式调用的一般形式 函数名函数名(实参表列实参表列);说明:说明:实参与形参实参与形参个数相等,类型一致,按顺序一一对应个数相等,类型一致,按顺序一一对应实参表求值顺序
14、,因系统而定(实参表求值顺序,因系统而定(Turbo C 自右向左自右向左)8.4.2 调用方式调用方式 函数语句:函数语句:例例 printstar();printf(“Hello,World!n”);函数表达式:函数表达式:例例 m=max(a,b)*2;函数参数:函数参数:例例 printf(“%d”,max(a,b);m=max(a,max(b,c);int f(int a,int b)int c;if(ab)c=1;else if(a=b)c=0;else c=-1;return(c);void main()int i=2,p;p=f(i,+i);printf(%d,p);例例 参数
15、求值顺序参数求值顺序int f(int a,int b)int c;if(ab)c=1;else if(a=b)c=0;else c=-1;return(c);void main()int i=2,p;p=f(i,i+);printf(%d,p);运行结果:运行结果:0TC运行结果:运行结果:1VC :0对被调用函数要求:对被调用函数要求:必须是必须是已存在已存在的函数的函数库函数应该使用库函数应该使用#include 用户自定义函数或者在调用前面,或者先有用户自定义函数或者在调用前面,或者先有函数类型说明函数类型说明告诉编译系统告诉编译系统函数类型、参数个数及类型,以便检验函数类型、参数个数
16、及类型,以便检验函数定义函数定义与与函数声明函数声明不同不同函数定义函数定义是指函数功能的确立,包括函数名、值、形参以及是指函数功能的确立,包括函数名、值、形参以及函数体,是一个完整的、独立的函数单位。函数体,是一个完整的、独立的函数单位。函数声明函数声明告诉编译系统告诉编译系统函数类型、参数个数及类型,以便检函数类型、参数个数及类型,以便检验验8.4.3 对被调用函数的声明和函数原型对被调用函数的声明和函数原型例例 函数函数声声明举例明举例float add(float x,float y)float z;z=x+y;return(z);void main()float a,b,c;scan
17、f(%f,%f,&a,&b);c=add(a,b);printf(sum is%f,c);被调函数出现在主调函数被调函数出现在主调函数之前,不必函数之前,不必函数声声明明/*ch8-4.c*/void main()float add(float x,float y);float a,b,c;scanf(%f,%f,&a,&b);c=add(a,b);printf(sum is%f,c);float add(float x,float y)float z;z=x+y;return(z);void main()int a,b;int c;scanf(%f,%f,&a,&b);c=max(a,b);
18、printf(Max is%dn,c);max(int x,int y)int z;z=xy?x:y;return(z);int型函数可不作函数说型函数可不作函数说声声明明(Borland C+不行)不行)8.4.3 对被调用函数的声明和函数原型对被调用函数的声明和函数原型 函数的声明简称函数原型函数的声明简称函数原型.一般情况下,函数的一般情况下,函数的声明与函数定声明与函数定义的第一行(函数首部)基本相同,但差一个分号义的第一行(函数首部)基本相同,但差一个分号,因此,可以简因此,可以简单地照写已经定义的函数的首部,再加一个分号,就成了声明。单地照写已经定义的函数的首部,再加一个分号,就成
19、了声明。函数原型的形式函数原型的形式 (1)函数类型函数类型 函数名函数名(形参类型形参类型1,形参类型,形参类型2,.形参类型形参类型n);(2)函数类型函数类型 函数名函数名(形参类型形参类型1 参数名参数名1,形参类型形参类型2 参数名参数名2,.,形参类型形参类型n 参数名参数名n);编译系统不检查参数名,参数名是什么无所谓编译系统不检查参数名,参数名是什么无所谓函数说明位置:函数说明位置:程序的数据说明部分(函数内或外程序的数据说明部分(函数内或外)下列情况下,可不作函数说明下列情况下,可不作函数说明 被调用函数定义出现在主调函数之前被调用函数定义出现在主调函数之前 如果已经在头文件
20、的开头(在所有函数之前)已经对本文如果已经在头文件的开头(在所有函数之前)已经对本文件中所调用的函数进行了声明,则在各函数中不必再说明。件中所调用的函数进行了声明,则在各函数中不必再说明。若函数返值是若函数返值是char或或int型型,系统自动按,系统自动按int型处理型处理int sum(int a,int b)a=a+b;b=a+b;return(a);void main()int a=1,b=3,c;c=sum(a,b);printf(%d,%d,%d,a,b,c);例例 读程序写出程序结果。读程序写出程序结果。1,3,4void main()float add(float a,floa
21、t b);float a,b,c;scanf(%f,%f,&a,&b);c=add(a,b);printf(sum is%f,c);float add(float x,float y)float z;z=x+y;return(z);8.5 8.5 函数的嵌套调用函数的嵌套调用main()调用函数调用函数a结束结束a函数函数b函数函数调用函数调用函数bu嵌套调用嵌套调用 C规定:规定:函数定义不可嵌套函数定义不可嵌套,但,但可以嵌套调用可以嵌套调用函数函数,即在调用一个函数的过程中又调用另一个函数。即在调用一个函数的过程中又调用另一个函数。例例 求三个数中最大数和最小数的差值求三个数中最大数和最
22、小数的差值#include int dif(int x,int y,int z);int max(int x,int y,int z);int min(int x,int y,int z);void main()int a,b,c,d;scanf(%d%d%d,&a,&b,&c);d=dif(a,b,c);printf(Max-Min=%dn,d);int dif(int x,int y,int z)return max(x,y,z)-min(x,y,z);int max(int x,int y,int z)int r;r=xy?x:y;return(rz?r:z);int min(int x
23、,int y,int z)int r;r=xy?x:y;return(rz?r:z);main()调用函数调用函数dif输出输出结束结束dif函数函数max函数函数调用函数调用函数max调用函数调用函数minmin函数函数float fac(int k)float t=1;int i;for(i=2;i=k;i+)t*=i;return t;void main()float c;int m,n;scanf(“%d,%d”,&m,&n);c=fac(n)/(fac(m)*fac(n-m);printf(“%f”,c);例例 求求)!(!mnmncmn分析:分析:重复三次求阶乘运算,只是每次的值不
24、同。将求阶乘重复三次求阶乘运算,只是每次的值不同。将求阶乘的过程编成一个函数,以不同的参数值来调用函数。的过程编成一个函数,以不同的参数值来调用函数。说明说明:C编译系统对递归函数的自调用编译系统对递归函数的自调用次数没有限制次数没有限制每调用函数一次,在每调用函数一次,在内存堆栈区分配空间内存堆栈区分配空间,用于,用于存放函数变存放函数变量、返回值量、返回值等信息,所以递归次数过多,可能引起堆栈溢出等信息,所以递归次数过多,可能引起堆栈溢出l 8.68.6 函数的递归调用函数的递归调用 定义:函数定义:函数直接或间接的调用自身直接或间接的调用自身叫函数的递归调用叫函数的递归调用f()调调f调
25、调f2调调f1f1()f2()int f(int x)int y,z;z=f(y);.return(2*z);int f1(int x)int y,z;z=f2(y);.return(2*z);int f2(int t)int a,c;c=f1(a);.return(3+c);此两种递归都此两种递归都无法结束无法结束,应,应有有某种条件某种条件控控制递归调用结制递归调用结束。束。例例 8.8)1(2)1()1(10)(nnagennageint age(int n)int c;if(n=1)c=10;else c=age(n-1)+2;return(c);void main()printf(“
展开阅读全文