(本科)第7章 函数1ppt课件.pptx

上传人:春哥&#****71; 文档编号:15609254 上传时间:2022-05-13 格式:PPTX 页数:52 大小:1.32MB
返回 下载 相关 举报
(本科)第7章 函数1ppt课件.pptx_第1页
第1页 / 共52页
(本科)第7章 函数1ppt课件.pptx_第2页
第2页 / 共52页
点击查看更多>>
资源描述

《(本科)第7章 函数1ppt课件.pptx》由会员分享,可在线阅读,更多相关《(本科)第7章 函数1ppt课件.pptx(52页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、课程主讲人:第7章 函数1C语言程序设计3C语言程序设计(第二版)4第 7章 函数1介绍函数定义、函数参数和返回值、一般调用、嵌套调用、递归调用、变量作用域与存储类别及内部与外部函数。前面大都只有一个主函数main(),但实用程序往往由多个函数组成。通过对函数模块调用实现特定功能。函数相当其他高级语言的子程序。2提供丰富库函数,可建立自己定义的函数。可把各算法编成相对独立的函数,用调用的方法使用。可说程序是由各种函数完成的,所以也称为函数式语言。 5第 7章 函数知识点:函数定义、函数的参数和返回值一般调用、嵌套调用、递归调用变量作用域与存储类别。内部函数与外部函数。技能点:能熟练掌握Dev-

2、C+集成环境的操作步骤。6第 7章 函数7.1 案 例 引 入【例7-1】写一个判别素数的函数,在主函数输入一个整数,输出其是否为素数的信息。任务分析:素数是除了1和它本身之外不能被其他数整除的正整数。求素数的方法有很多种,最简单的方法是根据素数的定义来求。对于一个自然数N,用大于1小于N的各个自然数都去除一下N,如果都除不尽,则N为素数,否则N为合数。程序代码如下:7第 7章 函数1234567891011121314151617181920212223/*例7-1 写一个判别素数的函数,在主函数输入一个整数,输出其是否为素数的信息*/#includestdio.h int sushu(in

3、t);main() int a; printf(输入一个整数:); scanf(%d,&a); if(sushu(a)=1) printf(是素数); else printf(不是素数); int sushu(int x) int i; for(i=2;ix;i+) if(x%i=0) /能整除,返回0 return 0; return 1; 程序分析:若一直到x-1都不能整除,此时i再自增1到x,不满足i b) return a; else return b;第一行声明max()函数是一个整型函数,其返回的函数值是一个整数。形参为a、b,均为整型量。a、b的具体值是由主调函数在调用时传送过来

4、的。在 中的函数体内,除形参外没有使用其他变量,因此只有语句而没有声明部分。在max()函数体中的return语句是把a(或b)的值作为函数的值返回给主调函数。有返回值函数中至少应有一个 return 语句。19第 7章 函数在程序中,一个函数的定义可以放在任意位置,既可放在主函数main()之前,也可放在main()之后。例如:可把max()函数置在main()之后,也可以把它放在main()之前。修改后的程序如例7-2所示。20第 7章 函数【例7-2】求两个数中的大数。123456789101112131415161718/*例7-2 求两个数中的大数*/#includestdio.h

5、int max(int a,int b) if(ab) return a; else return b;main() int max(int a,int b); int x,y,z; printf(请输入两个数,以空格隔开:n); scanf(%d%d,&x,&y); z=max(x,y); printf(两数中最大的数是:%d,z);21第 7章 函数3程序分析现在可以从函数定义、函数说明及函数调用的角度来分析整个程序,从中进一步了解函数的各种特点。程序的第 3 行至第 9 行为 max() 函数定义。进入主函数后,因为准备调用 max() 函数,故先对 max() 函数进行声明(程序第 1

6、2 行)。函数定义和函数声明并不是一回事,在后面还要专门讨论。 可以看出函数声明与函数定义中的函数头部分相同,但是末尾要加分号。程序第 12 行为调用 max() 函数,并把 x、y 中的值传送给 max() 的形参 a、b。max() 函数执行的结果(a或b)将返回给变量 z。最后由主函数输出 z 的值。22第 7章 函数7.4 函数的参数和返回值1形式参数和实际参数形式参数是在定义函数时函数名后面括号内所定义的变量,简称形参。实际参数是在调用函数时,函数名后面括号内中的参数,简称实参。对形参与实参的理解,要求有以下正确认识:23第 7章 函数(1)在定义函数中指定的形参,在未出现函数调用时

