C语言函数篇讲解.ppt_第1页
C语言函数篇讲解.ppt_第2页
C语言函数篇讲解.ppt_第3页
C语言函数篇讲解.ppt_第4页
C语言函数篇讲解.ppt_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第六章 函数,教学目标:掌握函数的定义; 理解并运用函数的 调用; 理解函数的声明。 教学重点:函数的定义; 函数的调用。 教学难点:函数的定义。 教学时数:4学时,6.1 概述,printstar( ) printf(“*n”); main( ) printstar( ); printmessage( ); printstar( ); printmessage( ) printf(“ How do you do!n”);,例:,结果: * How do you do! *,说明:,1. 一个源程序文件由一个或多个函数组成,但必须有且仅有一个main函数。 2. C程序的执行从main函数开始,调用其他函数后,流程 回到main函数,main函数结束整个函数的运行。 3. 由主函数调用其他函数,其他函数也可互相调用,但 不能调用main函数。同一个函数可以被一个或多个函 数调用任意多次。 4. 从用户角度看,函数分为两种: 标准函数:即库函数,由系统提供。 用户自定义函数:用户自己定义的。 5. 从函数形式看,函数分为两种: 无参函数。 有参函数。,6.2 函数定义的一般形式,一 函数定义的一般形式 列表 类型标识符 函数名(类型1 形参1,类型2 形参2,) 声明部分 语句 二 说明: 1.所有函数在定义时都是互相独立的,即不能嵌套定义; 2.类型标识符:说明了函数返回值的类型,当返回值为 int时,可省略不写; 3.函数名:遵循标识符的命名规则;同一个函数中函数名必须唯一;,形式参数,4.形参:只能是变量,每个形参前要有类型名;当定义的 函数没有形参时叫作“无参函数” ;,形式:类型标识符 函数名() 声明部分 语句 5.函数体:当声明部分和语句都没有时,称为“空函数”, 空函数没有任何实际作用; 形式:类型说明符 函数名( ) 例如:dummy( ) ,例如: int max ( int x, int y ) int z; z=xy?x:y; return(z); ,函数名,返回值类 型,形参1,形参2,声明部分,语句(执行部分),函数体,6.3 函数参数和函数的值,一 形式参数和实际参数 实际参数: 调用函数时,函数名后面括弧中的参数称为 “实际参数”(简称实参)。 形式参数:定义函数时,函数名后面括弧中的参数称为 “形式参数”(简称形参)。 例如:main( ) int a,b,c; scanf(“%d,%d”,二 关于形参与实参的说明:,1. 未出现函数调用时,形参变量不占内存中的存储 单元。在发生函数调用时,形参才被分配内存单 元。调用结束后,形参所占的内存单元被释放。 2. 实参可以是常量、变量或表达式,必须有确定的 值。在调用时,将实参的值赋给形参变量。 3. 实参与形参的类型应相同或兼容。如果类型不一 致,则将实参转换为和形参类型一致时再赋值。 例如:main( ) int c; c=max(3.5,5+2); printf(“Max is %d”,c); max(int x, int y) int z; z=xy?x:y; return(z); ,4. 实参变量对形参变量是单向的“值传递” 。即只能实参传给形参,不能由形参传回来给实参。 在内存中,实参单元与形参单元是不同的单元。 main( ) int a=10, b=20; alter(a, b); printf(“a=%d,b=%dn”,a,b); alter(int x, int y) int t; t=x; x=y; y=t; ,10,20,a,b,x,y,10,20,20,10,总结:形参的值发生 改变,并不能 影响实参。,三 函数的返回值,1. 函数通过return语句返回函数的值,若不需要 返回函数值,可以不要return语句。 形式:return (表达式); return (变 量); return (常 量); 例如:return z;或return 0;或return (a+b); 2. 定义函数时,函数的返回值类型应与return语句 中的表达式类型一致。如果不一致,则以函数 类型为准。,括号可省略,3. 若函数中没有return语句,函数也会带回一个不确定 的值,为了明确表示“不带回值”,用关键字“void” 定义“无类型” (或称“空类型”)。 例:void printstar( ) printf(“*n”); main( ) printstar( ); printmessage( ); printstar( ); void printmessage( ) printf(“ How do you do!n”); 这样,系统就保证使函数不带回任何值。,6.4 函数的调用,一 函数调用的一般形式 函数名(实参表列); 或 函数名(); 说明:1.各实参间用逗号格开。 2.实参与形参的个数应相同,类型应一致。 3.被调用函数必须是已经存在的函数。,有参函数的调用形式,无参函数的调用形式,二 函数调用的方式,按出现的位置分,有如下三种函数调用方式: 1. 函数语句。 函数不带回值,只完成一定的操作。 2. 函数表达式。 要求函数带回确定值,参加表达式运算。 3. 函数参数。 要求函数带回确定值,作为一个参数。,例,main() int a=10,b=20,c=30,d,e; fun( ); d=max(a,b); printf(“max=%dn”, d); e=max(a,b)+c; printf(“max=%dn”, e); printf(“max=%dn”,max(a,c); int max(int x, int y) return (xy?x;y); fun() printf(“*”);,三 对被调用函数的声明,函数声明的一般形式: 函数类型 函数名(参数类型1,参数类型2, ); 例: int max(int, int); 或 int max(int x, int y); 说明: 1.使用用户定义函数时,要对函数进行声明。 2.如果函数的返回值类型为int,可以不用声明。,例:,main( ) float add(float x, float y); /*对被调函数声明*/ float a,b,c; scanf(“%f,%f”, ,3. 若被调用函数定义出现在主调函数之前,可以 不必声明。 例:float add(float x,float y) float z; z=x+y; return(z); /*返回z的值*/ main() float a,b,c; scanf(“%f,%f”, ,4. 若在函数定义之前, 在函数的外部已做了函数 声明,则在各个主调函数中不必对所调用的函 数再作声明。 例: char letter(char,char); float f(float,float); int i(float,float); main() char letter(char c1,char c2) float f(float x,float y) int i(float j,float k) ,四 程序举例,例1:用函数调用的方法求两个数的和。,float add(float x, float y) return (x+y); main() float a,b,sum; scanf(“%f%f”, ,例2:通过函数调用的方式,求三个整数的最大值。,int maxnum(int x, int y, int z) int m; m=x; if(my) m=y; if(mz) m=z; return m; main() int a, b, c, max; scanf(“%d%d%d”, ,a 函数 调用b函数 a函数结束,main函数 调用a函数 结束,b 函数 b函数结束,6.5 函数的嵌套调用,C语言不能嵌套定义函数,但可以嵌套调用函数,即允许在调用一个函数的过程中,又调用另一个函数。例如:,main( ) int x,y,sum; x=5; y=6; sum=add(x,y); printf(“%d”,sum); 运行结果: 41,fun( int t) return t*t; ,add(int a ,int b) int z; z=a+fun(b); return z; ,汉诺塔问题 ( Hanoi),6.7 数组作为函数参数,数组元素作函数参数 数组名作函数参数 多维数组名作函数参数,一. 数组元素作函数实参,与变量作实参一样,是单向值传递,例1:输入一行字符,分别统计出其中大写字母和 小写字母的个数。,#include “stdio.h” main() char a30; int i, k=0, p=0; gets(a); for(i=0; ai!=0; i+) if(fun(ai)=1) k+; if(fun(ai)=2) p+; printf(“大写字母个数:%d”, k); printf(“小写字母个数:%d”, p); ,int fun(char x ) if(x=A ,二. 数组名作函数实参,传递的是数组的首地址 (此时形参和实参指的是同一内存单元),1. 用数组名作函数参数,应该在主调函数和被调函数分 别定义数组。 2. 实参数组名 形参数组名或指针变量 3. 实参数组与形参数组类型应一致。 4. 系统将实参数组的首地址传给形参数组 5. 用数组名作函数参数时,形参数组的改变也可以使实 参数组随之改变。,例,int fun(int b ) main() int a10; fun(a); ,形参还可以写成int b10或int b20,例2:有一个一维数组score,内放10个学生成绩, 求平均成绩。,float fun(float a10); main() float s10,ave; int i; for(i=0;i10;i+) scanf(“%f ”, ,float fun(float a10 ) int i; float sum=0,aver; for(i=0;i10;i+) sum=sum+ai; aver=sum/10; return aver; ,函数声明,s0 s1 s2 s3 s4 s5 s6 s7 s8 s9,a0 a1 a2 a3 a4 a5 a6 a7 a8 a9,sn和an指的是同一单元。,例3:编写函数,用选择排序对数组中的10个数按 由小到大排序。,main() int a10, i; for(i=0; i10; i+) scanf(“%d”, ,void fun(int b ) int i, j, k, t; for(i=0; iaj) k=j; if(k!=i) t=ai; ai=ak; ak=t; ,三. 用多维数组名做函数参数,int fun1(int b 4) int fun2(int c34) main() int a34; fun(a); fun(a); ,局部变量:在一个函数内部定义的变量。 有效范围:只在本函数范围内有效。 全局变量:在函数外部定义的变量(又叫外部变 量)。 有效范围: 从定义变量的位置开始到本源文件结 束,可以为本文件其他函数所共用。,6.8 局部变量和全局变量,变量按其作用域分类可分为局部变量和全局变量。,局部变量: float f1(int a) /*函数f1 */ int b , c; char f2(int x , int y ) /* 函数f2 */ int i , j ; main( ) /*主函数 */ int m , n ; ,a,b,c 有效,x, y , i , j 有效,m , n 有效,有效范围:只在本函数范围内有效。,说明:,1. 函数内部定义的变量(局部变量) , 只在该函数范 围内有效。(main主函数也不例外) 一个函数不能使用其他函数中定义的变量. 2. 不同函数中可以使用相同名字的变量,它们代表 不同的对象,互不干扰。 3. 形式参数也是局部变量。 4. 可以在复合语句中定义变量, 这些变量只在复合 语句中有效。,例,main() int a,b; : int c; c=a+b; : : ,局部变量c的作用范围,局部变量 a、 b 的 作用范围,全局变量: int p=1,q=5; float f1(int a) char c1,c2; char f2(int x , int y ) main( ) /*主函数*/ int m,n; ,全局变量 c1, c2 的 作用范围,全局变量p, q的作用范围,有效范围: 从定义变量的位置开始到本源文件结束,可以为本文件其他函数所共用。,注意:,当局部变量和全局变量重名时,则在局部变量的作用范围内,全局变量不起作用。,int p=1,q=5; float fun(int a) int p; main( ) /*主函数*/ int m,n; ,全局变量 p 的作用 范围,全局 变量 q的 作用 范围,局部变量 p 的作用 范围,6.9 用static声明局部变量,有时希望函数中的局部变量的值,在调用结束后不消失,而保留原值。即其占用的存储单元不释放,下次调用该函数时,该变量已有值(上一次调用结束时的值)。这时应定义该局部变量为“局部静态变量”,用static加以声明。,f(int a) auto b=0;static c=3; b=b+1;c=c+1; return(a+b+c); main( ) int a=2, i ; for(i=0;i3;i+)printf(“%d”,f(a); 运行结果为 7 8 9,例:,0,4,4,0,1,3,b c,第一次调用开始,第一次调用结束,第二次调用开始,第二次调用结束,5,1,对局部静态变量的4点说明:,1、局部静态变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变量(局部动态变量)属于动态存储类

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论