函数与编译预处理解读课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《函数与编译预处理解读课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 函数 编译 预处理 解读 课件
- 资源描述:
-
1、n6.1 模块化程序设计与函数模块化程序设计与函数n6.2 函数的定义与调用函数的定义与调用n6.3 函数的递归调用函数的递归调用n6.4 变量的作用域与存取方式变量的作用域与存取方式n6.5 编译预处理编译预处理16.1模块化程序设计与函数模块化程序设计与函数 在设计较复杂的程序时,我们一般采用的方法是:把问题分成几个部分,每部分又可分成更细的若干小部分,逐步细化,直至分解成很容易求解的小问题。这样的话,原来问题的解就可以用这些小问题来表示。2基本概念基本模块模块模块模块模块模块模块模块模块模块2022-12-53模块与函数C语言程序由基本语句和函数组成,每个函数可完成相对独立的任务,依一定
2、的规则调用这些函数,就组成了解决某个特定问题的程序。把大任务分解成若干功能模块,用多个函数来实现这些功能模块。通过函数的调用来实现完成大任务的全部功能。任务、模块与函数的关系:一个大任务分成多个功能模块,功能模块则由一个或多函数实现。模块化的程序设计是靠设计函数和调用函数实现的。4例:分数排序任务:输入三个数,从大到小的顺序的输出。如果大于等于85,在该数后面输出A,小于85且大于等于70,则输出B,小于70且大于等于60,输出C,如果小于60,则输出D。思路:scanf()输入分数另建一个排序函数判断并输出等级函数打印分数及等级的函数 虽然也可以由一个主函数来完成,但这虽然也可以由一个主函数
3、来完成,但这样做可读性及操作性会更好。样做可读性及操作性会更好。5模块设计的原则模块独立规模适当层次分明功能专一66.2 函数的定义与调用n在C语言中,把逻辑上独立,能完成规定任务的模块称为函数或函数组。一个源程序文件由一个或多个函数组成。一个源程序文件是一个编译单位,即以源程序为单位进行编译,而不是以函数为单位进行编译。一个C程序由一个或多个源程序文件组成。一个源文件可以为多个C程序公用。C程序的执行从main函数开始,调用其他函数后流程回到main函数,在main函数中结束整个程序的运行。main函数是系统定义的。所有函数都是平行的,即在定义函数时是互相独立的,一个函数并不从属于另一函数,
4、对于编制好的函数,需要时可随时加以调用,但不能调用main函数。7一、函数分类一、函数分类函数按主次分为:主函数和非主函数两种。主函数是名为main的函数,是一个源程序不可缺少部分;函数按编程技术分为:有返回值的函数和无返回值的函数;函数按编制者分为:库函数(标准函数)和自定义函数:前者由系统提供,只要在#include命令中写上相应的头文件,就允许用户直接调用;后者是用户自己定义的函数,解决用户的专门需要。函数按参数分为:无参函数和有参函数两种。有参函数指在调用函数时,在主调函数和被调用函数之间有数据传递。也就是说,主调函数可以将数据传给被调用函数使用,被调用函数中的数据也可以带回来供主调函
5、数使用。8二、标准库函数与自定义函数C语言有丰富的库函数,这些函数的说明在不同的头文件(*.h)中。想要调用标准的库函数,就必须include。#includemain()printf(“%d”,1024*768);调用printf函数时,必须include9自定义函数可以把完成一个任务的过程写成函数。int A_to_a(int capital)int small;if(capital=A&capital=Z)small=capital (A-a);return small;返回值类型名函数名注意不要与已有库函数重名参数说明和参数列表调用函数时输入参数的格式要与之相同定义局部变量最好只使用局
6、部变量,这样将方便调试。返回值如果不需返回则可return 0;另外请注意这样的判断另外请注意这样的判断,如写成如写成Acapitaly?x:y;return(z);3、可以有、可以有“空函数空函数”它的形式为:类型说明符类型说明符 函数名()函数名()例如:dumy()124、对形参的声明的传统方式、对形参的声明的传统方式 在老版本C语言中,对形参类型的声明是放在函数定义的第2行,也就是不在第l行的括号内指定形参的类型,而在括号外单独指定,例如:int max(x,y)int x,y;int z;z=xy?x:y;return(z);一般把这种方法称为传统的对形参的声明方式,而把前面介绍过的
7、方法称为现代的方式。Turbo C和目前使用的多数C版本对这两种方法都允许使用,两种用法等价。131、形式参数和实际参数、形式参数和实际参数 在定义函数时函数名后面括弧中的变量名称为“形形式参数式参数”,在主调函数中调用一个函数时,函数名后面括弧中的参数(可以是一个表达式)称为“实际参实际参数数”。三、函数参数和函数的值三、函数参数和函数的值14int max(int a,int b)int y;y=(ab)?a:b;return y;同样的,在调用m=max(a,b)时,其形参的值是a和b而m将会得到y的值调用时:m=max(3,6);m=max(a,b);括号里是形式参数返回值括号里是实参
8、在这一句调用时,形参的值是3和6其返回值y将被赋给调用语句中的m函数的参数15调用函数时的数据传递main()int a,b,c;scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“Max is%d”,c);max(int x,int y)int z;z=xy?x:y;return(z);运行情况:运行情况:7,8 Max is 8例:16关于形参与实参的说明:关于形参与实参的说明:(1)在定义函数中指定的形参,在未出现函数调用时,它们并 不占内存中的存储单元。只有在发生函数调用时,函数 max中的形参才被分配内存单元。在调用结束后,形参所 占的内存单元也被释放。(
9、2)实参可以是常量、变量或表达式,如:max(3,a+b);但要求它们有确定的值。在调用时将实参的值赋给形参 (如果形参是数组名,则传递的是数组首地址而不是数组 的值)。17(3)在被定义的函数中,必须指定形参的类型。(4)实参与形参必须个数相同,实参与形参的类型应相同或赋值兼容。(5)C语言规定,实参变量对形参变量的数据传递是“值传递”,即单向传递,只由实参传给形参,而不能由形参传回来给 实参,在调用函数时,给形参分配存储单元,并将实参对 应的值传递给形参,调用结束后,形参单元被释放,实参 单元仍保留并维持原值。函数的返回值函数的返回值(1)函数的返回值是通过函数中的return语句获得的。
10、return 语句将被调用函数中的一个确定值带回主调函数中去。18return 语句后面的括弧也可以不要,如:return z;return后面的值可以是一个表达式。max(int x,int y)return(xy?x:y);(2)函数值的类型。在定义函数时指定函数值的类型。例如:int max(float x,float y)函数值为整型char letter(char c1,char c2)函数值为字符型double min(int x,int y)函数值为双精度型19 C语言规定,凡不加类型说明的函数,一律自动按整型处理。在定义函数时对函数值说明的类型一般应该和return语句中的表达
11、式类型一致。例 返回值类型与函数类型不同。main()float a,b;int c;scanf(“%f,%f,”,&a,&b);c=max(a,b);printf(“”Max is%dn”,c);max(float x,float y);float z;/z为实型变量/z=xy?x:y;return(z);运行情况如下:1.5,2.5Max is 220(3)如果函数值的类型和return语句中表达式的值不一致,则 以函数类型为准。对数值型数据,可以自动进行类型转 换。即函数类型决定返回值的类型。(4)如果被调用函数中没有return语句,并不带回一个确定的、用户所希望得到的函数值,但实际上
12、,函数并不是不带回 值,而只是不带回有用的值。带回的是一个不确定的值。(5)为了明确表示“不带回值”,可以用“void”定义“无类型”(或称“空类型”)21四、函数调用1、函数调用的一般形式 函数名(实参表列);函数名(实参表列);如果是调用无参函数,则“实参表列”可以没有,但括弧不能省略,如果实参表列包含多个实参,则各参数间用逗号隔开。实参与形参的个数应相等,类型应一致。实参与形参按顺序对应,一一传递数据。如果实参表列包括多个实参,对实参求值的顺序并不是确定的,有的系统按自左至右顺序求实参的值,有的系统则按自右至左顺序。许多 C版本(例如 Turbo C和 MS C)是按自右而左的顺序求值。
13、222、函数调用的过程(1)计算实在参数表中各表达式;(2)将表达式的值(此值可以是一般意义量的值,也可以是指针的值(地址)依次赋给同类型的各形式参数;(3)控制转移到函数体,执行函数体;(4)当遇到return语句中包含表达式时,则将表达式的值送回调用函数;没执行到return语句或虽执行到return语句但不包含表达式时,均没有确定值送回调用函数.对void型函数,return语句不能带表达式.在考察函数调用时在考察函数调用时,要注意要注意:是以表达式形式调是以表达式形式调用函数还是以语句形式调用函数;用函数还是以语句形式调用函数;参数传递,是参数传递,是传值还是传地址;传值还是传地址;有
14、无返回值与函数类型的关系。有无返回值与函数类型的关系。233、函数调用的方式 按函数在程序中出现的位置来分,可以有以下三种函数调用方式:(1)函数语句:把函数调用作为一个语句。如:printstar();(2)函数表达式 函数出现在一个表达式中,这种表达式称为函数表达式。这时要求函数带回一个确定的值以参加表达式的运算。例如:c=2*max(a,b);(3)函数参数函数调用作为一个函数的实参。例如:m=max(a,max(b,c);244、对被调用函数的声明和函数原型 在一个函数中调用另一函数(即被调用函数)需要具备的条件(1)首先被调用的函数必须是已经存在的函数(是库函数或用 户自己定义的函数
15、)。(2)如果使用库函数,一般还应该在本文件开头用include命 令将调用有关库函数时所需用到的信息“包含”到本文件中 来。例如,前几章中已经用过的 include(3)如果使用用户自己定义的函数,而且该函数与调用它的函 数(即主调函数)在同一个文件中,一般还应该在主调函 数中对被调用的函数作声明声明,即对编译系统声明将要调用 此函数,并将有关信息通知编译系统。25例 对被调用的函数作声明main()float add(float x,float y);/对被调用函数的声明/float a,b,c;scanf(“%f,%f”,&a,&b);c=add(a,b);printf(“sum is%
16、f”,c);float add(float x,float y);/函数首部/float z;/函数体/z=x+y;return(z);运行情况如下:3.6,6.5sum is 10.00000026在函数声明中也可以不写形参名,而只写形参的类型。如:float add(float,float););在C语言中,以上的函数声明称为函数原型(function prototype)。它的作用主要是利用它在程序的编译阶段对调用函数的合 法性进行全面检查。函数原型的一般形式为 函数类型函数类型 函数名(参数类型函数名(参数类型1,参数类型,参数类型2)函数类型函数类型 函数名(参数类型函数名(参数类型
17、1,参数名,参数名1,参数类型,参数类型2,参数名参数名2)第种形式是基本的形式。为了便于阅读程序,也允许在函数原型中加上参数名,就成了第种形式。但编译系统不检查参数名。因此参数名是什么都无所谓。27说明:如果在函数调用之前,没有对函数作声明,则编译系统会把第一次遇到的该函数形式(函数定义或函数调用)作为函数的声明,并将函数类型默认为int型。如果函数类型为整型,可以在函数调用前不必作函数声明。但是使用这种方法时,系统无法对参数的类型做检查。若调用函数时参数使用不当,在编译时也不会报错。因此,为了程序清晰和安全,建议都加以声明为好。如果被调用函数的定义出现在主调函数之前,可以不必加以 声明。2
18、8 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必对所调用的函数再作声明。例如:char letter(char,char);/以下3行在所有函数之前,且在函数外部/float f(float,float);int i(float,float);main()/不必声明它所调用的函数/char letter(char c1,char c2)/定义letter函数/float f(float x,float y)/定义f函数/int i(float j,float k)/定义i函数/296.3函数嵌套与递归调用n一、函数的嵌套调一、函数的嵌套调用用 C语言的函数定义都
19、是互相平行、独立的,也就是说在定义函数时,一个函数内不能包含另一个函数。C语言不能嵌套定义函数,但可以嵌套调用函数,也就是说,在调用一个函数的过程中,又调用另一个函数。main函数函数a函数函数b函数函数调用调用a函数函数调用调用b函数函数结束结束30例:编一个程序计算下列函数值;编一个程序计算下列函数值;要求为函数p(i)、s(n)、f(x,y)均编写一个用户函数,x、y由主函数输入。f(x,y)=s(x)s(y)其中s(n)=p(i)=p(1)+p(2)+p(n),p(i)=i!ni=131float p(long i)long k,j;for(k=j=1;j=i;j+)k=k*j;ret
展开阅读全文