定义:函数是完成特定功能的独立代码模块,遵循 “输入 - 处理 - 输出” 的逻辑模型,类似数学中的函数概念y = f(x)。
作用:避免重复编写相同逻辑(如多次计算最大值时只需定义一次函数)。
(1)函数名
与变量一致(字母、数字、下划线,不能以数字开头),需直观体现功能(如calculateAverage表示计算平均值)。
(2)参数列表
输入数据的载体,可包含 0 个或多个参数,每个参数需指定类型(如int a, float b)。
(3)返回值
函数执行后的输出结果,通过return语句返回,类型由函数定义时指定(如int、float、void)。
注意:返回值类型必须与函数定义一致,否则会强制转换(可能导致精度损失或警告)。
(1)无参数无返回值函数
格式:void 函数名() { 函数体; }
(2)有参数有返回值函数
格式:返回值类型 函数名(参数类型1 参数名1, 参数类型2 参数名2) { 函数体; return 表达式; }
(3)空函数(占位函数)
格式:void 函数名() { }
作用:在程序设计阶段为规划的功能预留位置,后续再填充代码(如void futureFunction() { })。
(4)函数调用的规则
调用格式:函数名(实参列表);
示例:int sum = add(5, 3);
(1)值传递
本质:实参将值复制给形参,形参与实参占用不同内存空间,修改形参不影响实参。
(2)局部变量
作用域:仅在函数内部可见,函数调用结束后内存自动释放。
示例:void func() { int x = 10; }(x仅在func内有效)。
(1)函数嵌套调用
定义:一个函数调用另一个函数,形成多层调用结构。
案例:四数最大值
#include
int compare_2(int m,int n);
int compare_1(int data_1,int data_2,int data_3,int data_4)
{
int big_1;
big_1=compare_2(data_1,data_2);
big_1=compare_2(big_1,data_3);
big_1=compare_2(big_1,data_4);
return big_1;
}
int compare_2(int m,int n)
{
int big_2;
big_2=m>n?m:n;
return big_2;
}
int main()
{
int a,b,c,d;
int max;
printf("请输入四个数:\n");
scanf("%d%d%d%d",&a,&b,&c,&d);
max=compare_1(a,b,c,d);
printf("最大值为:%d\n",max);
return 0;
}
(2)函数递归调用
定义:函数直接或间接调用自身,需设置终止条件避免无限递归。
案例:计算 n 的阶乘(n! = n×(n-1)!)
#include
int jiecheng(int n)
{
int ret;
if(n==1)
ret=1;
else
ret=jiecheng(n-1)*n;
return ret;
}
int main()
{
int num,jie;
printf("请输入要算的阶数:\n");
scanf("%d",&jie);
num=jiecheng(jie);
printf("阶乘大小为:%d\n",num);
return 0;
}
(3)数组作为函数参数
本质:传递数组首元素地址(指针),函数可通过地址访问和修改数组元素(共享内存)。
案例:计算数组平均值
#include
void initarry(int arry[][4],int line,int row)
{
int i,j;
for(i=0;i<line;i++)
{
for(j=0;j<row;j++)
{
printf("请输入第%d行,第%d列的数据:\n",i+1,j+1);
scanf("%d",&arry[i][j]);
}
}
printf("输入完毕!\n\n");
}
void printfarry(int arry[][4],int line,int row)
{
int i,j;
for(i=0;i<line;i++)
{
for(j=0;j<row;j++)
{
printf("%d ",arry[i][j]);
}
printf("\n");
}
printf("\n");
}
int getmax(int arry[][4],int line,int row)
{
int i,j;
int max;
for(i=0;i<line;i++)
{
for(j=0;j<row;j++)
{
if(max<arry[i][j])
max=arry[i][j];
}
}
return max;
}
int main()
{
int max;
int arry[3][4];
initarry(arry,3,4);
printf("二维数组为:\n");
printfarry(arry,3,4);
max=getmax(arry,3,4);
printf("最大值为:%d\n",max);
return 0;
}
(4)两数最大值函数
#include
int compare(int m,int n)
{
int big;
if(m>n)
big=m;
else
big=n;
return big;
}
int main()
{
int x,y,z;
printf("请输入两个数:\n");
scanf("%d%d",&x,&y);
z=compare(x,y);
printf("两个数为:%d,%d,较大的数为:%d\n",x,y,z);
return 0;
}
(5)班级平均分计算(数组传参)
#include
void initclass(int arry[],int len)
{
int i;
for(i=0;i<len;i++)
{
printf("学生%d:\n",i+1);
scanf("%d",&arry[i]);
}
printf("输入完毕!\n");
}
void outputclass(int arry[],int len)
{
int i;
printf("总人数有%d人!\n分数分别为:",len);
for(i=0;i<len;i++)
{
printf("%d ",arry[i]);
}
printf("\n\n");
}
float getaverage(int arry[],int len)
{
float average=0.0;
int i,sum=0;
for(i=0;i<len;i++)
{
sum=sum+arry[i];
}
average=(float)sum/len;
}
int main()
{
int class_1[5];
int class_2[8];
int len_1,len_2;
float average_1,average_2;
len_1=sizeof(class_1)/sizeof(class_1[0]);
len_2=sizeof(class_2)/sizeof(class_2[0]);
printf("请输入一班学生的成绩!\n");
initclass(class_1,len_1);
outputclass(class_1,len_1);
printf("请输入二班学生的成绩!\n");
initclass(class_2,len_2);
outputclass(class_2,len_2);
average_1=getaverage(class_1,len_1);
average_2=getaverage(class_2,len_2);
printf("一班学生平均分为:%.2f\n",average_1);
printf("二班学生平均分为:%.2f\n",average_2);
return 0;
}
找 10 个数的最大值及下标、封装冒泡排序函数
#include
void initnum(int arry[],int len)
{
int i;
printf("请输入10个数:\n");
for(i=0;i<len;i++)
{
scanf("%d",&arry[i]);
}
}
void sortnum(int arry[],int len)
{
int i,j,temp;
for(i=0;i<len-1;i++)
{
for(j=0;j<len-1-i;j++)
{
if(arry[j]>arry[j+1])
{
temp=arry[j];
arry[j]=arry[j+1];
arry[j+1]=temp;
}
}
}
}
int getmax(int arry[],int len)
{
int i,max,grid;
max=arry[0];
for(i=0;i<len;i++)
{
if(max<arry[i])
{
max=arry[i];
grid=i+1;
}
}
printf("\n最大值为:%d,排在第%d个",max,grid);
return max;
}
int main()
{
int i;
int max;
int arry[10];
initnum(arry,10);
printf("排序前为:\n");
for(i=0;i<10;i++)
{
printf("%d ",arry[i]);
}
max=getmax(arry,10);
sortnum(arry,10);
printf("\n排序后为:\n");
for(i=0;i<10;i++)
{
printf("%d ",arry[i]);
}
return 0;
}