![[工学]第五讲 函数.ppt_第1页](http://file.renrendoc.com/FileRoot1/2018-12/23/978fc58a-999a-4217-8386-b5f507a5c7e0/978fc58a-999a-4217-8386-b5f507a5c7e01.gif)
![[工学]第五讲 函数.ppt_第2页](http://file.renrendoc.com/FileRoot1/2018-12/23/978fc58a-999a-4217-8386-b5f507a5c7e0/978fc58a-999a-4217-8386-b5f507a5c7e02.gif)
![[工学]第五讲 函数.ppt_第3页](http://file.renrendoc.com/FileRoot1/2018-12/23/978fc58a-999a-4217-8386-b5f507a5c7e0/978fc58a-999a-4217-8386-b5f507a5c7e03.gif)
![[工学]第五讲 函数.ppt_第4页](http://file.renrendoc.com/FileRoot1/2018-12/23/978fc58a-999a-4217-8386-b5f507a5c7e0/978fc58a-999a-4217-8386-b5f507a5c7e04.gif)
![[工学]第五讲 函数.ppt_第5页](http://file.renrendoc.com/FileRoot1/2018-12/23/978fc58a-999a-4217-8386-b5f507a5c7e0/978fc58a-999a-4217-8386-b5f507a5c7e05.gif)
已阅读5页,还剩47页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
,第四章 函数, 概述 函数的定义和调用 函数之间值的传递 函数的嵌套调用 函数的递归调用 变量的存储类别和作用域,void printstar() *printstar函数* printf(* * * * * * * * * * * * * * * * * *n); void print-message() * print-message函数* printf(“How do you do!n“); main() printstar();* 调用printstar函数 * print-message();* 调用print message */ printstar(); * 调用printstar函数 * 函数执行的过程,从用户使用的角度看,函数有两种: 标准函数,即库函数。这是由系统提供的,用户不必自己定义这些函数,可以直接使用它们。 用户自己编写的函数。用以解决用户的专门需要。,在一个函数中调用另一个函数时,程序将控制从调用函数处转移到被调用函数,并且执行被调用函数。 在执行完被调用函数的所有语句或者遇到return语句时,程序的控制要返回到调用函数中原来调用函数的地方继续执行。,main函数 调用函数 A; ,函数 A ,调用,返回,4.2.2 函数调用函数调用的过程,.概述,结构化程序设计思想: 自顶向下分析问题 模块化程序设计,C程序的基本构件是函数.一个函数完成一个特定功能,整个程序的功能靠一系列的函数调用来实现. 必须有且只能有一个名为main的主函数,程序从main函数开始执行,最后又回到main函数结束。 main函数调用其他函数,其他函数也可以相互调用 C程序的执行顺序与函数出现的顺序无关, 只与函数的调用顺序有关.,一、 和main()函数放在同一个程序中,函数的存放形式:,.1 函数的定义 数据类型 函数名(形式参数表列) 函数体 1.数据类型是说明函数中return语句返回的值的类型,我们称这个数据类型为该函数的类型,可省略。省略为int,无返回值为void型 2.函数名是标识符,不可省略 3.形式参数表中给出所有形参的名称和类型,它的格式为: 类型1 形参1,类型2 形参2,类型n,形参n 4. 括起来的部分是函数体。 不可省略,2不返回运算结果的函数定义,void 函数名(参数表) /* 函数首部 */ /* 函数体 */ 函数实现过程 return; /* 可以省略return */ ,这类函数通常用于屏幕输出等,表示不返回结果,不能省略 否则 函数类型被默认定义为int,void printstar() *printstar函数* printf(* * * * * * * * * * * * * * * * * *n); void print-message() * print-message函数* printf(“How do you do!n“); ,1返回运算结果的函数定义,函数类型 函数名(形参表) /* 函数首部 */ /* 函数体 */ 函数实现过程 return 表达式; ,把函数运算的结果回送给主函数,只能返回一个值,函数返回值的类型,没有分号,double cylinder (double r, double h) double result; result = 3.1415926 * r * r * h; return result; ,形参,类型1 参数1 ,类型2 参数2 ,类型n 参数n 参数之间用逗号分隔,每个参数前面的类型都必须分别写明,函数类型 函数名(形参表) 函数实现过程 return 表达式; ,不能写成 double r, h,double cylinder (double r, double h) double result; result =3.1415926 * r * r * h; return result; ,double cylinder (double r, double h) /* 函数首部 */ /* 函数体,写在一对大括号内 */ double result; result =3.1415926 * r * r * h; /* 计算圆柱体积 */ return result; /* 返回运算结果*/ ,分析函数的定义,函数类型,函数名,形参表,与函数类型一致,/* 计算圆柱体积 */ #include double cylinder (double r, double h) double result; result = 3.1415926 * r * r * h; return result; int main( void ) double height, radius, volume; scanf (“%lf%lf“, ,常量、变量、表达式,函数名(实参表),使用返回值: volume = cylinder (radius, height ); printf(“%f n” , cylinder (radius, height );,常用于返回结果的函数的调用,2参数传递,函数定义时的参数被称为形式参数(简称形参) double cylinder (double r, double h) 函数调用时的参数被称为实际参数(简称实参) volume = cylinder (radius, height); 实参形参 在参数传递过程中,实参把值复制给形参。 形参和实参一一对应:数量一致,类型一致,顺序一致 形参:变量,用于接受实参传递过来的值 实参:常量、变量或表达式,单向传递,/* 计算圆柱体积 */ #include double cylinder (double r, double h) double result; result = 3.1415926 * r * r * h; return result; int main( void ) double height, radius, volume; scanf (“%lf%lf“, ,3函数结果返回,无返回值:完成指定工作,没有确定的运算结果需返回给主调函数(函数类型void)。 有返回值:完成确定的运算,有一个运算结果返回给主调函数。 函数结果返回的形式: return 表达式; return (表达式);,/* 计算圆柱体积 */ #include double cylinder (double r, double h) double result; result = 3.1415926 * r * r * h; return result; int main( void ) double height, radius, volume; scanf (“%lf%lf“, ,double cylinder (double r, double h) /* 函数首部 */ /* 函数体,写在一对大括号内 */ double result; result =3.1415926 * r * r * h; /* 计算圆柱体积 */ return result; /* 返回运算结果*/ ,分析函数的定义,函数类型,函数名,形参表,与函数类型一致, 在被定义的函数中,必须指定形参的类型,可在形参表列中说明,也可在形参说明部分说明。,r, h,double r, double h;,1.从键盘输入一个正整数n,计算n!的值。要求定义和调用函数fact(m),计算n!,用户自定义函数的函数原型声明: 函数类型 函数名(参数类型1 参数名1,参数类型2 参数名2,参数类型n 参数名n); 函数类型 函数名(参数类型1,参数类型2,参数类型n);,4.2.2 函数调用申明(说明),“说明”,告诉编译系统函数类型、参数个数及类型,以便检验 函数说明与函数定义的首部唯一区别:函数说明语句的( )之后必须有分号,而函数定义头部的( )之后没有分号。,用户自定义函数:若被调函数在主调函数之后定义(在同一个文件中),需在调用子函数前对被调函数类型加以说明,称函数原型声明。,、函数申明位置:程序的数据申明部分 (主调函数内或外(全局申明) 下列情况下,可不作函数说明 被调用函数定义出现在主调函数之前,4.2.2 函数调用申明(说明),例 函数的申明 int test(int, int); int test(int a, int b); main() int i, j,k; k=test(i,j); int test (int a, int b) ,int test(int ,int);,例 函数的申明 int test (int a, int b) main() int i, j,k; k=test(i,j); ,常用数学库函数,平方根函数 sqrt(x) 绝对值函数 fabs(x) fabs(-3.56) 的值为3.56 幂函数 pow(x, n) :xn pow(1.1, 2) 的值为1.21(即1.12) 指数函数 exp(x):ex exp(2.3) 的值为e2.3 以e为底的对数函数 log(x):ln x log(123.45) 的值为4.815836 以10为底的对数函数 log10(x):log10x log10(123.45) 的值为2.091491。,局部变量-内部变量 定义:在函数内定义,只在本函数内有效 说明: main中定义的变量只在main中有效 不同函数中同名变量,占不同内存单元 形参属于局部变量 复合语句中可定义仅复合语句中有效的局部变量。,4.3.2变量的作用范围 局部变量与全局变量,外部变量 定义:在函数外定义,可为本文件其他函数共用,函数之间可通过外部变量传递数据。 具有永久的存储空间;由编译器进行初始化。外部变量如果没有明确的初值,则初值为0; 有效范围:从定义变量的位置开始到本源文件结束,及有extern说明的其它源文件,全局变量-外部变量,外部变量说明: extern 数据类型 变量表;,4.3.2变量的作用范围 局部变量与全局变量,extern char c1,c2;,extern char c1,c2;,例子解析,外部变量 定义:在函数外定义,可为本文件其他函数共用 有效范围:从定义变量的位置开始到本源文件结束,及有extern说明的其它源文件,多个文件中的外部变量说明,方法:在一个文件中定义外部变量,在另一个文件中用extern 对它进行申明,外部变量定义,运行结果:max=8 *,若外部变量与局部变量同名,则外部变量被屏蔽,应尽量少使用全局变量,因为: 全局变量在程序全部执行过程中占用存储单元 过多全局变量会导致各函数间出现相互干扰,变量存储类型有四种: 自动变量(auto) 静态变量(static) 外部变量(extern) 寄存器变量(register) auto、static、extern和register为存储类型说明符。 变量说明的一般形式: 存储类型说明符 类型说明符 变量名称; auto int n; static char m; register int n;,4.3.1 变量的存储类别,自动变量(auto): 普通的局部变量 int x, y; auto int x, y; char c1; auto char c1; 函数调用时,定义变量,分配存储单元。 函数调用结束,收回存储单元。,寄存器变量,说明寄存器说明符只能用于说明函数中的内部变量,寄存器变量存储在CPU的通用寄存器中。 寄存器变量是使用中央处理器(CPU)的通用寄存器。 计算机从寄存器中存取数据的速度要远远快于从内存中存取数据,所以当变量使用非常频繁时,将变量定义为寄存器变量可以提高程序运行速度。 寄存器是与机器硬件密切相关的,不同的计算机,寄存器的数目不一样,通常为2到3个。,静态变量的说明是在变量说明前加static,具有永久的存储空间;由编译器进行初始化。如果没有明确的初值,则初值为0 。 静态变量有两种:外部静态变量,内部静态变量。 外部静态变量仅仅在定义它的一个文件中有效。 内部静态变量作用于定义它的当前函数。虽然在函数调用后依旧存在,但其他函数不能引用它;由于它具有永久的存储空间,所以可以保持值的连续性,4.3.1 变量的存储类别:静态变量,存储方式 静态存储:程序运行期间分配固定存储空间 动态存储:程序运行期间根据需要动态分配存储空间 内存用户区,生存期 静态存储:从程序开始执行到程序结束 动态存储:从包含该变量定义的函数开始至函数执行结束,4.3.1 变量的存储类别:动态变量与静态变量,#include main ( ) void inc1( ), inc2( ); inc1( ); inc1( ); inc1( ); inc2( ); inc2( ); inc2( ); void inc1( ) int x = 0; /* 说明自动变量x并赋初值 */ x+; printf (“in inc1 x=%dn“, x); void inc2( ) static int x; /* 说明内部静态变量*/ x+; printf (“in inc2 x=%dn“, x); ,静态变量,内部静态变量 1)在编译的时候赋初值,只赋一次,在程序运行时已经有初值; 2)如果定义变量时不给初值,则系统自动给一个初值:0(数值型),空字符(字符型) 3)虽然在函数调用后依旧存在,但其他函数不能引用它;,#include int i=1; main() static int a; register int b=-10; int c=0; printf(“-MAIN-n“); printf(“i:%d a:%d b:%d c:%dn“,i,a,b,c); c=c+8; other(); printf(“-MAIN-n“); printf(“i:%d a:%d b:%d c:%dn“,i,a,b,c); i=i+10; other(); ,other() static int a=2; static int b; int c=10; a=a+2; i=i+32; c=c+5; printf(“-OTHER-n“); printf(“i:%d a:%d b:%d c:%dn“,i,a,b,c); b=a; ,-Main- i:1 a:0 b:-10 c:0,-Other- i:33 a:4 b:0 c:15,-Main- i:33 a:0 b:-10 c:8,-Other- i:75 a:6 b:4 c:15,8,4,33,15,4,43,6,75,15,6,例 变量的寿命与可见性,局部变量默认为auto型 register型变量个数受限,且不能为long, double, float型 局部static变量具有全局寿命和局部可见性 局部static变量具有可继承性 extern不是变量定义,可扩展外部变量作用域 (已学),变量存储类型,下课了。,休息一会儿。,追 求,4.5 函数的嵌套调用 在调用一个函数的同时,这个被调函数又调用了另外的函数,这样的调用结构称为函数的嵌套调用.,main( ),调 f2( ),a( ),b( ),return 或 ,调b,调a,main() a(); a() b(); ,结束,void a(); void b(); void main() printf(“enter into function main()n”); a(); printf(“exit function main()n”); void a() printf(“enter into function a()n”); b(); printf(“exit function a()n”); void b() printf(“enter into function b()n”); printf(“exit function b()n”); ,例子:计算 4!+5!+6!+7! main( )中调p( )计算4个阶乘的和, p( )中调用f( )计算阶乘.,4.6 函数的递归调用 一、 何为递归 在调用一个函数过程中又出现该函数自己调用自己。(直接、间接),int f(int x) int y,z; z=f(y); . return(2*z); ,4.6 函数的递归调用 二、 递归程序设计 例1 求岁数:有5个人坐在一起,问第5个人几岁?他说比第4个大2岁。问第4个多少岁,比第3个大2岁,依次类推,第一个说10岁,求第5个人多大?,递推公式: age(n) = age(n-1) + 2 (n1) age(1) = 10;,age( int n) int c; if(n= =1) c=10; else c=age(n-1)+2; return(c); main() printf(“%d”,age(5); ,源代码: (函数格式注意!),c=age(4)+2,age函数 n = 5,age (5) = 18,c=age(3)+2,age函数 n = 4,age (4) = 16,c=10,age函数 n = 1,age (1) = 10,递推公式: age(n) = age(n-1) + 2 (n1) age(1) = 10;,c=age(2)+2,age函数 n = 3,age (3) = 14,c=age(1)+2,age函数 n = 2,age (2) = 12,源代码: age( int n) int c; if(n= =1) c=10; else c=age(n-1)+2; return(c); main() printf(“%d”,age(5); ,#include facto (int n) int s; if ( n = 1 ) s = 1; else s = n * facto(n-1); return (s); void main() int i ; scanf(”%d” , ,说明: 递归包括 “递推”和“回归” 需有结束递归过程的条件,4 * facto(3),3 * facto(2),2* facto(1),1,2*1,(3* 2*1),(4* 3* 2*1),输出 (4* 3* 2*1),递推,回归,计算 facto(4),递归程序的执行过程,facto ( n ) int n; int s; if ( n = 1 ) s = 1; else s = n * facto(n-1); return (s); ,facto ( int n ) int s; if ( n = 1 ) s = 1; else s = facto (n-1); s = n*s; return (s); ,等价于,当 n = 1 时 n! = 1 当 n 1 时 n! = n * (n-1)!,递归程序的执行过程,facto(int n) int s; if(n= =1) s = 1; else s=facto(n-1); s=n*s; return(s); ,facto(int n),int s;,if(n= =1),facto(int n) int s; if(n= =1) s = 1; else s=facto(n-1); s=n*s; return(s); ,s=facto(n-1),facto(int n),int s;,if(n= =1),facto(int n) int s; if(n= =1) s = 1; else s=facto(n-1); s=n*s; return(s); ,s=facto(n-1),facto(int n) int s; if(n= =1) s = 1; else s=facto(n-1); s=n*s; return(s); ,facto(int n),facto(int n),int s;,int s;,if(n= =1),if(n= =1),s=facto(n-1),s = 1,return(1),s=n*s=2*1,return(2),return(6),s=n*s=3*2,s=n*s=4*6,return(24),1,调 用,2,3,4,调 用,调 用,3,2,1,返回,返回,返回,N=4,N=3,N=2,N=1,递归的基础 变量存储类型(自动变量)的特点,保证了在每层递归调用的过程中,变量可以保持相对于各个层次的独立性,不会发生相互干扰。 不准确地说:递归过程实际上一个隐含着循环的过程。 对递归的认识 所有的递归问题一定可以用非递归算法实现。 编写递归程序的关键 建立递推公式 递归结束条件 是保证递归可以正常结束的前提,递归-讨论,编写数值型递归程序,求菲波那奇序列:1,1,2,3,5,8,13,21, 建立问题的递归定义: f(n)=1 当 n=1或n=2 时 f(n)=f(n-1)+f(n-2) 当 n2 时 程序: f ( n ) int n; if (n=1|n=2) return (1); /* 结束条件 */ else return ( f(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农业水土保持机理课件
- 剥脱性骨软骨炎课件
- Beherbergungsgewerbe in München-外文版培训课件(2025.9)
- 别碰开水课件
- 农业安全业务培训课件
- 农业农机安全生产培训课件
- 初始安全员培训课件
- 内训师课件题材
- 先正达安全培训成绩课件
- 23《生于忧患死于安乐》(公开课一等奖创新教学设计)统编版语文八年级上册
- 无人机培训课件
- 2025辽宁沈阳副食集团所属企业招聘3人考试参考题库及答案解析
- 储罐区的安全题库及答案解析
- 交大入党测试题及答案
- 培训如何开早会的课件
- 2025年河北沧州市中心医院、沧州博施康养集团公开招聘辅助岗工作人员113名考试参考试题及答案解析
- 消防员抗洪抢险知识培训课件
- 精选幼儿园体能大循环方案
- 全国中学生物理竞赛复赛实验考查
- 例谈小组合作学习在小学英语教学中的有效开展(讲座)课件
- 部编版五年级道德与法治上册第3课《主动拒绝烟酒与毒品》优秀课件【最新】
评论
0/150
提交评论