7、,它们并不占内存中的单元。只有在发生函数调用时,函数的形参才被分配内存单元。在调用结束后,形参所占的内存单元也被释放。(2)实参可以是常量、变量或表达式,但要求它们有确定的值。在调用时将实参的值赋给相应的形参。24第 7章 函数(3)实参与其结合的形参类型要求相同或赋值兼容。(4)实参与形参结合时,其数据传递的途径只有一种,即将实参的值单方向赋给与其结合的形参变量,也就是“值传递的方式”。25第 7章 函数【例7-3】求ni的值函数实参、形参举例。123456789101112131415161718/*例7-3 求ni的值函数实参、形参举例。*/#includestdio.h int s(i

8、nt n) /形参(定义在主函数外)int i;for(i = n - 1;i = 1;i-)n = n + i;printf(形参n = %dn,n);int main(void)int n; /实参(定义在主函数中)printf(input numbern);scanf(%d,&n);s(n);printf(实参n = %dn,n);return 0;26第 7章 函数函数中止执行返回到调用该函数的程序时,可能有两种情况:一是函数的最后一条语句执行完毕;另一种情况就是遇到return语句。return 语句有3种可能的用法:return ; /终止函数的执行return x; /终止函数的

9、运行并返回x的值return (x); /终止函数的运行并返回x的值。要注意,return只是一个关键字,而不是函数除函数类型为void之外的函数都要有返回值。2函数的返回值27第 7章 函数在写程序的时候用到函数的有3种类型:第一种只是简单的计算类型。这种函数被专门设计成对函数的参数执行一定的操作,并将计算的结果返回。例如,库函数sqrt()和sin()。第二种类型的函数是对信息进行处理,并返回一个表示信息处理成功还是失败的值。例如,库函数fwrite()用来将信息写入到文件磁盘文件中。如果写入成功,返回写入成功的信息条数;如果写入失败,返回要求与写入信息条数不等的数值。28第 7章 函数第

10、三种函数没有返回值。这类函数是过程化,不会产生需要返回的值。例如,系统函数printf(),它用来输出一些信息,虽然这种函数有时也返回了值,而这个值并不是非返回不可的有用值。如果函数在return()语句中返回的值的类型与函数类型不一致,会进行强制类型转换成函数类型的值。29第 7章 函数7.5 函数的调用1函数调用的形式函数名(实参表列)函数调用可以有实参,也可以没有实参。如果实参列表中包含多个参数,则各参数用逗号进行分隔。实参与形参的个数相等,类型一致或赋值兼容。实参与形参按顺序对应,一一传递数据。30第 7章 函数如果实参表列包括多个参数,对实参的求值顺序与编译系统有关,有些按自左至右的

11、顺序求值,有些则按自右至左的顺序求值。大多数版本是按自右至左的顺序求值。31第 7章 函数2函数调用的使用方式(1)函数语句。把函数调用作为语句,即函数名(实参表列);。(2)函数表达式。函数调用出现在表达式中,作为表达式中的操作数。此种调用方式,要求函数的类型不能为void类型。(3)函数参数。函数调用作为函数的实参,此种调用方式,要求函数的类型不能为void类型。32第 7章 函数3函数的声明和函数的原型一个函数被调用应具备两个必要条件:函数的存在性(若非库函数,则要求提供函数的定义)及在主调函数中对被调用函数的原型声明。33第 7章 函数函数的原型声明,实质上是向编译器提供了函数的接口信

12、息,为检查函数调用的正确性提供依据。函数原型声明的形式如下:函数类型符 函数名(参数类型1,参数类型2,);函数类型符 函数名(参数类型1 参数名1,参数类型2 参数名2,);34第 7章 函数在主调函数中对被调函数的原型声明,在下述情况下可以缺省:(1)被调函数的定义出现在主调函数之前。(2)被调函数的类型为int型,这时函数形参类型的检查以第一次调用的实参类型为准。(3)在主调函数的定义之前,在函数的外部已对被调函数做了原型声明。35第 7章 函数4函数调用与返回流程 在一个函数中调用另一个函数时,程序控制即转入到被调用的函数中,在函数代码执行完成后,返回到主函数中的调用处继续执行主函数中

13、的后续代码。例如,以下的程序:#include stdio.h#include conio.hint sub(int x)int z;.return z;int main(void).y = sub(x);.getch();return 0;36第 7章 函数当主函数执行到y = sub(x)时,将变量x的值作为参数传递到函数sub的形式参数x中,程序控制转入到sub函数中;执行函数sub中的代码,遇到return z时,将变量z的值作为函数的结果值返回,程序控制转回到主函数main()中继续执行其后的代码。函数调用与返回流程如图7-4所示。图7-4 函数调用与返回流程37第 7章 函数7.6

