已阅读5页,还剩73页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章函数,5.1函数的基本概念,1)除main外,其它为系统函数、自编函数,系统函数:由系统提供,放在不同的头文件中,用户可调用。自编函数:由用户按语法规则编写。,C程序由一个main和任意个函数组成。,2)除main函数外,其它函数可相互调用,3)函数不可嵌套定义,但可以嵌套调用。,4)函数分为有参与无参函数,5)程序从main开始执行,最后又回到main函数结束。,例5.1intmax(inta,intb)if(ab)returna;elsereturnb;voidmain()intmax(inta,intb);intx,y,z;printf(inputtwonumbers:n);scanf(%d%d,5.2函数的定义,返回类型符函数名()说明部分语句,1.无参函数,定义形式,注意:返回类型符表示函数的返回值类型。,例:voidHello()printf(Hello,worldn);这里,Hello为函数名,Hello函数是一个无参函数,当被其它函数调用时,输出Helloworld字符串。,类型标识符函数名(形参表列)形参说明说明部分语句,2.有参函数,定义形式,例:求二数之最大值intmax(x,y)intx,y;intz;z=xy?x:y;return(z);,用return,语句,返回函数的值。,或:intmax(intx,inty)intz;z=xy?x:y;return(z);,5.3函数的调用5.3.1形式参数和实际参数,函数的参数分为形参和实参两种。形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用。实参出现在主调函数中,发生函数调用时,主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。,形参与实参,函数被调用时,临时分配单元给形参,调用完毕,这些单元被释放。,注:实参可为表达式,只传递表达式的值。,实参:出现在调用函数中,形参:出现被调用函数中。,实参、形参类型一致。,可在形参表列中对形参说明。,例5.3:voidmain()intk,n;printf(inputnumbern);scanf(%d,本程序运行时,输入5,运行结果为:n=5,k=6在执行函数过程中,形参m的值变为6。返回主函数之后,输出实参n的值仍为5。可见实参的值不随形参的变化而变化。,思考:程序做如下改动,会出现什么问题?如果将程序第7行改为printf(n=%d,k=%d,m=%d,n,k,m);如果将程序第6行改为k=s(n,n);如果删除程序中的scanf(%d,例5.4:请分析程序的运行结果。#includestdio.hvoidmain()inta=3,b=5;swap(a,b);printf(a=%d,b=%dn,a,b);swap(intx,inty)inttemp;temp=x;x=y;y=temp;printf(x=%d,y=%dn,x,y);,5.3.2函数的调用,语言中,函数调用的一般形式为:函数名(【实际参数表】)对无参函数调用时则无实际参数表。实际参数表中的参数可以是常数,变量或其它构造类型数据及表达式。各实参之间用逗号分隔。,函数调用的方式一般有两种:函数表达式:函数作为表达式中的一项出现在表达式中,以函数返回值参与表达式的运算。这种方式要求函数是有返回值的。函数语句:函数调用的一般形式加上分号即构成函数语句,例5.5求二实数之和#includefloatadd(floatx,floaty)/*函数定义*/floatz;z=x+y;returnz;main()floata,b,c;scanf(“%f,%f”,其中c=add(a,b)是一个赋值表达式,把add的返回值赋予变量c。,例5.6#includestdio.hvoidprintstar()printf(n*n);voidprint_message()printf(Howdoyoudo!n);voidmain()printstar();print_message();printstar();,程序运行结果为:*Howdoyoudo!*函数printstar和print_message都没有返回值,调用时函数名后直接加分号作为语句,5.3.3函数声明:一般的函数被调用之前必须做出说明:,例1:求二实数之和#includemain()floatadd();/*函数说明*/floata,b,c;scanf(“%f,%f”,说明格式:类型符函数名();,floatadd(floatx,floaty);/*函数定义*/floatz;z=x+y;returnz;,可省略函数说明的几种情况:,当返回值为整型、字符型。,函数的定义放在main()函数之前。,例2:求二实数之和(将例1程序改写如下:)#includefloatadd(floatx,floaty);/*函数定义*/floatz;z=x+y;returnz;main()floata,b,c;scanf(“%f,%f”,5.3.4函数返回值,变量等,通过return语句将返回值传给函数名,可有多个return.,返回值类型为函数类型。一般return中的返回值类型应与函数定义时的类型一致,不一致时,以函数定义类型为准。,return(表达式);,由函数名只能得到一个返回值。,不返回函数值的函数,可以明确定义为“空类型”,类型说明符为“void”。函数被定义为空类型后,函数中的return语句不能带有表达式,例5.8:,#includemain()ints;s=f();printf(%d,s);intf()inti=1,sum=0;dosum=sum+i;i+;while(i=100);returnsum;,思考:如何考虑将函数设计为有参数或无参数函数的通用性如何设定函数的返回值,例5.9:,#includemain()intm,s;scanf(“%d”,5.4嵌套调用,函数不能嵌套定义,但可以嵌套调用。,嵌套调用:调用一个函数的过程中又调用另一函数,例5.11计算s=52!+82!本题可编写两个函数,一个是用来计算平方值的函数f1,另一个是用来计算阶乘值的函数f2。,longf1(intp)intk;longr;longf2(int);k=p*p;r=f2(k);returnr;,longf2(intq)longc=1;inti;for(i=1;iz?r:z);intmin(intx,inty,intz)intr;r=xy?x:y;return(rCABCBACBABCAC,在程序中有两个函数:move(getone,putone)表示从getone塔移一个盘子至putone塔,hanoi(n,one,two,three)表示n个盘子从one塔借助于two塔(空)移至three塔。调用时塔用字符常量A,B,C表示。,5.6变量的存储类别和作用域5.6.1局部变量与全局变量,一、局部变量,凡在函数(含main函数)内部定义的变量称为局部变量。,局部性:局部变量仅在函数内部有效。,1.不同的函数可具有同名的变量,它们占不同的内存单元,互不影响。,2.形参为局部变量。,3.在复合语句中可定义仅复合语句中有效的临时变量。,二、全局变量,一个源文件中,在所有函数之外定义的变量为全局变量。,有效性:自定义位置开始至文件结尾全部有效。,1.全局变量所作用到的函数,相当于这些函数的公共变量。于是,当一个函数对其值进行改变后,另一个函数使用该变量的值亦相应改变。好处:函数之间值传递。,2.不要随意使用全局变量。一是始终占据内存单元;二是由于函数依赖于外部定义的变量,减少了通用性。,3.不在作用域内函数。若使用全局(外)变量,需在函数体内加上extern保留字。,4.全局和局部变量同名时,局部变量有效。,floatf1(x)intx;externinta,b;inta0,b=1;main(),a,b作用域,例5.16#includeintmax(intx,inty)intz;z=xy?x:y;returnz;voidmain()externinta,b;/*全局变量外部说明*/printf(%dn,max(a,b);inta=10,b=5;/*全局变量定义*/,例5.17输入正方体的长宽高l,w,h。求体积及三个面x*y,x*z,y*z的面积。ints1,s2,s3;intvs(inta,intb,intc)intv;v=a*b*c;s1=a*b;s2=b*c;s3=a*c;returnv;,main()intv,l,w,h;printf(ninputlength,widthandheightn);scanf(%d%d%d,分析:为何将s1,s2,s3定义为全局变量?,例5.18外部变量与局部变量同名。inta=3,b=5;/*a,b为外部变量*/max(inta,intb)/*形参a,b为内部变量*/intc;c=ab?a:b;return(c);main()inta=8;/*a为内部变量*/printf(%dn,max(a,b);,5.6.2变量的存储类别,变量的存储类别,表达了一个变量存在的时间。,静态存储变量:存放于静态存储区,在程序整个运行过程中,始终占据固定的内存单元。,动态存储变量:存放于动态存储区,根据程序的运行状态(如:函数调用)而临时分配的单元,且单元并不固定。,变量又可分为四种具体形式,2.静态(static)变量,3.寄存器型变量,4.外部(extern)变量,前面学习的局部、全局变量均以上述方式中的一种形式存储。,1.自动型变量(auto),局部变量既可以静态方式,又可以动态方式存储。动态方式:autointa,b;,局部变量,则:a,b为自动型,存入动态区。在该函数被调用时才分配单元,函数调用结束时释放。,auto一般省略。以前用到的变量均为auto型,除static外。,若定义时赋初值,则程序运行中仅在第一次调用时赋初值,第二次调用不再赋初值,而是使用上一次调用的值。,则:a,b存入静态区。函数中的a,b始终占据固定存储单元。,静态方式:staticinta,b;,#includeintfac(n)/*函数定义*/intn;staticintf=1;f=fn;return(f);main()inti;for(i=1;ib)?a:bmain()intx,y,max;printf(inputtwonumbers:);scanf(%d%d,例5.29使用宏定义,计算半径为2、4、6、8、10时圆的面积和圆的周长#include#definePI3.141592653#defineAREA(R)PI*(R)*(R)#definePERI(R)2*PI*(R)voidmain()intr;for(r=2;r=10;r+=2)printf(半径=%2d,圆面积=%ft,r,AREA(r);printf(圆周长=%fn,PERI(r);,5.7.2文件包含,C语言允许在一个文件预编译时,将另一个文件原封不动地包含进来。,当一组符号常量的定义为公用时,可作为一个独立的文件被其它文件包含。,目的:当函数不在一个文件中,既可用link连接编译后的obj文件,也可用“文件包含”方式。,格式:#include文件名,#includef2.cmain(),例:,f1.c,f2.c,预编译后:,:main(),f1.c,为f2.c中的内容,再进行正式编译,1.一个include只能写一个文件,包含多个文件需多个include,只在f1.c中用#include.#includef2.c#includef3.c,分别在f1.c,f2.c中用#include在f1.c中:#includef2.c在f2.c中:#includef3.c,2.当f1.c包含f2.c,而f2.c又包含f3.c时,有两种包含形式:,3.一般用.h扩展名命名被包含文件。h为head之意以与一般.c文件区别。如系统stdio.h.系统.h文件在子目录INCLUDE下。,4.#include后的文件名既可用,也可用,两者区别:首先在当前目录中找,然后再去标准目录中找。只在标准目录(include目录)中找。,5.被包含文件和包含文
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025食堂从业人员培训考试题库及答案
- 2026-2031中国女装市场研究及发展趋势研究报告
- 2025年先进制造技术期末试题含答案
- 触电事故应急预案演练方案及演练过程
- 护理部导管滑脱应急演练脚本
- 2025年CAAC执照理论复习考试题库(含答案)
- 药品经营和使用质量监督管理办法培训试题及答案
- 2025年度全国网络安全知识竞赛试题库及答案
- 2025年公共服务考试试题及答案
- 2025年注册监理工程师房建专业继续教育试题及答案
- 心理健康教案教育课件
- 骨科危重患者的急救及护理
- 企业政府项目管理制度
- 上海对外经贸大学《审计学》2023-2024学年第二学期期末试卷
- 泵站运行维护管理制度
- 50篇短文搞定高考英语3500单词
- 【整本书阅读价值及教学策略研究国内外文献综述3600字】
- (2025)《传染病防治法》综合培训试题与答案
- 四川省成都市某中学2024-2025学年八年级上学期期中考试物理试题(原卷版)
- 骡子搬运安全协议书
- 《创新管理》 课件
评论
0/150
提交评论