C语言函数以及函数的调用
m=max(a,max(b,c));
对被调用函数的声明和函数原型
❖对被调用函数要求:
必须是已存在的函数(库函数或用户自定义函数) 库函数: #include <*.h> 用户自定义函数:在同一文件中,并且主调在被调之前,一般在
主调函数中对被调用的函数原型声明。
函数原型声明一般形式: : 函数类型 函数名(参数类型 [参数名],….. );
形参与实参
❖形式参数:定义函数时函数名后面括号中的变量名 ❖实际参数:调用函数时函数名后面括号中的表达式
例 比较两个数并输出大者 main()
{ int a,b,c;
scanf("%d,%d",&a,&b);
c=max(a,b); (main 函数) c=max(a,b);
max(int x, int y) (max 函数) printf("Max is %d",c);
预编译命令
函数1
函数n
说明部分 执行部分
C程序结构 C是函数式语言 必须有且只能有一个名为main的主函数 C程序的执行总是从main函数开始,在main中结束 函数不能嵌套定义,可以嵌套调用
函数分类
❖从用户角度
标准函数(库函数):由系统提供 用户自定义函数
❖从函数形式
无参函数 有参函数
运行结果 a[0]=2,a[1]=4 a[0]=2,a[1]=4
例 两个数组大小比较
#include <stdio.h>
main()
{ int a[10],b[10],i,n=0,m=0,k=0;
int large(int x,int y)
int型函数可不作函数说明
{}reftluorant(zz;);
} z=x>y?x:y;
return(z);
}
§6.4 函数的嵌套与递归调用
嵌套调用
C规定:函数定义不可嵌套,但可以嵌套调用函数 在被调函数中又调用了其他函数
main( ) 调用函数a 结束
a函数
调用函数b
b函数
f( )
f1( )
f2( )
调f
调f2
调f1
例 求n的阶乘
n!
1 n
(n
1)!
(n 0,1) (n 1)
请问是否会进 入死循环?
#include <stdio.h> int fac(int n) { int f;
if(n<0) printf("n<0,data error!"); else if(n==0||n==1) f=1; else f=fac(n-1)*n; return(f); } main() { int n, y; printf("Input a integer number:"); scanf("%d",&n); y=fac(n); printf("%d! =%15d",n,y); }
printstar( )
{ printf("**********************\n"); } print_message( ) /*print_message函数*/ { printf(“This is a C function!\n”); }
C是模块化程序设计语言
C程序
源程序文件1 源程序文件i 源程序文件n
使用库函数应注意: 1、函数功能 2、函数参数的数目和顺序,及各参数意义和类型 3、函数返回值意义和类型 4、需要使用的包含文件
§6.2 函数的定义
一般格式
函数返回值类型 缺省int型
无返回值void
现代风格:
类型说明符 函数名(参数列表)
{ 说明语句部分; 可执行语句部分;
}
合法标识符 Void或形参 函数体
a=printstar(); printf("%d",a); }
输出:10
void printstar() { printf("**********"); } main() { int a;
a=printstar(); printf("%d",a); }
编译错误!
例 函数返回值类型转换
输入:1.5,2.5
例 求三个数中最大数和最小数的差值
#include <stdio.h>
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);
输出:Max is 2
main() { float a,b;
int c; scanf("%f,%f",&a,&b); c=max(a,b); printf("Max is %d\n",c); } max(float x, float y) { float z; z=x>y?x:y; return(z); }
int f(int x) { int y,z;
…… z=f(y); ……. return(2*z); }
int f1(int x) { int y,z;
…… z=f2(y); ……. return(2*z); }
int f2(int t) { int a,c;
…… c=f1(a); ……. return(3+c); }
例或例{p{pi{}rnri例intppnzr无i{}t有mrren=tisiisntttnnxua参zrta参t有amtte>xr=riff例zrnnt({(((y函x(ua;d函vi参t““(?n>xrz)uo**z}nx数t()y数mi**;函i;空(:dx?ny**zm,xt());**数函;y:xy**y)现,(**(;数in**)代t**现y**风)**代\\nn函格风””))数);;格体}})为空
float add( float x, float y);
被调函数出现在主调函数 之前,不必函数说明
floaptsrcainadntdff(("f"lM%oaaftx,%xi,sff"%l,o&adat\n,y&"),bc);
{} flco=aatdzd;(a,b); mza=xp(xrfi+lnoytaf;(t"xs,ufmloiast %y)f",c);
{ int z;
}
z=x>y?x:y; return(z); }
max(int x, int y) { int z;
z=x>y?x:y;
return(z);
}
实参 形参
❖说明:
实参可以是常量、变量或表达 式,它们都必须有确定的值
形参必须指定类型
形参与实参类型顺序一致,个 数相同
形参在函数被调用前不占内存; 函数调用时为形参分配内存;调 用结束,内存释放
int max(int x,int y,int z)
int min(int x,int y,int z);
{ int r;
void main()r=xy?x:y;{ int a,b,c,d;
return(r>z?r:z);
scanf("%d%d%d",&a,&b,&c); }
d=dif(a,b,c);
若无return语句,遇}时,自动返回调用函 数
若函数类型与return语句中表达式值的类 型不一致,按前者为准,自动转换------函 数调用转换
不返回函数值的函数,可明确定义为“空 类型”,即void型函数
例 函数带回不确定值
printstar() { printf("**********"); } main() { int a;
❖开发方法: 自上向下,逐步分解,分而治之
main( ) {…
sub1(); … sub2(); … }
sub1( ) {…
}
sub2( ) {…
}
【例6.1】简单的函数调用 main( ) {printstar( );
print_message( ); printstar( ); }
运行结果如下: ********************** This is a C function! **********************
§6.5 数组作为函数参数
数组元素作函数实参——值传递
例 #include <stdio.h> swap( int x, int y) { int t; t=x;x=y;y=t; } main() { int a[2]={2,4} printf("\na[0]=%d,a[1]=%d\n“,a[0],a[1]); swap(a[0],a[1]); printf("\na[0]=%d,a[1]=%d\n“,a[0],a[1]); }
p=f(i, i++); printf("%d",p); } int f(int a, int b) { int c; if(a>b) c=1; else if(a==b) c=0; else c=-1; return(c); }
运行结果:1
调用方式
❖函数语句:把函数调用作为一个语句。 例 printstar();
第6章 函数
➢教学目标
§1.熟练掌握函数的定义和使用方法,灵活定 义与使用函数,掌握函数的嵌套调用和递归 调用;