14、 函数的嵌套调用在调用一个函数的过程中,又发生对另一个函数的调用,就为嵌套调用。在嵌套调用中,要关注执行时,其返回的层次关系。在7.5节例中如果在函数sub()中又调用了其他的函数如fun(),则形成了函数的嵌套调用。函数调用是逐级调用、逐级返回的。即从函数fun()中只能返回到函数sub()中,而不能直接返回到函数main()中。函数嵌套调用与返回流程如图7-5所示。38第 7章 函数图7-5 函数嵌套调用与返回流程39第 7章 函数12345678910111213141516171819202122232425/*例7-4 用函数嵌套调用的形式求:1! + 2! + + n!*/#inc

15、ludestdio.h double fun(int n)double p = 1.0;for(;n = 2;n-)p *= n;return p; double fsum(int n) double sum; int i; for(i = 1,sum = 0;i 2时有:F(n) = F(n 1) + F(n 2)。在这种类型的问题中,每个数据项都和它前面的若干个数据项(或后面的若干个数据项)有一定的关联,这种关联一般是通过一个递推关系式来表示的。45第 7章 函数2典型的递归算例求解问题时我们就从初始的一个或若干数据项出发,通过递推关系式逐步推进,从而得到最终结果。这种求解问题的方法叫“递

16、推法”。其中,初始的若干数据项称为“边界”。 解决递推类型问题有三个重点:一是如何建立正确的递推关系式,二是递推关系有何性质,三是递推关系式如何求解。其中第一点是基础,也最重要。46第 7章 函数2典型的递归算例2)递归思想递归是从问题的目标状态出发,通过自身的递归关系,层层递进,不断把问题的规模缩小,最终达到问题的边界条件(已知的初始状态)的解题方法。也就是想要求fib(n)就要先求fib(n - 1)和fib(n - 2),而想要求fib(n - 1)就要先求fib(n - 2)和fib(n - 3)想要求fib(3)就要先求fib(2)和fib(1),而fib(2)和fib(1)是已知的

17、。47第 7章 函数2典型的递归算例递归的优点是程序结构清晰,不仅可以用来计数,还可以用来枚举(如汉诺塔问题)。但通过直接的递归过程和函数实现起来,有时效率很差(请大家试试直接用递归函数去求fib(1000)要花多少时间)。所以,递归更多的是一种思想、一种分析问题的手法,有时需要做很多优化和改进工作,甚至还是要转化为递推、动态规划方法去做。48第 7章 函数2典型的递归算例递归算法一般适用在三个场合:(1)数据的定义形式是递归的,如求Fibonacci数列问题。(2)数据之间的逻辑关系(即数据结构)是递归的,如树、图等的定义和操作。(3)某些问题虽然没有明显的递归关系或结构,但问题的解法是不断

18、重复执行一种操作,只是问题规模由大化小,直至某个原操作(基本操作)就结束,如汉诺塔问题,这种问题使用递归思想来求解比其他方法更简单。49第 7章 函数【算例1】Fibonacci数列的递归算法。long fib(int n) if(n=1|n=2) return 1; else return fib(n-1)+fib(n-2);说明:此函数的功能返回Fibonacci数列的第n项。【算例2】阶乘的递归算法。long fun(int n) if(n=1) return 1; else return n*fun(n-1);50第 7章 函数【算例3】两整数最大公约数的递归算法。unsigned g

19、cd(unsigned m,unsigned n) if(m%n=0) return n; else return gcd(n,m%n);【算例4】将一个长整数从右向左按位输出的递归算法。void fun(long num) printf(%d,num%10); if(num/10!=0) fun(num/10);51第 7章 函数3函数递归调用与返回流程例如:使用函数递归调用计算n!。阶乘计算的递推公式为:0!=1,1!=1n!=n(n-1)!#include stdio.h#include conio.hint fun(int n) int f; if(n = 1 | n = 0)f = 1; elsef = n * fun(n - 1); return f;int main(void) int x,p; scanf(%d,&x); p = fun(x); printf(%d,p); getch(); return 0;例如当输入x = 3时,函数递归调用与返回的情形如图7-7所示。52第 7章 函数注意:在每一次调用函数fun()时,变量n的值都是不同的。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