ImageVerifierCode 换一换
格式:PPT , 页数:33 ,大小:625.50KB ,
文档编号:7375487      下载积分:15 文币
快捷下载
登录下载
邮箱/手机:
温馨提示:
系统将以此处填写的邮箱或者手机号生成账号和密码,方便再次下载。 如填写123,账号和密码都是123。
支付方式: 支付宝    微信支付   
验证码:   换一换

优惠套餐
 

温馨提示:若手机下载失败,请复制以下地址【https://www.163wenku.com/d-7375487.html】到电脑浏览器->登陆(账号密码均为手机号或邮箱;不要扫码登陆)->重新下载(不再收费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录  
下载须知

1: 试题类文档的标题没说有答案,则无答案;主观题也可能无答案。PPT的音视频可能无法播放。 请谨慎下单,一旦售出,概不退换。
2: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
3: 本文为用户(momomo)主动上传,所有收益归该用户。163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

1,本文(《C语言程序设计(第三版)》课件第7章 函数.ppt)为本站会员(momomo)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!

《C语言程序设计(第三版)》课件第7章 函数.ppt

1、l理解并掌握函数的概念、定义和调用的方法和理解并掌握函数的概念、定义和调用的方法和实质实质l掌握有参函数的数据传递方法,区分掌握有参函数的数据传递方法,区分“值传递值传递”与与“地址传递地址传递”l理解标识符作用域和生成期的概念理解标识符作用域和生成期的概念l理解并掌握存储类型的概念理解并掌握存储类型的概念l理解并学会设计简单的递归函数理解并学会设计简单的递归函数 引言引言 l函数可以实现程序的模块化,使得程序设计简函数可以实现程序的模块化,使得程序设计简单、直观,提高程序的可读性和可维护性,程单、直观,提高程序的可读性和可维护性,程序员还可以将一些常用的算法编写成通用函数,序员还可以将一些常

2、用的算法编写成通用函数,以供随时调用。以供随时调用。l无论程序的设计规模有多大、多复杂,都是划无论程序的设计规模有多大、多复杂,都是划分为若干个相对独立、功能较单一的函数,通分为若干个相对独立、功能较单一的函数,通过对这些函数的调用,从而实现程序的功能。过对这些函数的调用,从而实现程序的功能。lC语言的函数分为库函数和用户自定义函数语言的函数分为库函数和用户自定义函数 7.1 函数的定义和调用函数的定义和调用l7.1.1 函数定义函数定义函数的定义如下:函数的定义如下:类型类型 函数名函数名(参数列表参数列表)/函数体函数体 7.1.1 函数定义函数定义l类型指函数返回值的数据类型,函数名采用

3、标识符,类型指函数返回值的数据类型,函数名采用标识符,一对括号一对括号“()”内是参数列表,一对大括号内是参数列表,一对大括号“”内内是函数体,由一组语句组成,完成函数具体功能的是函数体,由一组语句组成,完成函数具体功能的实现。实现。l函数值的返回通常是运行结果或状态值。返回采用函数值的返回通常是运行结果或状态值。返回采用return 语句,例如:语句,例如:lreturn 0;lreturn xy?x:y;lreturn 后面跟表达式。后面跟表达式。l返回值的类型也可以是返回值的类型也可以是void类型,这种情况下可以类型,这种情况下可以写成:写成:return;也可以省略返回语句。也可以省

4、略返回语句。参数参数:lvoid l表示函数没有参数,通常把这种函数称为无参函数。表示函数没有参数,通常把这种函数称为无参函数。例如:例如:int sum(void)int i,s=0;for(i=1,s=0;i=100;i+)s=s+i;return sl函数计算并返回函数计算并返回1到到100之间的整数之和。之间的整数之和。参数参数:l参数类型参数类型1 参数名参数名1,参数类型参数类型2 参数名参数名2,l函数包含一个或多个参数,每个参数都必须函数包含一个或多个参数,每个参数都必须标注具体的数据类型。这样的函数又称为有标注具体的数据类型。这样的函数又称为有参函数。例如:参函数。例如:in

