(1)指定函数的名字,以便以后按名调用。
(2)指定函数的类型,即函数返回值的类型。
(3)指定函数的参数的名字和类型,以便在调用函数时向它们传递数据。对无参函数不需要这项。
(4)指定函数应当完成什么操作,也就是函数是做什么,即函数的功能。这是最重要的,是在函数体中解决的。
2、定义函数的方法 (1)定义无参函数类型名 函数名(){
函数体
}
或
类型名 函数名(void){
函数体
}
#include
int main(){
void print_star();
void print_message();
print_star();
print_message();
print_star();
return 0;
}
void print_star(){
printf("*******************n");
}
void printf_message(){
printf("Hello,world!n");
}
执行结果:
*******************
Hello,world!
*******************
(2)定义有参函数
以下定义的max函数是有参函数:
类型名 函数名(形式参数表列){
函数体
}
int max(int x,int y){
int z;
z=x>y?x:y;
return(z);
}
(3)定义空函数
类型名 函数名(){
}
例如:
void dummy(){
}
3、调用函数
(1)函数调用的形式
函数调用的一般形式为 函数名(实参表列) print_star(); //调用无参函数 c=max(a,b); //调用有参函数(2)函数调用语句
把函数调用单独作为一个语句,不要求函数带回值,只要求函数完成一定的操作。例如:
print_start();(3)函数表达式
函数调用出现在另一个表达式中,如“c=max(a,b);”,max(a,b)是一次函数调用,它是赋值表达式中的一部分。这时要求函数带回一个确定的值以参加表达式的运算。例如:
c=2*max(a,b);(4)函数参数
函数调用作为另一个函数调用时的实参。例如:
m=max(a,max(b,c));4、函数调用时的数据传递 (1)形式参数和实际参数
在调用有参函数时,主调函数和被调用函数之间有数据传递关系。从前面已知:在定义函数时函数名后面括号中的变量名称为“形式参数”(简称“形参”)或“虚拟参数”。在主调函数中调用一个函数时,函数名后面括号中的参数称为“实际参数”(简称“实参”)。实际参数可以是常量、变量或表达式。
(2)实参和形参间的数据传递在调用函数过程中,系统会把实参的值传递给被调用函数的形参。
例题1:输入两个整数,要求输出其中值较大者。要求用函数来找到大数。#include(3)函数的返回值int max(int x,int y){ int z; z=x>y?x:y; return(z); } int main(){ int max(int x,int y); int a,b,c; printf("请输入两个整数:"); scanf("%d%d",&a,&b); c=max(a,b); printf("max is %dn",c); return 0; } 执行结果: 请输入两个整数:18 48 max is 48
①函数的返回值是通过函数中的return语句获得的。
②函数值的类型
③在定义函数时指定的函数类型一般应该和return语句中的表达式类型一致,即函数类型决定返回值的类型。
④对于不带回的函数,应当用定义函数为“void类型”(或称“空类型”)
5、函数的嵌套调用 例题2:输入4个整数,找出其中最大的数。用函数的嵌套来处理。#include6、函数的递归调用int main(){ int max4(int a,int b,int c,int d); int a,b,c,d,max; printf("请输入4个数字:"); scanf("%d%d%d%d",&a,&b,&c,&d); max=max4(a,b,c,d); printf("max is %dn",max); return 0; } int max4(int a,int b,int c,int d){ int max2(int a,int b); int m; m=max2(a,b); m=max2(m,c); m=max2(m,d); return m; } int max2(int a,int b){ if(a>=b){ return a; } else return b; } 执行结果: 请输入4个数字:43 65 6 8 max is 65
在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。
例题3:用递归方法求n!#include例题4:汉诺塔问题int main(){ int fac(int n); int n,y; printf("请输入求阶乘的数:"); scanf("%d",&n); y=fac(n); printf("%d!=%dn",n,y); return 0; } int fac(int n){ int f; if(n<0){ printf("n<0,data Error!"); } if(n==0 || n==1){ f=1; } else{ f=fac(n-1)*n; } return f; } 执行结果: 请输入求阶乘的数:10 10!=3628800
#include7、一维数组名作函数参数 例题5:有一个一维数组score,内放置10个学生成绩,求平均成绩int main(){ void hanoi(int n,char one,char two,char three); int m; printf("请输入盘子数:"); scanf("%d",&m); printf("%d个盘子移动情况:n"); hanoi(m,'A','B','C'); return 0; } void hanoi(int n,char one,char two,char three){ void move(char x,char y); if(n==1){ move(one,three); } else{ hanoi(n-1,one,three,two); move(one,three); hanoi(n-1,two,one,three); } } void move(char x,char y) { printf("%c->%cn",x,y); }
#include8、多维数组名作函数参数 例题6:有一个3×4的矩阵,求所有元素中的最大值int main(){ float average(float array[10]); float score[10],aver; int i; printf("请输入10名学生的成绩:n"); for(i=0;i<=9;i++){ scanf("%f",&score[i]); } aver=average(score); printf("average score is %5.2fn",aver); return 0; } float average(float array[10]){ int i; float aver,sum=0; for(i=0;i<=9;i++){ sum+=array[i]; } aver=sum/10; return aver; } 执行结果: 请输入10名学生的成绩: 100 56 78 98 67.5 99 54 88.5 76 58 average score is 77.50
#includeint main(){ int max(int array[][4]); int a[3][4]={{1,3,5,7},{2,4,6,8},{12,13,17,14}}; printf("max value is %dn",max(a)); return 0; } int max(int array[][4]){ int i,j,max; max=array[0][0]; for(i=0;i<3;i++){ for(j=0;j<4;j++){ if(array[i][j]>max){ max=array[i][j]; } } } return max; } 执行结果: max value is 17



