第6章 函数与编译预处理PPT讲稿.ppt
《第6章 函数与编译预处理PPT讲稿.ppt》由会员分享,可在线阅读,更多相关《第6章 函数与编译预处理PPT讲稿.ppt(98页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第6章章 函数与函数与编译预处理理第1页,共98页,编辑于2022年,星期一第第6 6章章 函数与函数与编译预处理理 函数是函数是 C语言程序的基本模言程序的基本模块,由于采用了函数模,由于采用了函数模块式的式的结构,构,C 语言易于言易于实现结构化程序构化程序设计,使程序的,使程序的结构清晰、减少重复构清晰、减少重复编写程序的工作量、提高程序的可写程序的工作量、提高程序的可读性性和可和可维护性。本章主要介性。本章主要介绍函数的定函数的定义与与调用、函数用、函数间的的数据数据传递方法、函数的方法、函数的递归调用、用、变量的作用域和存量的作用域和存储类别以及以及编译预处理命令等相关内容。理命令
2、等相关内容。第2页,共98页,编辑于2022年,星期一第第6章章 函数与编译预处理函数与编译预处理 第6章6.1 函数概述函数概述6.2 函数的调用函数的调用6.3 函数的参数传递方式与函数的返回值函数的参数传递方式与函数的返回值6.4 函数的嵌套调用与递归调用函数的嵌套调用与递归调用 6.5 变量的作用域与存储类别变量的作用域与存储类别6.6 内部函数和外部函数内部函数和外部函数6.7 编译预处理编译预处理 6.8 文件包含文件包含 6.9 条件编译条件编译 6.10 程序举例程序举例第3页,共98页,编辑于2022年,星期一6.1 函数概述函数概述 第4页,共98页,编辑于2022年,星期
3、一6.1 函数概述函数概述6.1.1 模模块化程序化程序设计方法方法 通通常常人人们在在求求解解一一个个复复杂或或较大大规模模的的问题时,一一般般都都采采用用逐逐步步分分解解、分分而而治治之之的的方方法法,也也就就是是把把一一个个大大而而复复杂的的问题分分解解成成若若干干个个比比较容容易易求求解解的的小小问题,然然后后分分别求求解解。根根据据这一一法法则,程程序序员在在设计一一个个大大而而复复杂的的程程序序时,往往往往也也是是首首先先把把整整个个程程序序划划分分为若若干干个个功功能能较为单一一的的程程序序模模块,其其次次分分别予予以以实现,最最后后再再把把所所有有的的程程序序模模块像像搭搭积木
4、木一一样装装配配起起来来,完完成成一一个个完完整整的的程程序序,从从而而达达到到所所要要求求的的目目的的。这种种在在程序程序设计中逐步分解、分而治之的策略,称中逐步分解、分而治之的策略,称为模模块化程序化程序设计方法。方法。如如果果软件件可可划划分分为可可独独立立命命名名和和编程程的的部部件件,则每每个个部部件件称称为一一个个模模块。模模块化化就就是是把把系系统划划分分成成若若干干个个模模块,每每个个模模块完完成成一一个个子子功功能能,把把这些些模模块集集中中起起来来组成成一一个个整整体体,从从而而完完成成指指定定的的功功能能,满足足问题的的要求。要求。第5页,共98页,编辑于2022年,星期
5、一例如,例如,图书管理系管理系统模模块划分如划分如图6-1所示。所示。图6-1 图书管理系管理系统模模块划分示意划分示意图6.1 函数概述函数概述第6页,共98页,编辑于2022年,星期一6.1 函数概述函数概述 在在C语言中,函数是程序的基本组成单位,因此可以很方便语言中,函数是程序的基本组成单位,因此可以很方便地用函数作为程序模块来实现地用函数作为程序模块来实现C语言程序。利用函数,不仅可语言程序。利用函数,不仅可以实现程序的模块化,避免大量的重复工作、简化程序,提高以实现程序的模块化,避免大量的重复工作、简化程序,提高程序的易读性和可维护性,还可以提高效率。程序的易读性和可维护性,还可以
6、提高效率。例如,以下是使用主函数调用例如,以下是使用主函数调用line()函数输出一个简单的信头的函数输出一个简单的信头的程序。程序。第7页,共98页,编辑于2022年,星期一#include void line()/*定定义函数函数*/printf(=n);void main()line();/*调用函数用函数*/printf(%s,Xinjiang Agricultural Universityn);printf(%s,No.42 Nanchang Rd,Urumqi,Xinjiang,P.R.Chinan);line();/*调用函数用函数*/程序运行程序运行结果:果:=Xinjiang
7、 Agricultural University No.42 Nanchang Rd,Urumqi,Xinjiang,P.R.China=第8页,共98页,编辑于2022年,星期一6.1.2 函数的分函数的分类 C 语言言不不仅提提供供了了极极为丰丰富富的的库函函数数,还允允许用用户建建立立自自己己定定义的的函函数数。我我们可可以以从从不不同同的的角角度度对 C 语言的函数言的函数进行分行分类。6.1 函数概述函数概述第9页,共98页,编辑于2022年,星期一6.1.2 6.1.2 函数的分函数的分类 1 1从从函函数数定定义的的角角度度,函函数数可可分分为库函函数数(又又称称标准准函函数数)
8、和和用用户自自定定义函函数数两两种种。库函函数数包包括括了了常常用用的的数数学学函函数数、字字符符和和字字符符串串处理理函函数数、输入入 /输出出函函数数等等。对每每一一类库函函数数,系系统都都提提供供了了相相应的的头文文件件,该头文文件件中中包包含含了了这一一类库函函数数的的声声明明,如如数数学学函函数数的的说明明包包含含在在“math.h”“math.h”文文件件中中,所所以以程程序序中中如如果果要要用用到到库函函数数时,在在程程序序文文件件的的开开头应使使用用#include#include命命令令包包含含相相应的的头文文件件。用用户自自定定义函函数数是是用用户根据自己的需要根据自己的需
9、要编写的函数,以解决用写的函数,以解决用户的的专门需要。需要。6.1 函数概述函数概述第10页,共98页,编辑于2022年,星期一6.1.2 函数的分函数的分类 2从从函函数数是是否否具具有有返返回回值的的角角度度,函函数数分分为有有返返回回值函函数数和和无无返返回回值函函数数两两种种。有有返返回回值函函数数被被调用用执行行完完后后将将向向调用用者者返返回回一一个个执行行结果果,即即函函数数返返回回值。如如数数学学函函数数sin()等等即即属属于于此此类函函数数。无无返返回回值函函数数用用于于完完成成某某项特特定定的的处理理任任务,执行行完完成成后后不不向向调用用者者返返回回函函数数值。由由于
10、于函函数数无无须返返回回值,用用户在在定定义此此类函函数数时可可指指定定它它的的返返回回值为“空空类型型”,空空类型型的的说明明符符为“void”。6.1 函数概述函数概述第11页,共98页,编辑于2022年,星期一6.1.2 函数的分函数的分类 3从从函函数数是是否否带有有参参数数角角度度,函函数数分分为无无参参函函数数和和有有参参函函数数两两种种。无无参参函函数数在在调用用时,主主调函函数数并并不不将将数数据据传送送给被被调函函数数。而而调用用有有参参数数函数函数时,在主,在主调函数和被函数和被调函数之函数之间有数据有数据传送。送。6.1 函数概述函数概述第12页,共98页,编辑于2022
11、年,星期一6.1.3 函数的定函数的定义 函函数数是是C语言言程程序序的的模模块结构构,除除了了标准准库函函数数以以外外,要要在在C语言言程程序序中中使使用用用用户自自定定义函函数数,必必须遵遵循循函函数数的的先先定定义、后后声声明明、再再使使用用的的步步骤,即首先即首先应定定义好函数的数据好函数的数据类型、存型、存储类型和函数体,然后才能型和函数体,然后才能进行使用。行使用。C语言函数的定言函数的定义形式如下:形式如下:数据数据类型型说明符明符 函数名函数名(形参定形参定义表表)内部内部资料的料的说明明 执行行语句句 6.1 函数概述函数概述第13页,共98页,编辑于2022年,星期一例如:
12、例如:说明:明:数据数据类型确定型确定该函数返回函数返回值的数据的数据类型,缺省型,缺省时系系统认为是是 整型或字符型。整型或字符型。函数名由用函数名由用户自己确定,必自己确定,必须符合符合C语言言标识符的符的规则。形参之形参之间用逗号隔开。函数可以没有形参,但函数名后面的用逗号隔开。函数可以没有形参,但函数名后面的 一一对圆括号不能缺省。括号不能缺省。6.1 函数概述函数概述第14页,共98页,编辑于2022年,星期一例例6.1 6.1 编写一个函数写一个函数,输出由指定数量的指定字符出由指定数量的指定字符组成的分隔条。成的分隔条。#include#include void line(cha
13、r c,int n)/*此函数用于此函数用于输出由指定字符出由指定字符组成的分隔条成的分隔条*/int i;for(i=1;i=n;i+)/*循循环n次次*/putchar(c);/*循循环输出出n个字符个字符*/printf(n);void main()line(*,47);/*传送送*字符以及字符以及输出的字符个数出的字符个数47*/printf(%s,Xinjiang Agricultural Universityn);printf(%s,No.42 Nanchang Rd,Urumqi,Xinjiang,P.R.Chinan);line(*,47);/*传送送*字符以及字符以及输出的字
14、符个数出的字符个数47*/程序运行程序运行结果:果:*Xinjiang Agricultural University No.42 Nanchang Rd,Urumqi,Xinjiang,P.R.China*第15页,共98页,编辑于2022年,星期一6.2 函数的调用函数的调用 在在 C语言中,用言中,用户可以根据需要可以根据需要调用任何函用任何函数来完成某种数来完成某种处理。一个函数理。一个函数调用另一个函数称用另一个函数称为函数函数调用。用。第16页,共98页,编辑于2022年,星期一6.2 函数的调用函数的调用6.2.1 函数的函数的调用方式用方式 函数函数调用的一般形式用的一般形式为
15、:函数名函数名(实参表参表)实参参可可以以是是常常量量、变量量、表表达达式式及及函函数数,各各实参参之之间用逗号隔开,如果函数没有参数,用逗号隔开,如果函数没有参数,则“实参表参表”为空。空。第17页,共98页,编辑于2022年,星期一函数的函数的调用有三种方式:用有三种方式:1)函数表达式。函数)函数表达式。函数调用出用出现在表达式中。在表达式中。例如:例如:s=area(3,4,5);是一个是一个赋值表达式,把表达式,把area函数的返回函数的返回值赋予予变量量s。2)函数)函数语句。函数的句。函数的调用是一个用是一个单独的独的语句。例如:句。例如:printf(I love China.
16、n);scanf(%d,&a);都是以函数都是以函数语句的方式句的方式调用函数。用函数。3)函数参数。函数的)函数参数。函数的调用出用出现在参数的位置。例如:在参数的位置。例如:printf(%d,min(x,y);max(max(a,b),c);前者把前者把min函数的返回函数的返回值作作为printf函数的函数的实参来使用,而后者把参来使用,而后者把max函数的返函数的返回回值又作又作为max 函数的函数的实参来使用。参来使用。在函数在函数调用中用中还应该注意的一个注意的一个问题是求是求值顺序的序的问题,所,所谓求求值顺序是指序是指对实参表中参表中各量是自左至右使用呢,各量是自左至右使用呢
17、,还是自右至左使用。是自右至左使用。对此,各系此,各系统的的规定不一定相同。定不一定相同。6.2 函数的调用函数的调用第18页,共98页,编辑于2022年,星期一例例6.2 求求m个元素中取出个元素中取出n个元素的个元素的组合数。合数。求求组合的公式合的公式为:这个个问题三三次次计算算阶乘乘,因因此此编写写一一个个函函数数计算算阶乘乘,主主函函数数三三次次调用用计算算阶乘乘的的函函数数,即即可完成可完成组合的合的计算。算。6.2 函数的调用函数的调用第19页,共98页,编辑于2022年,星期一void main()long cmn;int m,n,t;printf(input m,n=);sc
18、anf(%d,%d,&m,&n);if(mn)/*若若mn,则交交换m,n的的值*/t=m;m=n;n=t;cmn=fac(m);/*调用用fac函数函数计算算m!*/cmn=cmn/fac(n);/*调用用fac函数函数计算算n!,并且,并且计算(算(m!/n!)*/cmn=cmn/fac(m-n);/*调用用fac函数函数计算算(m-n)!,并且并且计算算m!/(n!(m-n)!)*/printf(cmn=%ldn,cmn);/*输出出计算算结果果*/程序运行程序运行结果:果:input m,n=10,3 cmn=1206.2 函数的调用函数的调用#include long fac(int
19、 n)/*此函数用于此函数用于计算算阶乘乘*/long t=1;int k;for(k=2;k=n;k+)t=t*k;return(t);第20页,共98页,编辑于2022年,星期一6.2.2 对被被调函数原型的函数原型的说明明 C语言程序中一个函数言程序中一个函数调用另一个函数需要具用另一个函数需要具备的条件是:的条件是:被被调用用的的函函数数必必须是是已已经存存在在的的函函数数,是是库函函数数或或用用户自自定定义函数。函数。如如果果调用用库函函数数,必必须要要在在程程序序文文件件的的开开头用用#include命命令令将将与与被被调用用函函数数有有关关的的库函函数数所所在在的的头文文件件包包
20、含含到到文文件件中中来来。如如在在前前面面几几章章已已经用用过的文件包含宏命令(的文件包含宏命令(详见6.8节内容):内容):#include /*说明被明被调用函数将要用到数学函数用函数将要用到数学函数*/6.2 函数的调用函数的调用第21页,共98页,编辑于2022年,星期一 如如果果调用用用用户自自定定义函函数数,并并且且该函函数数与与调用用它它的的函函数数(即即主主调函函数数)在在同同一一个个程程序序文文件件中中,一一般般还应该在在主主调函函数数中中对被被调函函数数作作声声明明。即即向向编译系系统声明将要声明将要调用此函数,并将有关信息通知用此函数,并将有关信息通知编译。与函数定与函数
21、定义的格式的格式对应,函数的声明格式如下:,函数的声明格式如下:存存储类型型 类型型标识符符 函数名函数名(形参的定形参的定义表表);例如:要例如:要对例例6.1和例和例6.2中被中被调用函数用函数 void line(char c,int n)作函数原型的声明,只在其最后再加一个分号即可,即:作函数原型的声明,只在其最后再加一个分号即可,即:void line(char c,int n);long fac(int n);6.2 函数的调用函数的调用第22页,共98页,编辑于2022年,星期一#include#include void line(char c,int n);void main(
22、)line(*,47);printf(%s,Xinjiang Agricultural Universityn);printf(%s,No.42 Nanchang Rd,Urumqi,Xinjiang,P.R.Chinan);line(*,47);void line(char c,int n)int i;for(i=1;i=n;i+)putchar(c);printf(n);6.2 函数的调用函数的调用第23页,共98页,编辑于2022年,星期一6.2.2 对被被调函数原型的声明函数原型的声明 以下几种情况可以不在主以下几种情况可以不在主调函数中函数中对被被调函数原型函数原型进行声明:行声明:
23、如果被如果被调用函数的定用函数的定义出出现在主在主调函数之前函数之前,可以不必加声明。可以不必加声明。例例如如,在在例例6.1和和例例6.2中中,函函数数line()和和fac()均均被被写写在在主主函函数数main()之之前前,在在主主函函数数main()的的前前面面可可以以不不必必对被被调函函数数line()、fac()进行行声声明明。如如果果函函数数line()和和fac()均均被被写写在在主主函函数数main()之之后后,则在在主主函函数数main()之之前前必必须对被被调函数函数line()、fac()进行声明。行声明。6.2 函数的调用函数的调用第24页,共98页,编辑于2022年
24、,星期一 如如果果一一个个函函数数只只被被另另一一个个函函数数所所调用用,在在主主调函函数数中中声声明明和和在在函函数数外外声声明明是是等等价价的的。如如果果一一个个函函数数被被多多个个函函数数所所调用用,可可以以在在所所有有函函数数的的定定义之之前前对被被调函函数数进行行声声明明,这样,在在所所有有主主调函函数数中就不必再中就不必再对被被调函数函数进行声明了。行声明了。例如:例如:6.2 函数的调用函数的调用第25页,共98页,编辑于2022年,星期一char letter(char,char);/*以下以下3行在所有函数之前,且在函数外部行在所有函数之前,且在函数外部*/float f(f
25、loat,float);int i(float,float);void main()/*在在main函数中要调用函数中要调用letter、f和和i函数函数*/./*不必对它所调用的这不必对它所调用的这3个函数进行声明个函数进行声明*/*下面定义被下面定义被main函数调用的函数调用的3个函数个函数*/char letter(char c1,char c2)/*定义定义letter 函数函数*/float f(float x,float y)/*定义定义f函数函数*/.int i(float j,float k)/*定义定义i函数函数*/.由于在文件的开头已对要调用的函数进行了声明,因此编译系统
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第6章 函数与编译预处理PPT讲稿 函数 编译 预处理 PPT 讲稿
限制150内