5、t sum(int n)int i,s=0;for(i=1,s=0;i=n;i+)s=s+i;return s;l函数计算并返回函数计算并返回1到到n之间的整数之和。之间的整数之和。7.1.2 函数调用函数调用 l函数调用的形式如下:函数调用的形式如下:l函数名函数名(实参列表实参列表)l例如:例如:ls=sum(100)+sum(200);ls=sum(100+200);ls=sum(n);l参数从调用的角度分为实际参数和形式参数,参数从调用的角度分为实际参数和形式参数,或简称为实参和形参。实参和形参是一一对应或简称为实参和形参。实参和形参是一一对应的关系,参数的个数和类型都必须一致。如果的

6、关系,参数的个数和类型都必须一致。如果类型不一致将自动转换,不能自动转换的将在类型不一致将自动转换,不能自动转换的将在编译或运行时出错。编译或运行时出错。【例例7-1】演示函数的定义和调用。演示函数的定义和调用。#include int sum(int n)int i,s=0;for(i=1;i=n;i+)s=s+i;return s;main()int s;s=sum(3)+sum(4)+sum(5);printf(1+2+3)+(1+2+3+4)+(1+2+3+4+5)=%dn,s);7.1.3 参考传递参考传递 l实参向形参的参数传递有两种形式:实参向形参的参数传递有两种形式:l值传递和

7、地址传递。值传递和地址传递。l值传递值传递是单向的数据传递,传递完成后,对形参的是单向的数据传递,传递完成后,对形参的任何操作都不会影响实参。任何操作都不会影响实参。l地址传递地址传递也可以说是单向的数据传递,但这种数据也可以说是单向的数据传递,但这种数据往往是变量、结构体、对象等的地址,对形参的操往往是变量、结构体、对象等的地址,对形参的操作会直接影响实参,从而使得这种形式上的作会直接影响实参,从而使得这种形式上的“单向单向”数据传递变成数据传递变成“双向双向”的的 7.1.3 参考传递参考传递7.1.3 参考传递参考传递【例例7-2】演示函数的参数传递演示函数的参数传递 main()int

8、 x=10,y=20;int a10=1,2,3,4,5,6,7,8,9,10;int i,s=0;swap(x,y);/*值传递值传递*/printf(x,y=%d(main)n,x,y);for(i=0;i 10;i+)s=s+ai;printf(s=%dn,s);s=0;change(a);/*地址传递地址传递*/for(i=0;i 10;i+)s=s+ai;printf(s=%dn,s);#include void swap(int a,int b)int t;t=a;a=b;b=t;printf(a,b=%d(swap)n,a,b);void change(int x10)int i

9、;for(i=0;i10;i+)xi=xi+1;7.1.4 函数声明函数声明 l函数的声明是对函数类型、名称等的函数的声明是对函数类型、名称等的说明说明。对函数及其。对函数及其函数体的建立称为函数的函数体的建立称为函数的定义定义。对函数的说明可以和定。对函数的说明可以和定义一起完成,也可以只对函数的原型进行声明,这种声义一起完成,也可以只对函数的原型进行声明,这种声明通常称为引用性声明,其格式如下:明通常称为引用性声明,其格式如下:l ();l如:如:lint sum(int a,int b);l和完整的函数声明不同的是,形参表可以只给出形参的和完整的函数声明不同的是,形参表可以只给出形参的类

10、型,如:类型,如:lint sum(int,int);l形参名可以省略。形参名可以省略。l另外,这种声明是一条语句,后面的分号(另外,这种声明是一条语句,后面的分号(;)必不可)必不可少。少。7.4 标识符作用域标识符作用域 l作用域就是作用范围,不同作用域允许相作用域就是作用范围,不同作用域允许相同的标识符出现,同一作用域标识符不能同的标识符出现,同一作用域标识符不能重复,嵌套的作用域标识符由内向外屏蔽。重复,嵌套的作用域标识符由内向外屏蔽。7.4 标识符作用域标识符作用域l已上由两个文件组成的程序中不同形式已上由两个文件组成的程序中不同形式的作用域,其中的作用域,其中块作用域块作用域和和函

