C语言函数篇讲解解析
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4.形参:只能是变量,每个形参前要有类型名;当定义的 函数没有形参时叫作“无参函数” ; 形式:类型标识符 函数名() { 声明部分 语句 } 5.函数体:当声明部分和语句都没有时,称为“空函数”, 空函数没有任何实际作用; 形式:类型说明符 函数名( ) { } 例如:dummy( ) { }
例如:
例
三 对被调用函数的声明
函数声明的一般形式: 函数类型 函数名(参数类型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”,&a,&b); c=add(a,b); /*函数调用(函数表达式)*/ printf(“Sum is %f”,c); } float add(float x, float y) {float z; z=x+y; return(z); }
四 程序举例 例1:用函数调用的方法求两个数的和。
float add(float x, float y) { return (x+y); } main() { float a,b,sum; scanf(“%f%f”,&a,&b); sum=add(a,b); printf(“sum=%f”,sum); }
三 函数的返回值
1. 函数通过return语句返回函数的值,若不需要 返回函数值,可以不要return语句。 形式:return (表达式); return (变 量); 括号可省略 return (常 量); 例如:return z;或return 0;或return (a+b); 2. 定义函数时,函数的返回值类型应与return语句 中的表达式类型一致。如果不一致,则以函数 类型为准。
说明:
1. 一个源程序文件由一个或多个函数组成,但必须有且仅 有一个main函数。 2. C程序的执行从main函数开始,调用其他函数后,流程 回到main函数,main函数结束整个函数的运行。 3. 由主函数调用其他函数,其他函数也可互相调用,但 不能调用main函数。同一个函数可以被一个或多个函 数调用任意多次。 4. 从用户角度看,函数分为两种: ① 标准函数:即库函数,由系统提供。 ② 用户自定义函数:用户自己定义的。 5. 从函数形式看,函数分为两种: ①无参函数。 ②有参函数。
第六章 函数
教学目标:掌握函数的定义; 理解并运用函数的
调用; 理解函数的声明。 教学重点:函数的定义; 函数的调用。 教学难点:函数的定义。 教学时数:4学时
6.1 概述
例: printstar( )
{ printf(“******************\n”);} main( ) { printstar( ); printmessage( ); printstar( );} printmessage( ) { printf(“ How do you do!\n”);} 结果: ****************** How do you do! ******************
main() 4.{ 系统将实参数组的首地址传给形参数组 int a[10]; fun(a); 5. 用数组名作函数参数时,形参数组的改变也可以使实 ∶ 参数组随之改变。 }
例2:有一个一维数组score,内放10个学生成绩, 求平均成绩。 float fun(float a[10]); 函数声明 main() { float s[10],ave; float fun(float a[10] ) int i; { int i; for(i=0;i<10;i++) float sum=0,aver; scanf(“%f ”,&s[i]); for(i=0;i<10;i++) sum=sum+a[i]; ave=fun(s); aver=sum/10; printf(“ave=%.2f ”,ave); return aver; } }
6.2 函数定义的一般形式
一 函数定义的一般形式
列表
类型标识符 函数名(类型1 形参1,类型2 形参2,…) { 声明部分 语句 }
二 说明:
1.所有函数在定义时都是互相独立的,即不能嵌套定义; 2.类型标识符:说明了函数返回值的类型,当返回值为 int时,可省略不写; 3.函数名:遵循标识符的命名规则;同一个函数中函数名 必须唯一;
3. 若函数中没有return语句,函数也会带回一个不确定
的值,为了明确表示“不带回值”,用关键字“void” 定义“无类型” (或称“空类型”)。
例:void printstar( ) { printf(“******************\n”); } main( ) { printstar( ); printmessage( ); printstar( );} void printmessage( ) { printf(“ How do you do!\n”); } 这样,系统就保证使函数不带回任何值。
6.5 函数的嵌套调用
C语言不能嵌套定义函数,但可以嵌套调用 函数,即允许在调用一个函数的过程中,又调用 另一个函数。例如: main函数
① ②
a 函数
③ ④
b 函数
⑤ ⑥
调用a函数
⑨ ⑧
调用b函数
⑦
结束
a函数结束
b函数结束
main( ) { int x,y,sum; x=5; y=6; sum=add(x,y); printf(“%d”,sum); } add(int a ,int b) { int z; z=a+fun(b); return z; } 运行结果:
s[0] s[1] s[2] s[3] s[4] s[5] s[6] s[7] s[8] s[9]
a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]
3. 若被调用函数定义出现在主调函数之前,可以 不必声明。 例:float add(float x,float y) {float z; z=x+y; return(z); /*返回z的值*/ } main() {float a,b,c; scanf(“%f,%f”,&a,&b); c=add(a,b); /*接受加法函数的返回值*/ printf(“%f”,c); }
例2:通过函数调用的方式,求三个整数的最大值。 int maxnum(int x, int y, int z) { int m; m=x; if(m<y) m=y; if(m<z) m=z; return m; } main() { int a, b, c, max; scanf(“%d%d%d”,&a,&b,&c) ; max=maxnum(a, b, c); printf(“max=%d”,max); }
Baidu Nhomakorabea
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) {…}
例如:main( ) { int c; c=max(3.5,5+2); printf(“Max is %d”,c);} max(int x, int y) { int z; z=x>y?x:y; return(z);
}
4. 实参变量对形参变量是单向的“值传递” 。即 只能实参传给形参,不能由形参传回来给实参。 在内存中,实参单元与形参单元是不同的单元。 main( ) a 10 20 b { int a=10, b=20; alter(a, b); printf(“a=%d,b=%d\n”,a,b); x 10 20 20 y 10 } alter(int x, int y) 总结:形参的值发生 { int t; 改变,并不能 t=x; x=y; y=t; 影响实参。 }
二. 数组名作函数实参
———传递的是数组的首地址 (此时形参和实参指的是同一内存单元)
fun(int b[ ] ) 1.int 用数组名作函数参数,应该在主调函数和被调函数分 { 别定义数组。 形参还可以写 2. 实参——数组名 形参——数组名或指针变量 ∶
成int b[10]或 3.} 实参数组与形参数组类型应一致。 int b[20]
6.3 函数参数和函数的值
二 关于形参与实参的说明:
1. 未出现函数调用时,形参变量不占内存中的存储 单元。在发生函数调用时,形参才被分配内存单 元。调用结束后,形参所占的内存单元被释放。 2. 实参可以是常量、变量或表达式,必须有确定的 值。在调用时,将实参的值赋给形参变量。 3. 实参与形参的类型应相同或兼容。如果类型不一 致,则将实参转换为和形参类型一致时再赋值。
汉诺塔问题 ( Hanoi)
fun( int t) { return t*t; }
41
6.7 数组作为函数参数
数组元素作函数参数 数组名作函数参数 多维数组名作函数参数
一. 数组元素作函数实参
———与变量作实参一样,是单向值传递
例1:输入一行字符,分别统计出其中大写字母和 小写字母的个数。 #include “stdio.h” int fun(char x ) main() { if(x>= ’ A ’ &&x<= ‘ Z ’ ) {char a[30]; return 1; int i, k=0, p=0; if(x>= ’ a ’ &&x<= ‘ z ’ ) gets(a); return 2; } for(i=0; a[i]!=‘\0’; i++) { if(fun(a[i])==1) k++; if(fun(a[i])==2) p++; } printf(“大写字母个数:%d”, k); printf(“小写字母个数:%d”, p); }
6.4 函数的调用
一 函数调用的一般形式 函数名(实参表列); 函数名(); 无参函数的
调用形式 有参函数的 调用形式
或
说明:1.各实参间用逗号格开。 2.实参与形参的个数应相同,类型应一致。 3.被调用函数必须是已经存在的函数。
二 函数调用的方式 main() { int a=10,b=20,c=30,d,e; 按出现的位置分,有如下三种函数调用方式: ); 1. fun( 函数语句。 d=max(a,b); 函数不带回值,只完成一定的操作。 “max=%d\n”, d); 2. printf( 函数表达式。 e=max(a,b)+c; 要求函数带回确定值,参加表达式运算。 “max=%d\n”, e); 3. printf( 函数参数。 printf( “max=%d\n”,max(a,c)); 要求函数带回确定值,作为一个参数。 } int max(int x, int y) { return (x>y?x;y); } fun() { printf(“***********”);}
返回值 类 型
函数名
形参1
形参2
int max ( int x, int y ) { int z; 声明部分 z=x>y?x:y; 语句(执 return(z); 行部分) }
函数体
一 形式参数和实际参数 实际参数: 调用函数时,函数名后面括弧中的参数称为 “实际参数”(简称实参)。 形式参数:定义函数时,函数名后面括弧中的参数称为 “形式参数”(简称形参)。 例如:main( ) { int a,b,c; scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“Max is %d”,c);} max(int x, int y) { int z; z=x>y?x:y; return(z);}