函数定义的一般形式
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
声明部分: int z; 说明函数内部用到的变量。 语句部分: if ... 说明函数的功能 return(z) 返回函数的结果
7Hale Waihona Puke Baidu
第八章 函数
函数的返回值
1、函数的返回值是通过函数中的return语句获得的。 一个函数中可以有一个以上的return语句。只有一个起作用。 2、return (z); return z;
例 无返回值函数 void swap(int x,int y) { int temp; temp=x; x=y; y=temp; }
printstar( ) { printf("**********"); } main( ) { int a; a=printstar( ); printf("%d",a); }
x 1 2 y x 2
a a[0]
1 2
a a[0] a[1]
1
2
a 1 2 返回
a[1]
调用前
调用
1 y 交换
20
例 数组元素与数组名 作函数参数比较 (数组名作为参数)
地址传递
void swap( int *x ) { int z; z=*(x+0); x[0]=x[1]; x[1]=z; } main( ) { int a[2]={1,2}; swap(a); printf("a[0]=%d\na[1]=%d\n",a[0],a[1]); }
25
float max,min; float average(float array[], int n) { int i; float sum=array[0]; max=min=array[0]; for(i=1;i<n;i++) { if(array[i]>max) max=array[i]; else if(array[i]<min) min=array[i]; sum+=array[i]; } return(sum/n); } main() { int i; float ave,score[10]; /*Input */ ave=average(score,10); printf("max=%6.2f\nmin=%6.2f\n average=%6.2f\n",max,min,ave); }
定义:在函数外定义的变量 有效范围:从定义变量的位置开始到本源文件结束 应尽量少使用全局变量
23
float f1(int a) { int b,c; ……. }
int p=1,q=5; a,b,c有效 float f1(int a) { int b,c; ……. } int f3 ( ) {….. } char c1,c2; char f2(int x,int y) { int i,j; …… } main ( ) { int m,n; ……. }
a x a 2 1 交换 2 1 返回
a 1 2 调用前
a x
1 2 调用
21
例 (数组名作函数参数)求学生的平均成绩
int stu[ ]
#include <stdio.h> float average(int stu[10],int n) float average(int stu[10], int n); { int i; void main() float av,total=0; { int score[10], i; for( i=0; i<n; i++ ) float av; total += stu[i]; printf("Input 10 scores:\n"); av = total/10; for( i=0; i<10; i++ ) return av; scanf("%d", &score[i]); } av=average(score,10); stu score printf("Average is:%.2f", av); 0 12 }
分类
从用户使用的角度看:标准函数和用户自定义函数 从函数的形式看:无参函数和有参函数
4
第八章 函数
(一)、举例
(二)、函数的定义
5
第八章 函数
先来看一个函数使用的例子
输入两个数,输出最大值。(判断的两个数的最大值用函数)
int max(int a,int b); 函数调用 main() {int a,b,c; c=max(a,b); printf(“The max is %d”,c); } int max(int x,int y) {int z; if (x>y) z=x; else z=y; return(z); }
a函数 调用函数b
b函数
16
例
求三个数中最大数和最小数的差值 int dif(int x,int y,int z) int dif(int x,int y,int z); { return max(x,y,z)-min(x,y,z) int max(int x,int y,int z); } int min(int x,int y,int z); void main() { int a,b,c,d; scanf("%d%d%d",&a,&b,&c); d=dif(a,b,c); printf("Max-Min=%d\n",d); }
18
void main() { int n; float y; printf("input a inter numer:"); scanf("%d",&n);
y=fac(n);
printf("%d! =%15.0f\n",n,y); }
数组元素作函数实参
值传递
数组名作函数参数
地址传递 在主调函数与被调函数分别定义数组,且类型应一致 形参数组大小(二维数组的第一维)可不指定 形参数组名是地址变量
24
char f2(int x,int y) { int i,j; x,y,i,j有效 …… } main() { int m,n; ……. }
p,q的作用范围
m,n有效
c1,c2的作用范围
例 不同函数中同名变量(局部变量)
main( ) {int a,b; a=3; b=4; printf("main:a=%d,b=%d\n",a,b); sub(); printf("main:a=%d,b=%d\n",a,b); } sub( ) 运行结果: main:a=3,b=4 { int a,b; sub:a=6,b=7 a=6; main:a=3,b=4 b=7; printf("sub:a=%d,b=%d\n",a,b); }
3、如果函数值的类型和return语句中表达式的值不一致,则以函数类 型为准。
4、如果被调用函数中没有return语句,一般表示此函数完成一定操作, 并不带回任何值。
5、为了明确表示“不带回值”,可以用“void”定义“无类型”。
8
函数参数——形参与实参
形参:定义函数时函数名后面括号中的变 量名 实参:调用函数时函数名后面括号中的表 达式 说明:
1 2 .
23
.
22
56 …. …. 88
9
局部变量
定义:在函数内定义,只在本函数内有效 说明: main中定义的变量只在main中有效 不同函数中同名变量,占不同内存单元 形参属于局部变量 局部变量可用存储类型:auto register static (默认为auto)
全局变量---外部变量
19
void swap( int x,int y ) 例 数组元素与数组名 { int z; 作函数参数比较 z=x; x=y; y=z; (数组元素作为参数) } main( ) { int a[2]={1,2}; 值传递 swap(a[0],a[1]); printf("a[0]=%d\na[1]=%d\n",a[0],a[1]); }
float fac(int x) {int i; float t=1; for (i=1;i<=x;i++) t=t*i; return(t); } 15
input m,n:5 3 The result is 10.0
嵌套调用 C规定:函数定义不可嵌套,但可以嵌套调用函数。
main( )
调用函数a 结束
正确。函数printstar()没有说 明类型表示整型,在main()中, 语句a=printstar( );执行
void printstar( ) { printf("**********"); } main( ) { int a; a=printstar( ); printf("%d",a); }
main( ) 调用函数dif 输出 结束
int max(int x,int y,int z) { int r; r=x>y?x:y; return(r>z?r:z); }
dif函数
调用函数max 调用函数min
int min(int x,int y,int z) max函数 { int r; r=x<y?x:y; return(r<z?r:z); min函数 }
main() 函数调用 {int a,b,c; c=max(a,b); printf(“The max is %d”,c); }
12
第八章 函数
实际参数与形式参数的关 系 对应关系
个数对应 顺序对应 类型对应(类型相同或赋值相容)
传递关系
实参传递给形参 值传递(单向传递)
13
第八章 函数
对被调用函数的声明和函数原型 标准函数
14
第八章 函数
举例
C(m,n)=m!/(n!*(m-n)!) (m>n)
main() {float c; int m,n; float fac(int x); printf(“input m,n:”); scanf(“%d%d”,&m,&n); c=fac(m)/(fac(n)*fac(m-n)); printf(“The result is %8.1f”,c); }
函数外使用#include调用有关库函数。 #include <stdio.h> #include <math.h>
用户自定义函数
P153
1。当函数定义出现在函数调用之后时,在主调函数中,采用函 数原型对被调用函数进行声明。 2。在以下情况下可不用进行函数声明。 • 函数定义出现在函数调用之前 • 函数定义出现在函数调用之后,但函数类型为整形 • 在所有函数定义之前,在函数外部做了函数声明,则在主调 函数中不必对所调用的函数再作声明。
函数调用,因为在函数 定义时没有定义返回值, 所以返回一个随机整数。 运行结果: **********10 11
错误!在编译时将提 示下列信息: cannot convert from 'void' to 'int‘ 即不能将‘void’转换为 ‘int’
第八章 函数
格式
函数名(实参列表 )
方式
1。函数语句 printstar(); 2。函数表达式 c=a*max(a,b); 3。函数参数 m=max(a,max(b,c))
函数的返回值
返回语句
形式: return (表达式); 或 return 表达式 ; 说明: 函数中可有多个return语句 若函数类型与return语句中表达式值的类型不一致,自动转换为函 数类型------函数调用转换 函数返回值类型 缺省 int 型 函数无返回值 void型
10
举例
6
函数定义
第八章 函数
格式
类型标识符 函数名(形参列表 ) {声明部分 语句部分}
函数首部 int max(int x,int y) {int z; if (x>y) return x ; else return y; }
int: 函数类型 max:函数名 int x,int y: 形参及其定义
函数体
1
第八章 函数
一、概述
二、函数定义的一般形式
三、函数参数和函数的值 四、函数调用
五、函数的嵌套调用 七、数组作为函数的参数 量 六、函数的递归调用 八、局部变量和全局变
2
C程序
源程序文件1
源程序文件i
源程序文件n
C程序结构
预编译命令 函数1 函数n
说明部分
执行部分
3
第八章 函数
基本概念
一个C程序可由一个主函数和若干个函数构成。 由主函数调用其他函数。 其他函数可以相互调用。 同一函数可以被一个或多个函数调用任意多次。
(1)形参在函数被调用前不占内存; (2)函数调用时为形参分配内存 ; 调用结束,释放内存 (3)实参可以是常量、变量或表达式 (4)在被定义的函数中,必须指 定形参的类型 (5)形参与实参类型一致,个数相同 (6)若形参与实参类型不一致, 自 动按形参类型转换(函数调 用 转换) (7)实参对形参与进行“值传递” 9 (8)形参与实参占用不同的内
17
在调用一个函数的过程中又出现直接或间接地调用该函数本身,成为 函数的递归调用。 举例:用递归方法求n!。 float fac(int n) { float f; if(n<0){printf("n<0,dataerror!");f=1;} else if(n==0 || n==1) f=1; else f=fac(n-1)*n; return (f); }