《C语言程序设计》第七章函数课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《《C语言程序设计》第七章函数课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言程序设计 语言程序设计 第七 函数 课件
- 资源描述:
-
1、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 7.7 指针与函数指针与函数7.8 7.8 变量的存储类别变量的存储类别7.9 7.9 模块化程序设计方法模块化程序设计方法 补充:如何运行一个多文件的程序补充:如何运行一个多文件的程序 第七章第七章 函数与模块化程序设计方法函数与模块化程序设计方法 一个较大的程序一般应分为若干个程序模块,每一个模块用来实现一个特定的功能一个C程序可由一
2、个主函数和若干个函数构成。由主函数调用其他函数,其他函数也可以互相调用。同一个函数可以被一个或多个函数调用任意多次。下图是一个程序中函数调用的示意图:maingedefghhicba函数概述函数概述 main()/*主函数主函数 */print_star();/*调用调用print_star函数画函数画*/print_message();/*调用调用print _message函数写字函数写字*/print_star();/*调用调用print_star函数画函数画*/print_star()/*定义定义print_star函数函数*/prinf(“n*”);print_message()/*
3、定义定义print_message函数函数*/prinf(“n Hello!”);函数调用实例:函数调用实例:运行结果:运行结果:*Hello!*说明:(1)一个源程序文件由一个或多个函数组成。一个源程序文件 是一个编译单位,即以源程序为单位进行编译,而不是以 函数为单位进行编译。(2)一个C程序由一个或多个源程序文件组成。一个源文件可 以为多个C程序公用。(3)C程序的执行从main函数开始,调用其他函数后流程回到 main函数,在main函数中结束整个程序的运行。main函数 是系统定义的。(4)所有函数都是平行的,即在定义函数时是互相独立的,一 个函数并不从属于另一函数,函数间可以互相调
4、用,但不 能调用main函数。(5)从用户使用的角度看,函数有两种:标准函数标准函数,即库函数。这是由系统提供的,用户不必自己 定义这些函数,可以直接使用它们。用户自己定义的函数。用以解决用户的专门需要。(6)从函数的形式看,函数分两类:无参函数无参函数。有参函数有参函数。在调用函数时,在主调函数和被调用函数之间 有数据传递。也就是说,主调函数可以将数据传给被调用 函数使用,被调用函数中的数据也可以带回来供主调函数 使用。1、无参函数的定义形式类型标识符类型标识符 函数名()函数名()声明部分声明部分 语句语句 2、有参函数定义的一般形式 类型标识符类型标识符 函数名(形式参数表列)函数名(形
5、式参数表列)声明部分声明部分 语句语句 函数的定义函数的定义例如:int max(int x,int y)int z;z=xy?x:y;return(z);3、可以有、可以有“空函数空函数”它的形式为:类型说明符类型说明符 函数名()函数名()例如:dumy()4、对形参的声明的传统方式 在老版本C语言中,对形参类型的声明是放在函数定义的第2行,也就是不在第l行的括号内指定形参的类型,而在括号外单独指定,例如:int max(x,y)int x,y;int z;z=xy?x:y;return(z);一般把这种方法称为传统的对形参的声明方式,而把前面介绍过的方法称为现代的方式。Turbo C和目
6、前使用的多数C版本对这两种方法都允许使用,两种用法等价。1、形式参数和实际参数、形式参数和实际参数 在定义函数时函数名后面括弧中的变量名称为“形形式参数式参数”,在主调函数中调用一个函数时,函数名后面括弧中的参数(可以是一个表达式)称为“实际参数实际参数”。函数的参数和返回值函数的参数和返回值 例:调用函数时的数据传递main()int a,b,c;scanf(“%d%d”,&a,&b);c=max(a,b);printf(“Max is%d”,c);int max(int x,int y)int z;z=xy?x:y;return(z);运行情况:运行情况:7,8 Max is 8(1)在定
7、义函数中指定的形参,在未出现函数调用时,它们并 不占内存中的存储单元。只有在发生函数调用时,函数 max中的形参才被分配内存单元。在调用结束后,形参所 占的内存单元也被释放。(2)实参可以是常量、变量或表达式,如:max(3,a+b);但要求它们有确定的值。在调用时将实参的值赋给形参 (如果形参是数组名,则传递的是数组首地址而不是数组 的值)。关于形参与实参的说明:关于形参与实参的说明:(3)在被定义的函数中,必须指定形参的类型。(4)实参与形参的类型应相同或赋值兼容。(5)C语言规定,实参变量对形参变量的数据传递是“值传递”,即单向传递,只由实参传给形参,而不能由形参传回来给 实参,在调用函
8、数时,给形参分配存储单元,并将实参对 应的值传递给形参,调用结束后,形参单元被释放,实参 单元仍保留并维持原值。函数的返回值函数的返回值(1)函数的返回值是通过函数中的return语句获得的。return 语句将被调用函数中的一个确定值带回主调函数中去。return 语句后面的括弧也可以不要,如:return z;return后面的值可以是一个表达式。int max(int x,int y)return(xy?x:y);(2)函数值的类型。在定义函数时指定函数值的类型。例如:int max(float x,float y)函数值为整型char letter(char c1,char c2)函数
9、值为字符型double min(int x,int y)函数值为双精度型 C语言规定,凡不加类型说明的函数,一律自动按整型处理。在定义函数时对函数值说明的类型一般应该和return语句中的表达式类型一致。例 返回值类型与函数类型不同。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 2(3)如果函数值的类型和return语句中表达式的值不
10、一致,则 以函数类型为准。对数值型数据,可以自动进行类型转 换。即函数类型决定返回值的类型。(4)如果被调用函数中没有return语句,并不带回一个确定的、用户所希望得到的函数值,但实际上,函数并不是不带回 值,而只是不带回有用的值。带回的是一个不确定的值。(5)为了明确表示“不带回值”,可以用“void”定义“无类型”(或称“空类型”)1、函数调用的一般形式 函数名(实参表列);函数名(实参表列);如果是调用无参函数,则“实参表列”可以没有,但括弧不能省略,如果实参表列包含多个实参,则各参数间用逗号隔开。实参与形参的个数应相等,类型应一致。实参与形参按顺序对应,一一传递数据。如果实参表列包括
11、多个实参,对实参求值的顺序并不是确定的,有的系统按自左至右顺序求实参的值,有的系统则按自右至左顺序。许多 C版本(例如 Turbo C和 MS C)是按自右而左的顺序求值。函数的调用函数的调用 2、函数调用的方式 按函数在程序中出现的位置来分,可以有以下三种函数调用方式:(1)函数语句 把函数调用作为一个语句。如:printstar();(2)函数表达式 函数出现在一个表达式中,这种表达式称为函数表达式。这时要求函数带回一个确定的值以参加表达式的运算。例如:c=2*max(a,b);(3)函数参数函数调用作为一个函数的实参。例如:m=max(a,max(b,c);3、对被调用函数的声明和函数原
12、型 在一个函数中调用另一函数(即被调用函数)需要具备的条件(1)首先被调用的函数必须是已经存在的函数(是库函数或用 户自己定义的函数)。(2)如果使用库函数,一般还应该在本文件开头用include命 令将调用有关库函数时所需用到的信息“包含”到本文件中 来。例如,前几章中已经用过的 include(3)如果使用用户自己定义的函数,而且该函数与调用它的函 数(即主调函数)在同一个文件中,一般还应该在主调函 数中对被调用的函数作声明声明,即对编译系统声明将要调用 此函数,并将有关信息通知编译系统。例例 对被调用的函数作声明对被调用的函数作声明main()float add(float x,floa
13、t 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);运行情况如下:3.5,6.5sum is 10.000000在函数声明中也可以不写形参名,而只写形参的类型。如:float add(float,float););在C语言中,以上的函数声明称为函数原型(function prototype)。它的作用主要是利用它在程序的编译阶段对调用函数的合 法性进行全面检查。函
14、数原型的一般形式为 函数类型函数类型 函数名(参数类型函数名(参数类型1,参数类型,参数类型2)函数类型函数类型 函数名(参数类型函数名(参数类型1 参数名参数名1,参数类型,参数类型2 参数名参数名2,)第种形式是基本的形式。为了便于阅读程序,也允许在函数原型中加上参数名,就成了第种形式。但编译系统不检查参数名。因此参数名是什么都无所谓。说明:如果在函数调用之前,没有对函数作声明,则编译系统会把第一次遇到的该函数形式(函数定义或函数调用)作为函数的声明,并将函数类型默认为int型。如果函数类型为整型,可以在函数调用前不必作函数声明。但是使用这种方法时,系统无法对参数的类型做检查。若调用函数时
15、参数使用不当,在编译时也不会报错。因此,为了程序清晰和安全,建议都加以声明为好。如果被调用函数的定义出现在主调函数之前,可以不必加以 声明。如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必对所调用的函数再作声明。例如: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
16、i(float j,float k)/定义i函数/例题:例题:写出下列程序的输出结果写出下列程序的输出结果(1)#include swap(int a,int b)int temp;temp=a;a=b;b=temp;main()int x=7,y=11;printf(x=%d,ty=%dn,x,y);printf(swapped:n);swap(x,y);printf(x=%d,ty=%dn,x,y);答案:x=7 y=11swapped:x=7 y=11(2)void swap(int*p1,int*p2)int p;p=*p1;*p1=*p2;*p2=p;main()int x=7,y=
17、11;printf(“x=%d,y=%dn”,x,y);printf(“swapped:n”);swap(&x,&y);printf(“x=%d,y=%dn”,x,y);答案:x=7 y=11swapped:x=11 y=7分析:通过对上面两程序,理解两种参数传递方式的区别:值传递方式 函数调用时,为形参分配单元,并将实参的值复制到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值。特点是形参与实参占用不同的内存单元,单向传递。地址传递 函数调用时,将数据的存储地址作为参数传递给形参,特点是形参与实参占用同样的存储单元,“双向”传递,实参必须是地址常量或变量,形参是地址变量。C语言的函
展开阅读全文