11、数作用域函数作用域包含在包含在文件作用域文件作用域中。中。l块作用域块作用域通常指一对花括号通常指一对花括号“”,例如,例如复合语句和函数体等。函数的形参表也复合语句和函数体等。函数的形参表也可称为块。可称为块。l函数中可以包含块,块中也可以有更小函数中可以包含块,块中也可以有更小范围的块范围的块【例例7-3】作用域演示作用域演示 int a=10;static int add(int a,int b)return a+b;main()int a,b,c;int i,s=0;int sub(int,int);extern int d;a=20;c=10;int a;int c=20;b=10;

12、a=add(b,c);nprintf(a=%d,b=%d,c=%dn,a,b,c);for(i=1;i=100;i+)s=s+i;for(i=1;i=100;i+)s=sub(s,i);printf(s=%dn,s);printf(d=%dn,d);extern int sub(int a,int b)return a-b;int d=888;int e=999;7.5 存储类型存储类型 l从分配内存到被回收,变量的使用具有时效性,这就从分配内存到被回收,变量的使用具有时效性,这就是变量的生存期。在整个程序运行过程中,不同存储是变量的生存期。在整个程序运行过程中,不同存储类型的变量生存期也各有

13、差异。类型的变量生存期也各有差异。l一个程序在内存中占用的存储空间分为两个部分:程一个程序在内存中占用的存储空间分为两个部分:程序区和数据区,数据区也可以分成静态数据区和动态序区和数据区,数据区也可以分成静态数据区和动态数据区。数据区。l生存期和作用域是不同的概念,分别从时间上和空间生存期和作用域是不同的概念,分别从时间上和空间上对变量的使用进行界定,相互关联又不完全一致,上对变量的使用进行界定,相互关联又不完全一致,例如,静态变量的生存期贯穿整个程序,但作用域是例如,静态变量的生存期贯穿整个程序,但作用域是从声明位置开始到文件结束。从声明位置开始到文件结束。7.5 存储类型存储类型l变量的存

