




已阅读5页,还剩53页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言程序设计第六章函数,第六章函数,6.1概述,一个函数是根据进去的信息(输入)和产生的东西(输出结果)所定义的一个黑盒。,在C语言函数中:我们用参数把值传送进函数:我们用RETURN把一个值返回调用函数。,2)除main函数外,其它函数可相互调用,3)函数不可嵌套定义,具有全局性、平行性,4)函数分为有参与无参函数,5)程序从main开始执行,最后又回到main函数结束。,1)除main外,其它为系统函数、自编函数,系统函数:由系统提供,用户可调用。自编函数:由用户按语法规则编写。,C程序由一个main和任意个函数组成。,1.无参函数,定义形式类型标识符函数名()说明部分语句类型标识符:表示返回值类型。,一、函数定义,6.2函数的定义与调用,例6.1利用函数实现信息打印#includeVoidprint_space()printf(“n”);Voidprint_message()printf(“nWelcomeyoutouseClanguage!”);print_spoace();main()print_message();print_space();,调用方式,例6.1通过调用print_space(),print_message()而显示:WelcomeyoutouseClanguage!就是无参函数,类型标识符函数名(形参表列)形参说明说明部分语句,2.有参函数,定义形式,例:求二数之最大值intmax(intx,inty)intz;z=xy?x:y;return(z);,注意:出现return,语句,返回值一般与函数类型一致。,有参函数的构造演示:,一函数调用的一般形式,函数名(实参表列);,1)如果是调用无参函数,则“实参表列”可以没有,但括弧不能省略。2)如果实参表列包含多个实参,则各参数间用逗号隔开。实参与形参的个数应相等,类型应一致。实参与形参按顺序对应,一一传递数据。3)实参传递给形参时,实参的计算有的系统自左至右,有的自右至左。,二、函数调用,二函数调用的方式,按函数在程序中出现的位置来分,可以有以下三种函数调用方式:,1、函数语句,把函数调用作为一个语句。如例8.1中的printstar();这时不要求函数带回值,只要求函数完成一定的操作。,2、函数表达式,函数出现在一个表达式中,这种表达式称为函数表达式。这时要求函数带回一个确定的值以参加表达式的运算。,例:c=2*max(a,b);函数max是表达式的一部分,它的值乘以2再赋给c。,3、函数参数,函数调用作为一个函数的实参。例:m=max(a,max(b,c);其中max(b,c)是一次函数调用,它的值作为max另一次调用的实参。m的值是a、b、c三者最大的。,又如:printf(“%d”,max(a,b);也是把max(a,b)作为printf函数的一个参数。,三对被调用函数的声明和函数原型,在一个函数中调用另一个函数,需要具备哪些条件呢?,1)首先被调函数必须是已存在的函数(是库函数或用户自己定义的函数)。,2)如果使用库函数,一般还应该在本文件开头用#include命令将调用库函数时所需用到的信息“包含”到本文件中来。,3)调用函数应对被调用函数的返回值类型作出说明:(函数名相当于一变量,但应有所区别),类型符函数名();它不同于函数的定义(功能定义),例8.5:求二实数之和main()floatadd(floatx,floaty);floata,b,c;scanf(%f,%f,注意:以下几种情况可省略对被调函数的说明:1)当返回值为整型、字符型。2)在调用之前定义函数。3)在整个文件的开头定义函数。,函数原型,在c语言中,函数声明称为函数原型(functionprototype),函数原型的一般形式:,(1)函数类型函数名(参数类型1,参数类型2,)(2)函数类型函数名(参数类型1,参数名1,参数类型2,参数名2,),应当保证函数原型与函数首部写法上的一致,即函数类型、函数名、参数个数、参数类型和参数顺序必须相同。函数调用时函数名、实参类型必须与函数原型中的形参类型赋值兼容。,说明:,1)以前的C版本函数声明方式不是采用函数原型,而只声明函数名和函数类型。例如在例8.5中,也可写成:floatadd();新版本也兼容这种写法,但不提倡这种用法。,2)如果在函数调用之前,没有对函数作声明,则编译系统会把第一次遇到的该函数形式(函数定义或函数调用)作为函数的声明,并将函数类型默认为int型。,3)如果被调用函数的定义出现在主调函数之前,可以不加声明。,4)如果已在所有函数定义之前,在函数外部已做了函数声明,则在各个主调函数中不必对所调用的函数再作声明。,6.3函数参数,当调用一个带形式参数的函数时,我们用到实际参数。实际参数是在调用时赋给相应的形式参数的特殊的值。,一形参与实参,函数被调用时,临时分配单元给形参,调用完毕,这些单元被释放。,实参:出现在调用函数中,形参:出现被调用函数中。,注:实参可为表达式,其值传递。实参、形参类型一致。可在形参表列中对形参说明。,例6.6输入两个数,输出其中较大的数。#includeintmax(intx,inty)intt;if(xy)t=x;elset=y;returnt;voidmain()inta,b,m;intmax(int,int);/*对函数max的声明*/scanf(“%d,%d”,例如运行时输入:10,5输出为:10,实参a和形参x,实参b和形参y之间值的传递如下图:,二函数返回值,1)通过return语句将返回值传给函数名,可有多个return.,通常,希望通过函数调用使主调函数得到一个确定的值。由函数名只能得到一个返回值。,说明:,一个函数中可以有一个以上的return语句,执行到哪个return语句,哪个语句起作用。,2)返回值类型为函数类型。一般return中的返回值类型应与函数定义时的类型一致,不一致时,以函数定义类型为准。凡不加类型说明的函数,一律按整型处理。,return语句后面的括弧也可以不要,如:returnz;与“return(z);”等价。return后面的值可以是一个表达式。如:Max(intx,inty)return(xy?x:y);,例6.7设求最大公约数的程序如下:,#includeintdivisor(inta,intb)intr;dor=a%b;a=b;/*形式参数的值在函数被改变*/b=r;while(r!=0);returna;voidmain()inta,b,d;scanf(“%d,%d”,注意:函数的按值传递和按地址传递的区别。,函数divisor中的形式参数的a得到实参a的值,而形参b得到实参b的值。divisor中a和b值的改变并不影响主函数中的a和b。所以输出结果为:a=21,b=15d3如果程序运行时输入的是:15,2l函数divisor中的形式参数的a得到实参b的值,而形参b得到实参a的值。则输出结果为:a=15,b21d3,C语言不能嵌套定义,但可以嵌套调用函数。也就是说,在调用一个函数的过程中,又调用另一个函数。,6.4函数的嵌套与递归调用,请看下图:,一、函数嵌套调用,上图是两层嵌套(连main函数共3层函数),其执行过程是:,(1)执行main函数的开头部分;(2)遇函数调用f1的操作语句,流程转去f1函数;(3)执行f1函数的开头部分;(4)遇调用f2函数的操作语句,流程转去函数f2;(5)执行f2函数,如果再无其他嵌套的函数,则完成f2函数的全部操作;(6)返回调用f2函数处,即返回f1函数;(7)继续执行f1函数中尚未执行的部分,直到f1函数结束;(8)返回main函数中调用f1函数处;(9)继续执行main函数的剩余部分直到结束。,例:计算s=13+23+33+103,方法如下:,longf2(intn,intk)/*计算n的k次方*/longpower=n;inti;for(i=1;ik;i+)power*=n;returnpower;longf1(intn,intk)/*计算1到n的k次方之累加和*/longsum=0;inti;for(i=1;iCABCBACBABCAC,两个函数:move(getone,putone)表示从getone塔移一个盘子至putone塔,hanoi(n,one,two,three)表示n个盘子从one塔借助于two塔(空)移至three塔。调用时塔用字符常量A,B,C表示。,让我们看一看,当盘数是3时,towers()的执行情况。,6.5变量作用域与存储方式,6.5.1变量的作用域,变量有效的范围称变量的作用域。,C语言中所有的变量都有自己的作用域。变量说明的方式不同,其作用域也不同。C语言中的变量,按作用域范围可分为两种,即局部变量和全局变量。,一、局部变量,凡在函数(含main函数)内部定义的变量称为局部变量。,局部性:局部变量仅在函数内部有效。其作用域仅限于函数内,在函数内才能引用,即可以对它赋值或取值。在作用域以外,使用它们是非法的。,2.形参为局部变量。,3.在复合语句中可定义仅复合语句中有效的临时变量。,1.不同的函数可具有同名的变量,它们占不同的内存单元,互不影响。,二、全局变量,一个源文件中,在所有函数之外定义的变量为全局变量。,有效性:自定义位置开始至文件结尾全部有效。,charf2(x,y);intc,y;inti,j;main(),1.全局变量所作用到的函数,相当于这些函数的公共变量。于是,当一个函数对其值进行改变后,另一个函数使用该变量的值亦相应改变。好处:函数之间值传递。,2.不要随意使用全局变量。一是始终占据内存单元;二是由于函数依赖于外部定义的变量,减少了通用性。,3.不在作用域内函数。若使用全局(外)变量,需在函数体内加上extern保留字。,4.全局和局部变量同名时,局部变量有效。,floatf1(x)intx;externinta,b;inta0;b=1main(),a,b作用域,一、变量的存储类别,C语言特有的方式。表达了一个变量存在的时间。,6.5.2变量的存储方式,静态存储变量:存放于静态存储区,在程序整个运行过程中,始终占据固定的内存单元。,动态存储变量:存放于动态存储区,根据程序的运行状态(如:函数调用)而临时分配的单元,且单元并不固定。,以上为两大类,又分为四种具体形式自动型变量(auto)2.静态(static)变量3.寄存器型变量4.外部(extern)变量前面学习的局部、全局变量均以上述方式中的一种形式存储。,二、局部变量,局部变量既可以静态方式,又可以动态方式存储。动态方式:autointa,b;则:a,b为自动型,存入动态区。在该函数被调用时才分配单元,函数调用结束时释放。auto一般省略。以前用到的变量均为auto型,除static外。,现在,我们看一个例子:,若定义时赋初值,则程序运行中仅在第一次调用时赋初值,第二次调用不再赋初值,而是使用上一次调用的值。,则:a,b存入静态区。函数中的a,b始终占据固定存储单元。,静态方式:staticinta,b;,现在,我们看一个例子:,intfac(n)intn;staticintf=1;f=fn;return(f);main()inti;for(i=1;i=5;i+)printf(%d!=%dn,i,fac(i);,例:求n!,运行结果为:1!12!23!64!245!120,每一次调用fac(i),打印一个i!,同时保留这个i!的值以便下次再乘(i+1)。,若不赋初值,则系统置初值0,而动态变量不赋初值则值不确定。,当动态局部变量在一个函数中反复被用达到数百次以上,为了提高效率,可将其存入寄存器中(有限个),不存入内存的动态区中。,说明方式registerinti,j=1;,不可多,一般13个,必要时使用。,三、全局变量,在函数外部中定义,它们一定存放在静态存贮区中。,全局变量即可被本文件中各函数用,亦可被其它源文件中的函数引用。,1.只被本文件中的函数引用,全局变量本身一定是存放在静态区的。但若加上staic.即:,staticinta,b;floatf1(x)int,则表明a,b只被本文件中各函数引用,即使与其它文件中的全局变量同名,也互不影响。,2.可被其它文件中的函数引用,inta;main(),externinta;fac(x)intxz=a,文件f1.c,文件f2.c用到f1.c中的a,f2.c中的extern在函数外说明,在函数内说明已叙述过。,存储类别,总结见表7.2,函数内,函数外,作用域,存在性,作用域,存在性,auto,register,static局部,static局部本文件,不加static全局(外部),6.6内部函数、外部函数和系统函数,函数本身在一个文件中为全局的。即一个文件中定义的函数可被该文件的所有其它函数引用。但函数能否被其它文件中的函数所引用呢?为此分为:内部函数、外部函数,一、内部函数只能在本文件中调用,static类型标识符函数名(形参表),例:staticintmax(a,b)inta,b;,则该函数max只能被本文件中的其它函数引用,而不能被其它文件中的函数引用。,既可被本文件中的函数调用,也可被其它文件中的函数调用。,extern类型标识符函数名(形参表),一般系统在调用外部函数的函数中用extern说明外部函数。,二、外部函数,extern可省略,例:有一个字符串,内有若干个字符,程序将字符串中该字符删除去。用外部函数实现。,file1.c(文件1)main()externenter_string(),delete_string(),print_string();/*说明本文件要用到其它文件中的函数*/charc;staticcharstr80;enter_string(str);scanf(%c,file2.c(文件2)#includestdio.hexternenter_string(str)/*定义外部函数enter_string*/charstr80;gets(str);/*读入字符串str*/,file3.c(文件3)externdelete_string(str,ch)/*定义外部函数delete_string*/charstr,ch;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 陈虎谈新质生产力
- 新质生产力发展经过
- 物流管理成本与效益管理分析
- 家庭教育手机管理
- 双口小学校园文化建设阶段性总结模版
- 脑干梗塞的临床护理
- 新零售店面接待流程标准化课件
- 幼儿园公务员试题及答案
- 养老消防安全试题及答案
- 盐城国企面试题库及答案
- 天然气管线巡查指引培训课件
- 精益-大学生创新与创业学习通超星课后章节答案期末考试题库2023年
- 资金使用计划书范本怎么写
- 山东财经大学辅导员考试题库
- 耳尖放血课件完整版
- 设备日常点检标准作业指导书
- 年度职业病防治计划与实施方案
- 四川沐萱环境监测科技有限公司实验室搬迁工程项目环境影响报告表
- GB/T 7706-2008凸版装潢印刷品
- GB/T 23329-2009纺织品织物悬垂性的测定
- GB 2757-2012食品安全国家标准蒸馏酒及其配制酒
评论
0/150
提交评论