书签 分享 收藏 举报 版权申诉 / 39
上传文档赚钱

类型C语言课件第六章函数2.ppt

  • 上传人(卖家):晟晟文业
  • 文档编号:4448660
  • 上传时间:2022-12-10
  • 格式:PPT
  • 页数:39
  • 大小:444.51KB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《C语言课件第六章函数2.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    语言 课件 第六 函数
    资源描述:

    1、合肥工业大学Xuan shanli第六章第六章 函函 数数第六章第六章 函函 数数结构化程序设计基础结构化程序设计基础合肥工业大学Xuan shanli第六章第六章 函函 数数结构化程序设计概述 结构化程序设计要求一种自顶向下的设计方法,也就是将复杂结构化程序设计要求一种自顶向下的设计方法,也就是将复杂的系统划分为相对独立的,功能较为单一功能的子系统的组合。的系统划分为相对独立的,功能较为单一功能的子系统的组合。每个子系统称为模块,在每个子系统称为模块,在C语言中表现为函数。语言中表现为函数。复杂问题main()abca1a2b1b2c1c2各模块之间的关系称之为接口。各模块之间的关系称之为接

    2、口。优点:优点:函数实现的功能单一函数实现的功能单一完整,可以独立设计,单完整,可以独立设计,单独调试。易于维护,通用独调试。易于维护,通用性强。性强。合肥工业大学Xuan shanli第六章第六章 函函 数数6.1 函数的定义和调用函数的定义和调用 函数的基本结构函数的基本结构#include void main(void)int a,b,c;scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“%d”c);int max(int x,int y)int z;z=x=y?x:y;return(z);主函数主函数函数体函数体函数的类型,返回值的类型。函数的类型,返回值

    3、的类型。函数名(用标识符命名),函数名(用标识符命名),引用函数的标志,并得到结果。引用函数的标志,并得到结果。函数参数说明表。函数参数说明表。定义!定义!引用!引用!函数定义是要确定函数的函数定义是要确定函数的名称、函数的类型、函数的参名称、函数的类型、函数的参数及函数的功能。数及函数的功能。合肥工业大学Xuan shanli第六章第六章 函函 数数函数的定义函数的定义格式:格式:type 函数名函数名(参数说明表参数说明表)内部说明语句内部说明语句;功能语句功能语句;如果函数有返回值,应含如果函数有返回值,应含有有return语句。语句。int max(int x,int y)int z;

    4、z=x=y?x:y;return(z);说明:说明:函数不能嵌套定义,但可以嵌套引用,包括引用自己。函数不能嵌套定义,但可以嵌套引用,包括引用自己。int max(int x,int y)int cx(int c,int d)/*Error !*/函数如果无返回值,函数如果无返回值,type 应说明为空类型应说明为空类型void。函数无参。函数无参数应定义成数应定义成void。void Bell(void)printf(“007”);合肥工业大学Xuan shanli第六章第六章 函函 数数函数的调用函数的调用调用方式:调用方式:函数名函数名(实参表实参表)一般调用方式有三种:一般调用方式有三

    5、种:v语语 句句 形形 式:式:max(a,b);v表达式形式:表达式形式:c=max(a,b)*2;v函函 数数 参参 数:数:c=max(a,max(b,d);合肥工业大学Xuan shanli第六章第六章 函函 数数调用过程调用过程void main(void)int a,b,c;scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“%5d”,c);int max(int x,int y)int z;z=xy?x:y;return(z);先计算实参的值,从右向左向函数传递调赋值给形参。先计算实参的值,从右向左向函数传递调赋值给形参。23abXy23 转移在函数中

    6、运行,执行到一个转移在函数中运行,执行到一个return语句,将返回表达式语句,将返回表达式的值。由函数名带回给调用函数。的值。由函数名带回给调用函数。z3函数如果没有函数如果没有return语句,由最后一个语句,由最后一个返回一个不确定的值!返回一个不确定的值!合肥工业大学Xuan shanli第六章第六章 函函 数数关于返回值的几点说明:关于返回值的几点说明:函数可以通过一个函数可以通过一个return语句返回一个值,也可以不返回值,语句返回一个值,也可以不返回值,此时应在定义函数时用此时应在定义函数时用void类型加以说明。类型加以说明。函数中可以出现多个函数中可以出现多个return语

    7、句,遇到一个语句,遇到一个return 语句,则语句,则返回值,且返回调用函数,继续执行。返回值,且返回调用函数,继续执行。int max(int x,int y)if(x=y)return x;return y;返回值的类型应与函数的类型一致,如不一致,以函数类型返回值的类型应与函数的类型一致,如不一致,以函数类型为准,为准,先转换为函数类型后,先转换为函数类型后,再返回。再返回。int max(void)float z;return z;/*z先转化为整型先转化为整型*/为了确保参数和返回值类型正确,一般须在函数调用前对其为了确保参数和返回值类型正确,一般须在函数调用前对其类型和参数的类型

    8、加以说明,该说明称之为类型和参数的类型加以说明,该说明称之为原型声明原型声明。int imax(int ,int);void main(void)int x,y,z;z=imax(x,y);原型声明语句,加;原型声明语句,加;合肥工业大学Xuan shanli第六章第六章 函函 数数举例:通过函数求举例:通过函数求 xn。#include double pow(float,int);void main(void)int i;for(i=1;i=9;i+)printf(“%d,%f n”,i,pow(2.5,i);double pow(float x,int n)int i;double p=1

    9、;for(i=1;i=n;i+)p=p*x;return(p);原型声明。原型声明。定义函数定义函数调用函数。调用函数。合肥工业大学Xuan shanli第六章第六章 函函 数数6.2 变量的存储类型及作用域变量的存储类型及作用域 变量是内存数据的抽象,即将内存地址、数据表示变量是内存数据的抽象,即将内存地址、数据表示抽象成一个抽象成一个符号。符号。此外,变量还有此外,变量还有存储类型存储类型,存储类型确定了变量在,存储类型确定了变量在时间上的时间上的生存期和空间上的作用域。生存期和空间上的作用域。变量的存储类型有以下四种:变量的存储类型有以下四种:自动类型自动类型 auto寄存器类型寄存器类

    10、型 register静态类型静态类型 static外部类型外部类型 extern变量的说明格式:变量的说明格式:存储类型存储类型 类型类型 变量名表;变量名表;确定变量在内存中的表示方法。确定变量在内存中的表示方法。确定变量的生存期和作用域。确定变量的生存期和作用域。该项省略表示该项省略表示auto存储类型。存储类型。合肥工业大学Xuan shanli第六章第六章 函函 数数auto存储类型存储类型定义在复合语句的开始处。块内生存块内有效。定义在复合语句的开始处。块内生存块内有效。#include void main(void)auto int a,b;scanf(“%d,%d”,&a,&b)

    11、;if(ba)int iTemp;iTemp=a;a=b;b=iTemp;printf(“Max=%d”,a);ab的的作作用用域域iTemp的作用域。的作用域。生存期:生存期:执行到复合语句建立内存执行到复合语句建立内存变量。执行出复合语句变量消变量。执行出复合语句变量消亡。亡。iTempregister存储类型存储类型 作用域和生存期和作用域和生存期和auto相同,相同,差别在于,如果差别在于,如果CPU内部的寄存内部的寄存器空闲,器空闲,则使用寄存器作为变量则使用寄存器作为变量的存储单元,以提高速度。主要的存储单元,以提高速度。主要用于循环变量。用于循环变量。合肥工业大学Xuan sha

    12、nli第六章第六章 函函 数数static(静态静态)存储类型存储类型作用域:作用域:在定义的复合语句内引用,出了复合语句不可见。在定义的复合语句内引用,出了复合语句不可见。生存期:生存期:从定义直到程序结束,执行出从定义直到程序结束,执行出 时,原值并不消失,时,原值并不消失,只是不能引用。只是不能引用。void row(void);void main(void)int b;for (b=1;b=9;b+)row();void row(void)int a=1 ;int b;for(b=1;b=9;b+)printf(“%5d”,a*b);printf(“n”);a+;static说明静态变

    13、量。说明静态变量。a的作用域的作用域生存期从第一次调用到程序结束。生存期从第一次调用到程序结束。合肥工业大学Xuan shanli第六章第六章 函函 数数外部变量(外部变量(extern存储类型)存储类型)外部变量是定义在任何模块之外的变量。也称为外部变量是定义在任何模块之外的变量。也称为全局变量。全局变量。作用域:作用域:从定义直到文件结束。从定义直到文件结束。生存期:生存期:在程序的整个执行过程中。任何函数对外部变量的修在程序的整个执行过程中。任何函数对外部变量的修改都会影响其他函数对外部变量引用时的值。改都会影响其他函数对外部变量引用时的值。#include void add(void)

    14、;int a,b,c;void main(void)scanf(“%d,%d”,&a,&b);add();printf(“%d”,c);void add(void)c=a+b;外部变量。外部变量。作用域作用域合肥工业大学Xuan shanli第六章第六章 函函 数数关于外部变量的几点说明:关于外部变量的几点说明:外部变量可以通过说明改变其作用域。外部变量可以通过说明改变其作用域。void main()int i;/*i为外部变量为外部变量*/void max(int a,int b)作用域作用域extern i;新的作用域新的作用域外部变量可以被不同的文件共享。外部变量可以被不同的文件共享。f

    15、ile1.c file2.c int a ;extern int a;文件文件1定义的外部变量。定义的外部变量。文件文件2通过说明使用通过说明使用文件文件1的外部变量。的外部变量。如果只希望在本文件中使用,可以加如果只希望在本文件中使用,可以加static说明。说明。static合肥工业大学Xuan shanli第六章第六章 函函 数数关于外部变量的几点说明:关于外部变量的几点说明:模块设计的原则:内聚性强,耦合性弱。外部变量的使用占模块设计的原则:内聚性强,耦合性弱。外部变量的使用占用内存且增加模块的耦合性,因此,用内存且增加模块的耦合性,因此,应尽量不使用外部变量。应尽量不使用外部变量。当

    16、模块中出现和全局变量同名的局部变量时,局部变量在模当模块中出现和全局变量同名的局部变量时,局部变量在模块中优先。块中优先。int a;void main(void)a=5;void fun()int a;a=5;合肥工业大学Xuan shanli第六章第六章 函函 数数外部变量应用举例:用外部变量交换两个变量的值。外部变量应用举例:用外部变量交换两个变量的值。#include int a,b;void main(void)scanf(“%d,%d”,&a,&b);fun();printf(“a=%d,b=%dn”,a,b);void fun(void)int c;c=a;a=b;b=c;a、b

    17、外部变量。外部变量。ab合肥工业大学Xuan shanli第六章第六章 函函 数数外部变量的副作用外部变量的副作用#include int i;void prt(void);void main(void)for(i=0;i5;i+)prt();void prt(void)for(i=0;i5;i+)printf(“%c”,*););printf(“n”);函数的作用:打印五个函数的作用:打印五个*,再回车。,再回车。几次调用函数?几次调用函数?i=0i=0i=0i=0i=0i=1i=2i=3i=4i=5i=5i=5i=5i=5合肥工业大学Xuan shanli第六章第六章 函函 数数6.3 函

    18、数间的数据传递函数间的数据传递 函数在调用的过程中,调用函数和被调函数存在数据的相互传函数在调用的过程中,调用函数和被调函数存在数据的相互传递。数据的传递包括两个方面:递。数据的传递包括两个方面:将值传递给被调函数;将值传递给被调函数;将被调函数的结果返回给调用函数。将被调函数的结果返回给调用函数。调用函数调用函数被调函数被调函数向被调函数传递值。向被调函数传递值。将结果返回给调用函数。将结果返回给调用函数。合肥工业大学Xuan shanli第六章第六章 函函 数数数据传递方式数据传递方式通过函数参数传值或传地址;通过函数参数传值或传地址;通过返回值传递结果通过返回值传递结果;通过通过全局变量

    19、全局变量传递参数或结果。传递参数或结果。合肥工业大学Xuan shanli第六章第六章 函函 数数使用参数传递数据使用参数传递数据传值方式传值方式 通过实参与形参的结合,将通过实参与形参的结合,将数据值传递给形参数据值传递给形参,形参的改变不,形参的改变不影响实参。影响实参。#include int splus(int,int);void main(void)int a,b,c;scanf(“%d,%d”,&a,&b);c=splus(a,b);printf(“a*b=%d n”,c);int splus(int x,int y)int z;z=x*y;return(z);调用函数调用函数被调

    20、函数被调函数x、y形参。形参。a、b实参变量的值。实参变量的值。传递参数传递参数a:2b:3y:x:32z:6返回值返回值合肥工业大学Xuan shanli第六章第六章 函函 数数传地址方式传地址方式 形参定义为指针,实参为变量的地址,被调函数通过地址可以形参定义为指针,实参为变量的地址,被调函数通过地址可以修改地址对应的变量。修改地址对应的变量。#include void swap(int*,int *);void main(void)int a,b;scanf(“%d,%d”,&a,&b);if(ab)swap(&a,&b);printf(“n%d,%d n”,a,b);void swap

    21、(int*x,int*y)int t;t=*x;*x=*y;*y=t;用函数实现两个变量用函数实现两个变量a、b值的交换值的交换46ab2000H2400Hxy2400H2000H参数变量是否可以实现交换?参数变量是否可以实现交换?合肥工业大学Xuan shanli第六章第六章 函函 数数外部变量传递参数外部变量传递参数 定义外部变量被调用函数和被调函数定义外部变量被调用函数和被调函数共享共享,任何函数对外部变,任何函数对外部变量的修改都会量的修改都会影响到其他函数所见的外部变量的值。影响到其他函数所见的外部变量的值。#include int c;void main(void)int a,b;

    22、scanf(“%d,%d”,&a,&b);splus (a,b);printf(“a*b=%d n”,c);void splus(int x,int y)c=x*y;定义外部变量定义外部变量c6 说明:说明:应尽量少用外部变量,应使函数内部的内聚性强,函数应尽量少用外部变量,应使函数内部的内聚性强,函数之间的偶合性弱。之间的偶合性弱。合肥工业大学Xuan shanli第六章第六章 函函 数数6.4 数组与函数参数数组与函数参数 问题:问题:引用数组时只能引用数组元素。如果用参数传递数组元引用数组时只能引用数组元素。如果用参数传递数组元素,则函数需要参数的量太多。为了解决此问题,可以素,则函数需

    23、要参数的量太多。为了解决此问题,可以通过指针传通过指针传递数组的地址。递数组的地址。数组作为函数参数定义有三种方式:数组作为函数参数定义有三种方式:形参为指针;形参为指针;int ave(int*p)形参为无下标数组;形参为无下标数组;int ave(int a)形参为有下标数组。形参为有下标数组。int ave(int a10)合肥工业大学Xuan shanli第六章第六章 函函 数数举例:通过函数求数组元素的平均值。举例:通过函数求数组元素的平均值。#include float mean(int*,int);void main(void)int i,array10=1,2,3,4,5,6,

    24、7,8,910;float av;av=mean(array,10);printf(“av=%f n%d”,av,array 0);float mean(int*data ,int num)int i;float avg=0;for(i=0;inum;i+)avg+=*data+;avg/=num;*(data-10)=-1;return(avg);指针法;指针法;指针法。指针法。形参为无下标数组;形参为无下标数组;无下标数组。无下标数组。int data data0=-1;data i;int data10形参为有下标数组。形参为有下标数组。形参为有下标数组。形参为有下标数组。说明:说明:三

    25、种方法的实质都是传递地址,三种方法的实质都是传递地址,可以混用。可以混用。形参的任何改变都影响实参。形参的任何改变都影响实参。函数中对数组的操作,下标不要函数中对数组的操作,下标不要超过数组的下标范围。超过数组的下标范围。合肥工业大学Xuan shanli第六章第六章 函函 数数6.5 返回指针的函数返回指针的函数 概念:概念:函数可以返回一个值,也可以返回一个地址(指针),函数可以返回一个值,也可以返回一个地址(指针),如果函数返回指针,称为如果函数返回指针,称为返回指针的函数。返回指针的函数。定义:定义:type *函数名(形参表)函数名(形参表)int *max(int*a,int*b)

    26、合肥工业大学Xuan shanli第六章第六章 函函 数数举例:举例:在字符串中查找特定的字符。在字符串中查找特定的字符。#include#include char*lstrchar(char*,char);void main(void)char c,*p,str80;gets(str);scanf(“%c”,&c);p=lstrchar(str,c);if(p=NULL)printf(“char%c not foundn”,c);else printf(“The position is%d”,p-str);char*lstrchar(char *s,char ch)char *chp=NUL

    27、L;while(*s+!=0)if(*s=ch)chp=s;break;return chp;返回指针的函数。返回指针的函数。指向空!指向空!合肥工业大学Xuan shanli第六章第六章 函函 数数6.6 指向函数的指针指向函数的指针 概念:概念:函数为程序模块,函数对应内存的地址,函数为程序模块,函数对应内存的地址,其首地址称为其首地址称为函数的入口地址,用函数名表示。函数的入口地址,用函数名表示。C语言可以通过指针指向函数的语言可以通过指针指向函数的入口地址,从而实现函数的调用。入口地址,从而实现函数的调用。c=max(a,b);int max(int x,int y)return(x=

    28、y?x:y);2400H指向函数指针的定义:指向函数指针的定义:type(*p)();函数的类型。函数的类型。指针指针函数函数使用过程:使用过程:定义函数和指向函数的指针;定义函数和指向函数的指针;指针指向函数;指针指向函数;p=funname;通过指针引用函数。格式:通过指针引用函数。格式:(*p)(实参表实参表);合肥工业大学Xuan shanli第六章第六章 函函 数数举例:求举例:求a、b的最大值。的最大值。#include int lmax(int,int);void main(void)int a,b,c;int (*funp)();funp=lmax;scanf(“%d,%d”,

    29、&a,&b)c=(*funp)(a,b);printf(“Max.is%dn”,c);int lmax(int x,int y)return(xy?x:y);说明指向函数的指针。说明指向函数的指针。指针指向函数。指针指向函数。funplmax通过指针引用函数。通过指针引用函数。lmax合肥工业大学Xuan shanli第六章第六章 函函 数数举例:通过参数传递,求举例:通过参数传递,求a、b之和、之差。之和、之差。#include int plus(int,int);int sub(int,int);int funa(int,int,int(*)(int,int);void main(void

    30、)int a,b,c;scanf(“%d,%d”,&a,&b);c=funa(a,b,plus);printf(“na+b=%d”,c);c=funa(a,b,sub);printf(“na-b=%d”,c);int funa(int x,int y,int(*funp)(int,int)return(*funp)(x,y);int plus(int x,int y)return(x+y);int sub(int x,int y)return(x-y);合肥工业大学Xuan shanli第六章第六章 函函 数数6.7 递归函数递归函数 概念:概念:函数直接或间接地自我调用称为递归函数。函数直接

    31、或间接地自我调用称为递归函数。int fun1(int x)z=fun1(y);int fun1(int x)int fun2(int t)z=fun2(y);c=fun1(a);直接引用自身。直接引用自身。间接引用自身。间接引用自身。递归在没有控制条件的情况下是无穷的递归。递归在没有控制条件的情况下是无穷的递归。void main(void)printf(“*n”);main();只有通过控制条件,使递归调用终止,才能应用。只有通过控制条件,使递归调用终止,才能应用。void main(void)printf(“*n”);ch=getchar();if(ch!=9)main();合肥工业大学

    32、Xuan shanli第六章第六章 函函 数数递归举例:求递归举例:求n!。n!=1 n=0或或n=1n(n-1)!n1f(n)=1 n=0或或n=1nf(n-1)n1#include long lfac(long);void main(void)long i,x;scanf(“%ld”,&i);x=lfac(i);printf(“n%ld”,x);long lfac(long n)if(n=0|n=1)return 1;else return(n*lfac(n-1);lfac(4)4*lfac(3)3*lfac(2)2*flac(1)2*13*2*14*3*2*1递推递推回归回归合肥工业大学

    33、Xuan shanli第六章第六章 函函 数数6.8 命令行参数命令行参数如如DOS命令:命令:COPY A:S.DOC C:命令。命令。命令对象,命令参数。命令对象,命令参数。C支持由主函数支持由主函数main(),在程序执行时,从操作系统接收传递的在程序执行时,从操作系统接收传递的参数。并记录参数供程序处理。主函数一般有两个参数。参数。并记录参数供程序处理。主函数一般有两个参数。void main(int argc,char*argv)整型变量,记录包括命整型变量,记录包括命令行在内的字符串个数。令行在内的字符串个数。指向字符的指向字符的指针数组。记录指针数组。记录所有参数字符串所有参数字

    34、符串的地址。的地址。合肥工业大学Xuan shanli第六章第六章 函函 数数举例:回显命令行参数。举例:回显命令行参数。#include void main(int argc,char *argv)int i;for(i=1;iargc;i+)printf(“%s%c”,argv i,(iargc 4argv0argv1argv2argv3test0Hello0are0you?0合肥工业大学Xuan shanli第六章第六章 函函 数数6.9 编译预处理编译预处理 C 语言除了说明语句、执行语句及控制语句外,还有一类语言除了说明语句、执行语句及控制语句外,还有一类编译编译预处理语句预处理语句

    35、。该类语句的作用是。该类语句的作用是在编译时对程序作一定的处理在编译时对程序作一定的处理,满,满足特定的处理要求。编译预处理时足特定的处理要求。编译预处理时C语言的重要特征。语言的重要特征。编译预处理语句的语法形式:编译预处理语句的语法形式:#关键词关键词 参数表参数表编译预处理语句不用;作为结束标志!编译预处理语句不用;作为结束标志!宏定义预处理宏定义预处理不带参数的宏定义不带参数的宏定义作用:作用:定义常量名,提高程序的可读性,便于修改。定义常量名,提高程序的可读性,便于修改。格式:格式:#define 宏名宏名 字符串字符串#define PI 3.1415926void main(vo

    36、id)flaot r;scanf(“%f”,&r)printf(“%fn”,PI*r*r);编译时用字符串替代宏名。编译时用字符串替代宏名。3.1415926合肥工业大学Xuan shanli第六章第六章 函函 数数说明:说明:宏名一般用大写;宏名一般用大写;编译时用字符串无条件替代宏名;编译时用字符串无条件替代宏名;#define PI 3.1415926;PI*r*r3.1415926;*r*r 宏名的有效范围,从定义到程序尾。也可以通过宏名的有效范围,从定义到程序尾。也可以通过#undef修改修改定义范围。定义范围。#define G 9.8void main(void)#undef G

    37、G的范围的范围可以在宏定义的字符串中使用已定义的宏名。可以在宏定义的字符串中使用已定义的宏名。”字符串中的宏名不替换。字符串中的宏名不替换。#define R 3.0#define PI 3.14159#define S PI*R*Rprintf(“S=%f”,S);不替换。不替换。合肥工业大学Xuan shanli第六章第六章 函函 数数带参数的宏定义带参数的宏定义格式:格式:#define 宏名宏名(参数表参数表)含参数的字符串含参数的字符串#define S(a,b)a*barea=S(4,3);替换过程:替换过程:将实际参数替换宏定义的参数。将实际参数替换宏定义的参数。替换字符串中的参

    38、数。替换字符串中的参数。替换整个宏。替换整个宏。4*3带参的宏与函数的区别:带参的宏与函数的区别:带参宏不分配内存单元,不返回值,只是在编译时按规则替换。带参宏不分配内存单元,不返回值,只是在编译时按规则替换。关于带参宏的说明:关于带参宏的说明:要严格按格式书写,否则会造成错误。要严格按格式书写,否则会造成错误。#define S (a,b)a*b S(3,4)被替换成:被替换成:(a,b)a*b(3,4)参数有可能用到表达式时,参数字符要加()。参数有可能用到表达式时,参数字符要加()。#define S(r)PI*r*rS(a+b)替换为:替换为:PI*a+b*a+b#define S(r

    39、)PI*(r)*(r)S(a+b)替换为:替换为:PI*(a+b)*(a+b)合肥工业大学Xuan shanli第六章第六章 函函 数数文件包含文件包含格式:格式:#include#include ”被包含的文件名被包含的文件名”表示编译系统定义路径;表示编译系统定义路径;“”表示用户指明路径。表示用户指明路径。作用:作用:将指定的文件的内容和当前文件一起编译。将指定的文件的内容和当前文件一起编译。说明:说明:一个一个#include只能包含一个文件。只能包含一个文件。被包含文件可以嵌套包含文件。被包含文件可以嵌套包含文件。一般将宏定义及函数的原型声明放在包含文件中。一般将宏定义及函数的原型声

    40、明放在包含文件中。被包含的文件一般扩展名为被包含的文件一般扩展名为.h,称为头文件。,称为头文件。合肥工业大学Xuan shanli第六章第六章 函函 数数文件包含举例:求半径为文件包含举例:求半径为r的园面积、园周长。的园面积、园周长。#include “my.h”void main(void)float r,fArea,fLen;scanf(“%f”,&r);fArea=S(r);fLen=L(r);printf(“Area=%f,Len=%f”,fArea,fLen);float S(float r)return PI*r*r;float L(float r)return 2*PI*r;

    41、#include#define PI 3.1415926float S(float);float L(float);合肥工业大学Xuan shanli第六章第六章 函函 数数条件编译条件编译 C 语言可以通过条件控制,让编译系统编译不同的程序段,从语言可以通过条件控制,让编译系统编译不同的程序段,从而提高程序的移植性并方便调试。而提高程序的移植性并方便调试。条件编译有三种形式:条件编译有三种形式:#ifdef 标识符标识符 program seg1#else program seg2#endif#ifndef 标识符标识符 program seg1#else program seg2#endi

    42、f123#if 表达式表达式 program seg1#else program seg2#endif条件?条件?满足满足编译程序段编译程序段1不满足不满足编译程序段编译程序段2合肥工业大学Xuan shanli第六章第六章 函函 数数举例:通过条件编译选择求最大值或最小值举例:通过条件编译选择求最大值或最小值#include void main(void)int a,b;scanf(“%d,%d”,&a,&b);#ifdef MAX printf(“%d”,a=b?a:b);#else printf(“%d”,a=b?a:b);#endif#define MAX#include void main(void)int a,b;scanf(“%d,%d”,&a,&b);printf(“%d”,a=b?a:b);

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:C语言课件第六章函数2.ppt
    链接地址:https://www.163wenku.com/p-4448660.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库