14、储类型包括变量的存储类型包括:l自动(自动(auto)l寄存器(寄存器(register)l静态(静态(static)l外部(外部(extern)7.5.1 自动(自动(auto)类型)类型 lauto用于局部变量的存储类型声明,可以省略,用于局部变量的存储类型声明,可以省略,系统默认局部变量为系统默认局部变量为auto类型。类型。lauto类型变量是动态变量,声明时系统不会自动类型变量是动态变量,声明时系统不会自动初始化,其值是随机的,所以必须在使用前初始初始化,其值是随机的,所以必须在使用前初始化或赋值。下面的用法是错误的:化或赋值。下面的用法是错误的:int add(int a,int

15、b)int c;c=c+a+b;/*错误:错误:c没有初始化没有初始化*/return c;auto int a;/*错误:外部变量不能声明为错误:外部变量不能声明为auto*/7.5.2 寄存器(寄存器(register)类型)类型 lregister用于局部变量的存储类型声明,表示用于局部变量的存储类型声明,表示请求编译器尽可能直接分配使用请求编译器尽可能直接分配使用CPU的寄存器,的寄存器,在寄存器满的情况下才分配内存。这种类型的在寄存器满的情况下才分配内存。这种类型的变量主要用于循环变量,可以大大提高对这种变量主要用于循环变量,可以大大提高对这种变量的存取速度,从而提高程序效率。变量的

16、存取速度,从而提高程序效率。l能实际实现为能实际实现为register类型的变量很少,主要类型的变量很少,主要是寄存器数量有限。是寄存器数量有限。7.5.3 静态(静态(static)类型)类型 lstatic类型变量称为静态变量,存放在静态存储区。类型变量称为静态变量,存放在静态存储区。l全局变量和局部变量都可以声明为全局变量和局部变量都可以声明为static类型,但意类型,但意义不同。义不同。l全局变量总是静态存储,默认值为全局变量总是静态存储,默认值为0。全局变量前加。全局变量前加上上static表示该变量只能在本程序文件内使用,其他表示该变量只能在本程序文件内使用,其他文件无使用权限。

17、对于全局变量,文件无使用权限。对于全局变量,static关键字主要关键字主要用于在程序包含多个文件时限制变量的使用范围,对用于在程序包含多个文件时限制变量的使用范围,对于只有一个文件的程序有无于只有一个文件的程序有无static都是一样。都是一样。l局部变量声明为局部变量声明为static类型,则要求系统对该变量采类型,则要求系统对该变量采用静态存储的内存分配方式。值得注意的是,对这种用静态存储的内存分配方式。值得注意的是,对这种static类型的局部变量,系统初始化只进行一次,多类型的局部变量,系统初始化只进行一次,多次遇到该声明语句,将不再被执行。次遇到该声明语句,将不再被执行。【例例7-

18、5】演示静态变量演示静态变量 int s;static int t;/*其他文件不能使用其他文件不能使用*/main()int sum(int);int i;for(i=3;i=5;i+)s=sum(i);t=t+s;/*t自动初始化为自动初始化为0*/printf(1+2+3+4+5=%dn,s);printf(1+2+3)+(1+2+3+4)+(1+2+3+4+5)=%dn,t);int sum(int n)static int s=0;/*该行语句只执行一次该行语句只执行一次*/int i;for(i=1;i=n;i+)s=s+i;return s;【程序分析】【程序分析】lsum函数计

19、算函数计算1+2+3+n。主函数中利用。主函数中利用for循环循环3次调用次调用sum函数,分别计算函数,分别计算sum(3)、sum(4)、sum(5)lsum(3)=1+2+3=6 l s 等于等于6lsum(4)=6+(1+2+3+4)=6+10=16 l s 等于等于16lsum(5)=16+(1+2+3+4+5)=16+15=31l s 等于等于31lt=6+16+31=537.5.4 外部(外部(extern)类型)类型 lextern 关键字用于声明外部的联接。对于关键字用于声明外部的联接。对于全局变量,以下定义形式没什么区别:全局变量,以下定义形式没什么区别:lextern i

20、nt a;lint a;l默认情况下,在文件域中声明的变量和函默认情况下,在文件域中声明的变量和函数都是外部的。但对于作用域范围之外的数都是外部的。但对于作用域范围之外的变量和函数,需要变量和函数,需要extern来进行引用性声来进行引用性声明。明。7.6 递归函数递归函数 l函数不能嵌套定义,但可以嵌套调用。函数函数不能嵌套定义,但可以嵌套调用。函数A可以调用可以调用B,函数,函数B也可以调用也可以调用C,这种调用,这种调用称为嵌套调用。称为嵌套调用。l函数直接或间接调用自身,则称为递归调用,函数直接或间接调用自身,则称为递归调用,该函数则称为递归函数。该函数则称为递归函数。【例例7-6】演

21、示递归函数的应用。演示递归函数的应用。int f(int n)if(n=1)return 1;elsereturn n*f(n-1);int s(int n)if(n=1)return 1;elsereturn n+s(n-1);main()printf(5!=%dn,f(5);printf(1+2+3+.+100=%dn,s(100);7.7 程序示例程序示例【例例7-7】演示函数调用时求值的顺序。演示函数调用时求值的顺序。void f(int a,int b)printf(a=%d,b=%dn,a,b);void main()int i,j;i=j=1;f(i,+i);i=j=1;f(i,

22、i+);i=j=1;f(i+j,+i);i=j=1;f(i+j,i+);【例例7-8】验证验证9999是否符合是否符合“歌歌德巴赫猜想德巴赫猜想”。l哥德巴赫(哥德巴赫(Goldbach C.,1690.3.18-1764.11.20)是)是德国数学家,出生于格奥尼格斯别尔格(现名加里宁德国数学家,出生于格奥尼格斯别尔格(现名加里宁城),曾在英国牛津大学学习;原学法学,由于在欧洲城),曾在英国牛津大学学习;原学法学,由于在欧洲各国访问期间结识了贝努利家族,所以对数学研究产生各国访问期间结识了贝努利家族,所以对数学研究产生了兴趣;曾担任中学教师。了兴趣;曾担任中学教师。l“歌德巴赫猜想歌德巴赫猜

23、想”是歌德巴赫在是歌德巴赫在1742年年6月月7日给著名日给著名数学家欧拉的信中提出的一个命题:数学家欧拉的信中提出的一个命题:l随便取某一个奇数,比如随便取某一个奇数,比如77,可以把它写成,可以把它写成3个素数之个素数之和:和:l77=53+17+7l再比如再比如461:l461=449+7+5【例例7-8】验证验证9999是否符合是否符合“歌德歌德巴赫猜想巴赫猜想”。#include#include int isprimer(int);main()int n=9999;int a,b,c;for(a=2;a n;a+)if(isprimer(a)for(b=2;b n;b+)c=n-a-

24、b;if(isprimer(b)&isprimer(c)printf(%d In Goldbach Guessn,n);printf(%d=%d+%d+%dn,n,a,b,c);exit(0);printf(%d Out Goldbach Guessn,n);int isprimer(int n)int i;for(i=2;i n/2)return 1;else return 0;【例例7-9】演示数组和函数的关系演示数组和函数的关系#include int sum(int a,int b)return a+b;int sumarray(int a10)int s=0;int i;for(i=

25、0;i 10;i+)s=s+ai;return s;void cleararray(int a,int pos)int i;apos=0;void clear(int a)a=0;main()int a10=1,2,3,4,5,6,7,8,9,10;printf(a0+a2=%dn,sum(a0,a2);printf(a0+a1+.+a9=%dn,sumarray(a);clear(a2);printf(a0+a2=%dn,sum(a0,a2);printf(a0+a1+.+a9=%dn,sumarray(a);cleararray(a,2);printf(a0+a2=%dn,sum(a0,a

26、2);printf(a0+a1+.+a9=%dn,sumarray(a);【例例7-10】利用递归函数调用输出图形。利用递归函数调用输出图形。#include#define N 5void lineprint(int n)while(n-)printf(*);printf(n);void print(int n)if(n=1)lineprint(n);/*输出一行星号输出一行星号*/print(n-1);/*递归调用递归调用*/else return;void main()print(N);【例例7-10】利用递归函数调用输出图形。利用递归函数调用输出图形。修改修改lineprint函数如下函

27、数如下:void lineprint(int n)int i=n;while(i-)printf();while(n-)printf(*);printf(n);将输出下面的图形将输出下面的图形:l函数的分类:库函数和用户自定义函数。函数的分类:库函数和用户自定义函数。l函数的定义:类型、函数名、形式参数、函数体以及函数的定义:类型、函数名、形式参数、函数体以及函数的原型声明等。函数的原型声明等。l函数的调用:函数的嵌套和递归调用,其中包括函数函数的调用:函数的嵌套和递归调用,其中包括函数实参和形参之间的实参和形参之间的3种传递方式:值传递、引用传递、种传递方式:值传递、引用传递、地址传递。地址

28、传递。l变量的作用域和存储方式:变量的作用域是指变量在变量的作用域和存储方式:变量的作用域是指变量在程序中的有效范围,分为局部变量和全局变量。变量程序中的有效范围,分为局部变量和全局变量。变量的存储方式是指变量在内存中的存储类型,它表示了的存储方式是指变量在内存中的存储类型,它表示了变量的生存期,分为静态存储和动态存储,具体的存变量的生存期,分为静态存储和动态存储,具体的存储类型包括储类型包括auto、register、static和和extern四种。四种。l编写函数,求编写函数,求1+3+5+7+99l编写函数,求编写函数,求3个整数中的最大数。个整数中的最大数。l编写函数,实现在一个字符串中插入指定字符。编写函数,实现在一个字符串中插入指定字符。l编写函数,将输入的十进制数转换成十六进制数并输编写函数,将输入的十进制数转换成十六进制数并输出。出。lFibonacci数列的定义为:数列前两个数都是数列的定义为:数列前两个数都是1,从第,从第3个数开始,每个数都是前面两个数的和,即:个数开始,每个数都是前面两个数的和,即:nn 1n 21 n1 n2FFF n2或

侵权处理QQ:3464097650--上传资料QQ:3464097650

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


163文库-Www.163Wenku.Com |网站地图|