




已阅读5页,还剩41页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2019/4/30,计算机与信息工程分院,第7讲 函数(1) -函数的定义和调用,主讲教师:刘莉 E_mail: Phone: 88890692,计算机与信息工程分院 C语言程序设计,2,主要内容,作业,计算机与信息工程分院 C语言程序设计,3,1.函数及函数定义的一般形式(1),1.1函数概述,一个C程序可由一个主函数和若干个函数构成。由主函数调用其他函数,其他函数也可以互相调用。同一个函数可以被一个或多个函数调用任意多次。,示意图,例7-1,说明,返回主菜单,计算机与信息工程分院 C语言程序设计,4,说明(1),(1)一个源文件由一个或多个函数组成。一个源程序文件是一个编译单位,即以源程序为单位进行编译,而不是以函数为单位进行编译。 (2)一个C程序由一个或多个源程序文件组成。对较大的程序 ,一般不希望全放在一个文件中,而将函数和其他内容(如预定义)分别放在若干个源文件中,再由若干源文件组成一个C程序。这样可以分别编写、分别编译,提高调试效率。一个源程序可以为多个C程序公用。 (3)C程序的执行从main函数开始,调用其他函数后流程返回到main函数,在main 函数中结束整个程序的运行。main函数是系统定义的。,计算机与信息工程分院 C语言程序设计,5,说明(2),(4)所有函数都是平行的,即在定义函数时是相互独立的,一个函数并不从属于另一函数,即函数不能嵌套定义(这是和PASCAL不同的)。函数间可以互相调用,但不能调用main函数。 (5)从用户使用的角度看,函数有两种: 标准函数,即库函数。 用户自己定义的函数。 (6)从函数的形式看,函数分两类: 无参函数。在调用无参函数时,主调函数并将数据传送给被调用函数,一般用来执行指定的一组操作。无参函数可以带回或不带回函数值,但一般以不带回函数值得居多。 有参函数。在调用函数时,在主调函数和被调函数之间有数据传递。也就是说,主调函数可以将数据传给被调用函数使用,被调用函数中的数据也可以带回来供主调函数使用。,系统自己定义的,如例8.1的printstar和print_message,计算机与信息工程分院 C语言程序设计,6,示意图,计算机与信息工程分院 C语言程序设计,7,例7.1简单的函数调用,main() printstar(); print_message(); printstar(); printstar(); printf( “ * * * * n”); printf_message(); printf(“ How do you do! n”); ,调用printstar函数,调用print_message函数,调用printstar函数,调用printstar函数,调用print_message函数,程序运行后,结果显示: * * * * * * * * * * * * * * * * * How do you do! * * * * * * * * * * * * * * * * *,计算机与信息工程分院 C语言程序设计,8,1.函数及函数定义的一般形式(2),1.2函数定义的一般形式(1),无参函数的定义形式 有参函数定义的一般形式,类型标识符 函数名() 声明部分 语句 ,计算机与信息工程分院 C语言程序设计,9,1.函数及函数定义的一般形式(3),1.2函数定义的一般形式(2),可以有”空函数” 对形参声明的传统方式,计算机与信息工程分院 C语言程序设计,10,2.函数参数和函数的值,形式参数和实际参数 在定义函数时函数名后面括弧中的变量名称为“形式参数”(简称“形参”),在主调函数中调用一个函数时,函数名后面括弧中的参数(可以是一个表达式)称为”实际参数”。,函数的返回值 通过函数调用使主调函数能得到一个确定的值,这就是函数的返回值。,例7-2,说明,例7-3,说明,返回主菜单,计算机与信息工程分院 C语言程序设计,11,例7-2调用函数时的数据传递,main() int a,b,c; scanf(“%d,%d”, ,输入: 7,8,结果: Max is 8,计算机与信息工程分院 C语言程序设计,12,关于形参和实参的说明(1),(1)在定义函数中指定的形参,在未出现函数调用时,它们并不占内存中的存储单元。只有在发生函数调用时,函数max中的形参才被分配内存单元。在调用结束后,形参所占的内存单元也被释放。 (2)实参可以是常量、变量或表达式。在调用时将实参的值赋给形参。 (3)在被定义的函数中,必须指定形参的类型。 (4)实参与形参的类型应相同或赋值兼容。 (5)C语言规定,实参变量对形参变量的数据传递是“值传递”,即单向传递,只由实参传给形参,而不能由形参传回来给实参。在内存中,实参单元与形参单元是不同的单元。,如:max(3,a+b),计算机与信息工程分院 C语言程序设计,13,关于形参和实参的说明(2),计算机与信息工程分院 C语言程序设计,14,返回值的说明(1),函数的值只能通过return语句返回主调函数。,如函数值的类型和return语句中表达式的值不一致,以函数类型为准。,函数值的类型和函数定义中函数的类型应保持一致。,如: int max(float x, float y) (函数值为整形) char letter(char c1,char c2) (函数值为字符型),例7-3,计算机与信息工程分院 C语言程序设计,15,返回值的说明(2),如果被调用函数中没有return语句,并不带回一个确定的、用户所希望得到的函数值,但实际上,函数并不时不带回值,而只是不带回有用的值,带回的是一个不确定的值。 为了明确表示“不带回值”,可以用“void”定义“无类型”(或称“空类型”)。,例如: Void printstar() 下面的用法是错误的 a=printstar();,计算机与信息工程分院 C语言程序设计,16,例7-3 返回值类型与函数类型不同,main() float a,b; int c; scanf(“%f,%f”, ,运行情况如下: 1.5,2.5 Max is 2,计算机与信息工程分院 C语言程序设计,17,3.函数的调用(1),函数调用的一般形式,函数调用的方式 函数语句 函数表达式 函数参数,如:printstar();,如:c=2*max(a,b);,如:m=max(a,max(b,c);,例7-4,例7-5,计算机与信息工程分院 C语言程序设计,18,3.函数的调用(2),对被调用函数的声明和函数原型 1)函数调用的条件 2)函数原型,A.函数类型 函数名(参数类型1 ,参数类型2); B.函数类型 函数名(参数类型1 参数名1,参数类型2 参数名2 );,如:float add(float,float),返回主菜单,计算机与信息工程分院 C语言程序设计,19,4.函数的嵌套调用,1)C语言的函数定义都是相互平行、独立的,也就是说在定义函数时,一个函数内部不能包含另一个函数。 2)C语言不能嵌套定义,但可以嵌套调用函数。,图形说明,例 7-6,返回主菜单,计算机与信息工程分院 C语言程序设计,20,图形说明,b函数开始,main函数开始,调用a函数,a函数开始,调用b函数,b函数结束,a函数结束,main函数结束,计算机与信息工程分院 C语言程序设计,21,例 7-6用弦截法求方程f(x)=x3 x2 +16x 80=0根,方法如下: (1)取两个不同点x1、x2,如果 f(x1)和f(x2)符号相反,则(x1,x2)区间内必有一个根。如果f(x1)与f(x2)同符号,则应改变x1、x2,直到f(x1)与f(x2)异号为止。 (2)连接(x1,f(x1))和(x2,f(x2)两点,如图。,x点的坐标可用下式求出: x=x1 f(x2) x2 f(x1) / f(x2) - f(x1) 再从x求出f(x),计算机与信息工程分院 C语言程序设计,22,(3)若f(x)与f(x1)同符号,则根必在(x,x2)区间内,此时将x作为新的x1。如果f(x)与f(x2)同符号,则根必在(x1,x)区间内,将x作为新的x2。 (4)重复步骤(2)和(3),直到f(x) 为止,为一个很小的数,例如10-6。此时认为f(x) 0。,N-S流程图,例 7-6用弦截法求方程f(x)=x3 x2 +16x 80=0根,计算机与信息工程分院 C语言程序设计,23,输入x1,x2,求f(x1),f(x2),直到f(x1)和f(x2)异号,求(x1,f(x1)与(x2,f(x2))连线与x轴的交点x,y=f(x)与y1=f(x2),y 与y1同号,真,假,x1=x y1=y,x2=x y2=y,直到y,输出x的值,计算机与信息工程分院 C语言程序设计,24,例 7-6用弦截法求方程f(x)=x3 x2 +16x 80=0根,#include float f(float x) /*定义f函数,以实现f(x)=x3-5x2+16x-80=0*/ float y; y=(x-5.0)*x+16.0)*x-80.0; return(y); float xpoint(float x1,float x2) /*定义xpoint函数,求出弦与x轴交点*/ float x; x=(x1*f(x2)-x2*(fx1)/(f(x2)-f(x1); return(x); ,计算机与信息工程分院 C语言程序设计,25,例 7-6用弦截法求方程f(x)=x3 x2 +16x 80=0根,float root(float x1,float x2) /*定义root函数,求近似根*/ float x,y,y1; y1=f(x1); do x=xpoint(x1,x2); y=f(x); if(y * y10) /*f(x)与f(x1)同符号*/ y1=y; x1=x; else y2=y; x2=x; while(fabs(y)=0.0001); return(x); ,计算机与信息工程分院 C语言程序设计,26,例 7-6用弦截法求方程f(x)=x3 x2 +16x 80=0根,main() float x1,x2,f1,f2,x; do printf(“input x1,x2:n”); scanf(“%f%f”, ,运行结果: input x1,x2; 从键盘上输入2,6 A root of equation is 5.0000,计算机与信息工程分院 C语言程序设计,27,例 7-6用弦截法求方程f(x)=x3 x2 +16x 80=0根,该题函数调用的示意图:,计算机与信息工程分院 C语言程序设计,28,5.函数的递归调用(1),递归调用 在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。 直接调用本函数 间接调用本函数,如: int f(int x) int y,z; z=f(y); return(2*z);,计算机与信息工程分院 C语言程序设计,29,5.函数的递归调用(2),例7-7 例7-8 例7-9,返回主菜单,计算机与信息工程分院 C语言程序设计,30,例 7-7(1),有5个人,第5个人说他比第4个人大2岁,第4个人说他对第3个人大2岁,第3个人说他对第2个人大2岁,第2个人说他比第1个人大2岁,第1个人说他10岁。求第5个人多少岁。,分析 age(5)=age(4)+2 age(4)=age(3)+2 age(3)=age(2)+2 age(2)=age(1)+2 age(1)=10,计算机与信息工程分院 C语言程序设计,31,例 7-7(2),求第五个人年龄的过程,age(int n) /*求年龄的递归函数*/ int c; /*c用作存放函数的返回 值的变量*/ if(n=1) c=10; else c=age(n-1)+2; return(c); main() printf(“%d”,age(5); ,求解过程示意图,运行结果: 18,计算机与信息工程分院 C语言程序设计,32,例7-7求解示意图,计算机与信息工程分院 C语言程序设计,33,例7-8 用递归方法求n!,1 (n=0,1) n!= n(n-1)! (n1),float fac(int n) float f; if(n0)print(“n0,dataerror!”): else f(n=0|n=1) f=1; else f=fac(n-1)*n; return(f); main() int n; float y; printf(“input an integer number:”); scanf(“%d”,运行情况: input an intege number:10 10!= 3628800,计算机与信息工程分院 C语言程序设计,34,例7-9 Hanoi(汉诺)塔问题(1),古代有一个梵塔,塔内有3个座A、B、C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上(如下图)。有一个老和尚相吧这64个盘子从A座移到C座,但每次只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在移动过程中可以利用B座。,计算机与信息工程分院 C语言程序设计,35,例7-9 Hanoi(汉诺)塔问题(2),分析如下: 首先,分析如何将A座上3个盘子移到C座上的过程; 1)将A座上2个盘子移到B座上(借助C); 2)将A座上1个盘子移到C座上; 3)将B座上2个盘子移到C座上(借助A). 其中2)可以直接实现。 其中1)可用递归方法分解: 1.1将A上1个盘子从A移到C; 1.2将A上1个盘子从A移到B; 1.3将C上1个盘子从C移到B。 其中3)分解为 3.1将B上1盘子从B移到A上; 3.2将B上1盘子从B移到C上; 3.3将A上1盘子从A移到C上。,计算机与信息工程分院 C语言程序设计,36,例7-9 Hanoi(汉诺)塔问题(3),综合如下:,A,C,A,B,B,C,A,C,B,A,B,C,A,C,其次,由上述分析知道: 将n个盘子从A座移到C座可分解为以下3 个步骤: 1)将A上n-1个盘借助C座先移到B座上; 2)把A座上剩下的一个盘移到C座上; 3)将n-1个盘从B座借助于A座移到C座上。,计算机与信息工程分院 C语言程序设计,37,例7-9 Hanoi(汉诺)塔问题(4),void move(charx,char y) printf(“%c-%cn”,x,y); void hanoi(int n,char one,char two,char three) /*将n个盘从one座借助two座,移到three座*/ if(n=1) move(one,three); else hanoi(n-1,one,three,two); move(one,three); hanoi(n-1,two,one,three); main() int m; printf(“input the number of diskes:”); scanf(“%d”,运行结果,计算机与信息工程分院 C语言程序设计,38,例7-9 Hanoi(汉诺)塔问题(5),运行情况如下: input the number of diskes:3 The step to moving 3 diskes: A -C A -B C-B A-C B-A B-C A-C,计算机与信息工程分院 C语言程序设计,39,作业,思考题 函数定义和函数声明的语法规则及使用方式,计算机与信息工程分院 C语言程序设计,40,The end,计算机与信息工程分院 C语言程序设计,41,例7-4,main() int i=2,p; p=f(i,+i); /*函数调用*/ printf(“%d”,p); int f(int a,int b) /*函数定义*/ int c; if(ab) c=1; else if(a=b) c=0; else c=-1; return(c); ,运行结果: 0,计算机与信息工程分院 C语言程序设计,42,例7-5 对被调用的函数作声明,main() float add(float x,float y); float a,b,c; scanf(“%f,%f”, ,运行情况如下: 输入3.6, 6.5 结果: sum is 10.000000,计算机与信息工程分院 C语言程序设计,43,函数调用的条件,被调用的函数必须是已经存在的函数(是库函数或用户自己定义的函数)。 如果使用库函数,一般还应该在本文件开头用#include命令将调用有关库函数时所需用到的信息“包含”到本文件中来。 如使用用户自己定
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025国家市场监督管理总局国家标准技术审评中心招聘高校应届毕业生(事业编)2人考前自测高频考点模拟试题附答案详解(完整版)
- 2025年泰和县上圯水厂面向社会公开招聘考前自测高频考点模拟试题及完整答案详解一套
- 2025广东汕尾市陆河县高校毕业生就业见习招募15人(第三批)模拟试卷附答案详解
- 2025江苏泰州市第四人民医院招聘高层次人才15人模拟试卷及完整答案详解一套
- 2025年职业培训服务项目合作计划书
- 2025福建福州市仓山区卫健系统招聘编内卫生专业技术人员31人考前自测高频考点模拟试题及答案详解(各地真题)
- 2025年德阳市事业单位公开考试招聘工作人员笔试模拟试卷及答案详解(历年真题)
- 2025年量热仪项目合作计划书
- 2025广东广州天河区童时光幼儿园招聘1人考前自测高频考点模拟试题及答案详解(各地真题)
- 2025湖南衡阳理工职业学院人才招聘4人模拟试卷及1套参考答案详解
- (2025)时事政治试题库附答案详解
- 支行日常巡检方案
- 网络安全威胁建模规范
- 2025年双鸭山宝清县公安局公开招聘留置看护队员100人工作考试考试参考试题及答案解析
- 统编版2025-2026学年语文六年级上册第一、二单元综合测试卷(有答案)
- 2025年国企面试题型及答案
- 5年(2021-2025)高考1年模拟物理真题分类汇编专题04 机械能守恒、动量守恒及功能关系(广东专用)(解析版)
- 石刻牌坊施工方案
- 2025陕西“坚持以教育家精神铸魂强师打造支撑教育强国的高素质专业化教师队伍”专题网络培训在线考试(基教)题答案
- T-CWAN 0166-2025 不锈钢波纹管非熔化极气体保护焊工艺规范
- 2025-2026浙教版(2024)七年级上册科学教学计划
评论
0/150
提交评论