




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、6.1 6.1 概述概述 一个函数是根据进去的信息(输入)和产生的东西(输出结果)所定义的一个黑盒。在 C 语言函数中: 我们用参数把值传送进函数: 我们用 RETURN 把一个值返回调用函数。 2) 除main函数外,其它函数可相互调用main ( )abcdxz3)函数不可嵌套定义,具有全局性、平行性,4)函数分为有参与无参函数5)程序从main开始执行,最后又回到main函数结束。1) 除main外, 其它为系统函数、自编函数,系统函数:由系统提供,用户可调用。自编函数:由用户按语法规则编写。C程序由一个main和任意个函数组成。1. 无参函数定义形式类型标识符 函数名( ) 说明部分
2、语句 类型标识符: 表示返回值类型。一、函数定义一、函数定义例6.1 利用函数实现信息打印#includeVoid print_space()printf(“n”);Void print_message()printf(“n Welcome you to use Clanguage !”);print_spoace();main()print_message();print_space(); 调用方式函数名( ) ;若有返回值可出现在表达式中无返值可单独出现例6.1 通过调用print_space ( ), print_ message( )而显示: Welcome you to use C
3、language ! 就是无参函数类型标识符类型标识符 函数名函数名(形参表列形参表列) 形参说明说明部分形参说明说明部分 语句语句 2. 有参函数 定义形式例: 求二数之最大值 int max (int x, int y) int z; z=xy? x:y; return (z); 留意:出现留意:出现return, 语句,返回值一般与函数类型一致。语句,返回值一般与函数类型一致。有参函数的构造演示:一一 函数调用的一般形式函数调用的一般形式 1如果是调用无参函数,那么“实参表列可以没有,但括弧不能省略。 2如果实参表列包含多个实参,则各参数间用逗号隔开。实参与形参的个数应相等,类型应一致。
4、实参与形参按顺序对应,一一传递数据。 3实参传递给形参时,实参的计算有的系统自左至右,有的自右至左。二、函数调用二、函数调用二二 函数调用的方式函数调用的方式 按函数在程序中出现的位置来分,可以有以下三种函数调用方式:1、函数语句、函数语句把函数调用作为一个语句。如例8.1中的printstar();这时不要求函数带回值,只要求函数完成一定的操作。2、函数表达式、函数表达式函数出现在一个表达式中,这种表达式称为函数表达式。这时要求函数带回一个确定的值以参加表达式的运算。例:例:c=2*max(a,b);函数函数max是表达式的一部分,它的值乘以是表达式的一部分,它的值乘以2再赋给再赋给c。3、
5、函数参数、函数参数 函数调用作为一个函数的实参。例: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 命令将调用库函数时所需用到的信息“包
6、含到本文件中来。 3) 调用函数应对被调用函数的返回值类型作出说明: (函数名相当于一变量,但应有所区别)类型符 函数名( );它不同于函数的定义(功能定义) 例8.5 : 求二实数之和 main ( ) float add( float x,float y); float a, b, c; scanf(%f, %f,&a, &b); c=add(a, b); printf (sum= %f;c); float add( float x, float y); float z; z=x+y; return z; 留意:以下几种情况可省略对被调函数的说明:留意:以下几种情况可省略对
7、被调函数的说明: 1)当返回值为整型、字符型。当返回值为整型、字符型。 2) 在调用之前定义函数。在调用之前定义函数。 3) 在整个文件的开头定义函数。在整个文件的开头定义函数。在c语言中,函数声明称为函数原型function prototype)函数原型的一般形式:(1函数类型函数类型 函数名参数类型函数名参数类型1,参数类型,参数类型2,)(2函数类型函数类型 函数名参数类型函数名参数类型1,参数名,参数名1,参数类型,参数类型2,参数名参数名2,) 应当保证函数原型与函数首部写法上的一致,即函数类型、函数名、参数个数、参数类型和参数顺序必须相同。函数调用时函数名、实参类型必须与函数原型中
8、的形参类型赋值兼容。阐明:阐明: 1以前的C版本函数声明方式不是采用函数原型,而只声明函数名和函数类型。例如在例8.5中,也可写成: float add( );新版本也兼容这种写法,但不提倡这种用法。 2如果在函数调用之前,没有对函数作声明,则编译系统会把第一次遇到的该函数形式函数定义或函数调用作为函数的声明,并将函数类型默认为int型。 3如果被调用函数的定义出现在主调函数之前,可以不加声明。 4如果已在所有函数定义之前,在函数外部已做了函数声明,则在各个主调函数中不必对所调用的函数再作声明。 当调用一个带形式参数的函数时, 我们用到实际参数。实际参数是在调用时赋给相应的形式参数的特殊的值。
9、调用函数调用函数实际参数实际参数被调用函数被调用函数 形式参数形式参数一一 形参与实参形参与实参调用时调用时: 实参值实参值单向传送形参。 函数被调用时,临时分配单元给形参,调用完毕, 这些单元被释放。实参实参: 出现在调用函数中,出现在调用函数中, 形参形参: 出现被调用函数中。出现被调用函数中。注注: 实参可为表达式实参可为表达式,其值传递。其值传递。 实参、形参类型一致。实参、形参类型一致。 可在形参表列中对形参说明。可在形参表列中对形参说明。例例6.6 输入两个数,输出其中较大的数。输入两个数,输出其中较大的数。#include int max(int x,int y) int t;
10、if(xy) t=x; else t=y; return t;void main() int a,b,m; int max(int,int);/*对函数对函数max的声明的声明*/ scanf(“%d,%d”,&a,&b); m=max(a,b);/*调用函数调用函数max(),a,b已有具体的值已有具体的值*/ printf(“max=%d”,m);例如运行时输入:例如运行时输入:10,5输出为:输出为:10 实参a和形参x,实参b和形参y之间值的传递如下图 :二二 函数返回值函数返回值 1通过return语句将返回值传给函数名,可有多个return.变量等return (表
11、达式);通常,希望通过函数调用使主调函数得到一个确定的值。由函数名只能得到一个返回值。阐明:阐明: 一个函数中可以有一个以上的return语句,执行到哪个return语句,哪个语句起作用。 2) 返回值类型为函数类型。 一般return中的返回值类型应与函数定义时的类型一致, 不一致时,以函数定义类型为准。 凡不加类型说明的函数,一律按整型处理。return语句后面的括弧也可以不要,如:return z;与“return (z);”等价。return 后面的值可以是一个表达式。如:Max(int x,int y) return(xy?x:y);例6.7 设求最大公约数的程序如下:#includ
12、e int divisor(int a,int b)int r;do r=a%b; a=b;/*形式参数的值在函数被改变形式参数的值在函数被改变*/ b=r; while(r!=0);return a;void main()int a,b,d;scanf(“%d,%d”,&a,&b);if(ab) /*把较大的数传给函数的第一个参数把较大的数传给函数的第一个参数*/ d=divisor(a,b); /*实参与形参同名实参与形参同名*/else d=divisor(b,a);printf(“a=%d,b=%dn”,a,b); /*变量变量a和和b的值不会被函数改变的值不会被函数改
13、变*/printf(“d=%d”,d);留意:函数的按值传递和按地址传递的区别。留意:函数的按值传递和按地址传递的区别。 函数divisor中的形式参数的a得到实参a的值,而形参b得到实参b的值。divisor中a和b值的改变并不影响主函数中的a和b。所以输出结果为: a=21,b=15 d3 如果程序运行时输入的是:15,2l 函数divisor中的形式参数的a得到实参b的值,而形参b得到实参a的值。则输出结果为: a=15,b21 d3 C语言不能嵌套定义,但可以嵌套调用函数。也就是说,在调用一个函数的过程中,又调用另一个函数。 请看下图:一、函数嵌套调用f1( )调用f2函数 f2( )
14、 main 调用f1函数 终了 上图是两层嵌套(连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 方法如下:long f2(int
15、n,int k) /*计算n的k次方*/ long power=n; int i; for(i=1;ik;i+) power *= n; return power; long f1(int n,int k) /*计算1到n的k次方之累加和*/ long sum=0; int i; for(i=1;i1)即: 条件成立,调用递归,否则结束。一个最常用的例子: 求n!1. 从数学上定义从数学上定义 2、程序:、程序: float fac(n) int n; float f; if (n%cn , getone, putone); void hanoi (n, one, two, three) /*
16、将将n个盘从个盘从one借助借助two,移动,移动three*/char one, two, three; int n; if (n= =1) move (one, three); else hanoi (n1, one, three, two); move (one, three); hanoi (n1, two, one, three); main ( ) int m; printf ( input the number of disdes :); scanf( %d ,&m); printf( The step to moving %3d disdes:n , m); hanoi
17、 (m, A, B, C); 运行情况如下: input the number of disdes:3 The step to moving 3 diskes: A C A B C B A C B A B C A C两个函数: move (getone, putone) 表示从getone 塔移一个盘子至putone塔 hanoi(n, one, two, three) 表示n个盘子从one塔借助于two塔(空)移至three塔。 调用时塔用字符常量A , B , C 表示。让我们看一看, 当盘数是 3 时, towers() 的执行情况。6.5 6.5 变量作用域与存储方式变量作用域与存储方
18、式6.5.1 变量的作用域变量有效的范围称变量的作用域。 C语言中所有的变量都有自己的作用域。变量说明的方式不同,其作用域也不同。C语言中的变量,按作用域范围可分为两种,即局部变量和全局变量。一、局部变量 凡在函数(含main 函数)内部定义的变量称为局部变量。局部性: 局部变量仅在函数内部有效。 其作用域仅限于函数内,在函数内才能引用,即可以对它赋值或取值。在作用域以外,使用它们是非法的。 2. 形参为局部变量。 3. 在复合语句中可定义仅复合语句中有效的临时变量。1. 不同的函数可具有同名的变量,它们占不同的内存单元,互不影响。二、全局变量例: int p=1, q=5; float f1
19、(a) int a; int b, c; char c1, c2; p,q的作用范围c1, c2的作用范围 一个源文件中,在所有函数之外定义的变量为全局变量。有效性: 自定义位置开始至文件结尾全部有效。 char f2(x,y); int c, y; int i, j; main ( ) 1. 全局变量所作用到的函数,相当于这些函数的公共变量。于是,当一个函数对其值进行改变后,另一个函数使用该变量的值亦相应改变。益处: 函数之间值传递。2. 不要随意使用全局变量。一是始终占据内存单元;二是由于函数依赖于外部定义的变量,减少了通用性。3. 不在作用域内函数。若使用全局(外)变量,需在函数体内加上
20、extern保留字。4. 全局和局部变量同名时,局部变量有效。 float f1 (x) int x; extern int a, b; int a0; b= 1 main ( ) a, b作用域一、变量的存储类别程序区静态存储区动态存储区数据,变量存放内存分配C语言特有的方式。表达了一个变量存在的时间。6.5.2 变量的存储方式静态存储变量: 存放于静态存储区,在程序整个运行过程中,始终占据固定的内存单元。动态存储变量: 存放于动态存储区,根据程序的运行状态(如:函数调用)而临时分配的单元,且单元并不固定。以上为两大类,又分为四种具体形式自动型变量(auto)2. 静态(static)变量3
21、. 寄存器型变量4. 外部(extern)变量 前面学习的局部、全局变量均以上述方式中的一种形式存储。二、局部变量 局部变量既可以静态方式 , 又可以动态方式存储。动态方式: auto int a, b; 那么: a, b为自动型,存入动态区。在该函数被调用时才分配单元,函数调用结束时释放。 auto一般省略。以前用到的变量均为auto型,除static外。如今, 我们看一个例子: 若定义时赋初值,则程序运行中仅在第一次调用时赋初值,第二次调用不再赋初值,而是使用上一次调用的值。那么: a, b存入静态区。 函数中的a, b始终占据固定存储单元。 静态方式: static int a, b;如
22、今, 我们看一个例子: int fac (n) int n; static int f=1; f=fn; return(f); main ( ) int i; for (i=1; i=5; i+) printf (%d!=%dn, i, fac(i); 例:求n!运行结果为: 1!1 2!2 3!6 4!24 5!120 每一次调用fac(i),打印一个i!,同时保留这个i!的值以便下次再乘(i+1)。 若不赋初值,则系统置初值0,而动态变量不赋初值则值不确定。 当动态局部变量在一个函数中反复被用达到数百次以上,为了提高效率,可将其存入寄存器中(有限个),不存入内存的动态区中。说明方式 reg
23、ister int i, j=1; 不可多, 一般13个 必要时使用。三、全局变量 在函数外部中定义,它们一定存放在静态存贮区中。 全局变量即可被本文件中各函数用,亦可被其它源文件中的函数引用。1. 只被本文件中的函数引用 全局变量本身一定是存放在静态区的。但若加上 staic. 即:static int a, b; float f1(x)int 则表明a,b只被本文件中各函数引用,即使与其它文件中的全局变量同名,也互不影响。2. 可被其它文件中的函数引用 int a; main( ) extern int a; fac(x) int x z=a 文件f1.c文件f2.c用到f1.c 中的a
24、f2.c中的extern在函数外说明,在函数内说明已叙述过。存储类别总结 见表7.2函数内函数外作用域存在性作用域 存在性 auto register static 部分 static 部分 本文件 不加 static 全局(外部) 函数本身在一个文件中为全局的。即一个文件中定义的函数可被该文件的所有其它函数引用。但函数能否被其它文件中的函数所引用呢?为此分为: 内部函数、外部函数一、内部函数只能在本文件中调用static 类型标识符类型标识符 函数名函数名(形参表形参表)例: static int max (a, b) int a, b; 则该函数max只能被本文件中的其它函数引用,而不能被
25、其它文件中的函数引用。既可被本文件中的函数调用,也可被其它文件中的函数调用。 extern 类型标识符 函数名(形参表) 一般系统在调用外部函数的函数中用extern说明外部函数。二、外部函数extern 可省略例: 有一个字符串,内有若干个字符,程序将字符串中该字符删除去。用外部函数实现。 file1.c(文件1)main ( ) extern enter_string ( ), delete_string( ), print_string( ); /* 说明本文件要用到其它文件中的函数*/ char c; static char str80; enter_string (str); scanf (%c, &c); delete_string (str, c); print_string (str); file2.c (文件2)#include stdio.h extern enter_string (str) /*定义
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 科技企业经济实力评估与展望
- 父母赠与房屋合同范本
- 专利 顾问合同范本
- 科技与旅游融合的未来趋势
- 秘书在提升企业文化中的角色计划
- 如何开展有效的市场推广计划
- 关于管理哲学的深入思考计划
- 武馆加盟合同范本
- 板材环保合同范本
- 优化急诊诊疗流程的研究计划
- DeepSeek从入门到精通培训课件
- 俄罗斯进口冻肉合同范例
- 2025年湖北省技能高考(建筑技术类)《建设法规》模拟练习试题库(含答案)
- 2024-2025学年第二学期学校总务工作计划(附2月-6月安排表行事历)
- 23G409先张法预应力混凝土管桩
- 《幼儿教育政策与法规》教案-单元5 幼儿的权利与保护
- 三年级下册口算天天100题(A4打印版)
- 几种藏文输入法的键盘分布图
- 山西公务员录用审批表
- ASTM-D3330剥离强度测试标准中文版
- 零部件检验卡
评论
0/150
提交评论