一、为什么要用函数
1、避免代码冗长
2、模块化的设计思路
3、按功能划分,每个函数代表一个功能
二、函数要先定义再使用
1、函数三要素
函数名,参数列表,返回值
2、函数的封装和调用
3、形参与实参区别
传递参数,传递的是值,形参与实参值相同但是内存地址不同
三、函数调用的条件:
1、函数已被定义
2、调用库函数
3、函数的声明
四,函数的嵌套
#include<stdio.h>
int getBiggerData(int x,int y)
{
int bigger;
bigger=x>y?x:y;
return bigger;
}
int getBiggestData(int a,int b,int c,int d)
{
int max;
max=getBiggerData(a,b);
max=getBiggerData(max,c);
max=getBiggerData(max,d);
return max;
}
int main()
{
int a,b,c,d;
int tbo;
puts("input four nums");
scanf("%d%d%d%d",&a,&b,&c,&d);
tbo=getBiggestData(a,b,c,d);
printf("the biggest is %d\n",tbo);
return 0;
}
五、函数的递归
求阶乘
#include<stdio.h>
int getJieCheng(int num)
{
int result;
if(num==1)
{
result=1;
}
else
{
result=getJieCheng(num-1)*num;
}
return result;
}
int main()
{
int num,ret;
puts("请输入");
scanf("%d",&num);
ret=getJieCheng(num);
printf("%d阶乘是:%d",num,ret);
return 0;
}
六,数组作为函数的参数
1、传递数组中的某个元素,意义不大
2、数组名当做函数实际参数
void changeData(int data)
{
data=data+100;
printf("dataInFunc=%d\n",data);
}
int main()
{
int data=1;
changeData(data);
printf("data=%d\n",data);
}
void changeData(int data[])//操作一定是相同的内存空间,数组名当做实参,到底传了什么(地址)
{
data[0]=data[0]+100;
printf("dataInFunc=%d\n",data[0]);
}
int main()
{
int data[2]={1,2};
changeData(data);
printf("data=%d\n",data[0]);
}
3、有两个班,人数不同,求平均分
void initArry(int arry[],int len)
{
int i;
for(i=0;i<len;i++)
{
printf("请输入第%d个学生的成绩:\n",i+1);
scanf("%d",&arry[i]);
}
puts("\ndone\n");
}
void printArry(int arry[],int len)
{
int i;
printf("总人数%d个\n",len);
for(i=0;i<len;i++)
{
printf("第%d个学生的成绩:%d\n",i,arr[i]);
}
puts("\ndone\n");
}
float getAverage(int arry[],int len)
{
int i;
float aver=0.0;
int sum=0;
printf("总人数%d个\n",len);
for(i=0;i<len;i++)
{
//printf("%d ",arry[i]);
sum=sum+arry[i];
}
aver=(float)sum/len;
return aver;
}
int main()
{
int classOne[5];
int classTwo[10];
float averOfOne;
float averOfTwo;
int lenOfClassOne=sizeof(classOne)/sizeof(classOne[0]);
int lenOfClassTwo=sizeof(classTwo)/sizeof(classTwo[0]);
initArry(classOne,lenOfClassOne);
initArry(classTwo,lenOfClassTwo);
printArry(classOne,lenOfClassOne);
printArry(classTwo,lenOfClassTwo);
averOfOne=getAverage(classOne,lenOfClassOne);
averOfTwo=getAverage(classTwo,lenOfClassTwo);
printf("一班的平均分:%.2f\n",averOfOne);
printf("二班的平均分:%.2f\n",averOfTwo);
return 0;
}
七、二维数组和函数
二维数组求最大值
void printArryDouble(int arr[][4],int ihang,int ilie)
{
int i,j;
for(i=0;i<ihang;i++)
{
for(j=0;j<ilie;j++)
{
printf("%d ",arr[i][j]);
}
putchar('\n');
}
}
void initArryDouble(int arr[][4],int ihang,int ilie)
{
int i,j;
for(i=0;i<ihang;i++)
{
for(j=0;j<ilie;j++)
{
printf("请输入第%d行,第%d列的数据",i+1,j+1);
scanf("%d",&arr[i][j]);
}
putchar('\n');
}
}
int getMaxDataFromArrayDouble(int arr[][4],int ihang,int ilie)
{
int i,j,max;
max=arr[0][0];
for(i=0;i<ihang;i++)
{
for(j=0;j<ilie;j++)
{
if(max<arr[i][j])
{
max=arr[i][j];
}
}
putchar('\n');
}
return max;
}
int main()
{
int arr[3][4];
int max;
initArryDouble(arr,3,4);
printArryDouble(arr,3,4);
max=getMaxDataFromArrayDouble(arr,3,4);
printf("二维数组中最大的数是:%d\n",max);
return 0;
}
八、局部变量和全局变量
int max,min;
float getResult(int arr[],int len)
{
int i;
int sum=0;
max=min=arr[0];
for(i=0;i<len;i++)
{
if(max<arr[i])
{
max=arr[i];
}
if(min>arr[i])
{
min=arr[i];
}
sum+=arr[i];
}
return (float)sum/len;
}
int main()
{
int scores[]={66,78,98,56,34,27,54,23,44,66};
float aver;
aver=getResult(scores,sizeof(scores)/sizeof(scores[0]));
printf("班级的最高分是%d\n班级的最低分是%d\n平均分是%.2f\n",max,min,aver);
return 0;
}
九、课后作业
1、要求输入10个数,找出最大数以及最大数的下标
#include<stdio.h>
int max;
int count;
void getMax(int arr[])
{
max=arr[0];
//count=0;
for(int i=0;i<10;i++)
{
if(max<arr[i])
{
max=arr[i];
count=i;
}
}
}
int main()
{
int arr[10];
printf("请输入十个数:\n");
for(int i=0;i<10;i++)
{
scanf("%d",&arr[i]);
}
getMax(arr);
printf("最大值为%d,其下标为%d",max,count);
return 0;
}
2、封装冒泡排序的函数
#include<stdio.h>
int len;
int x;
//冒泡排序
void sort(int arr[x])
{
int i;
int j;
int temp;
for(i=0;i<len-1;i++)
{
for(j=0;j<len-i-1;j++)
{
if(arr[j]>arr[j+1])//<降序,>升序
{
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}
int main()
{
//int x;
printf("几个数?");
scanf("%d",&x);
int arr[x];
printf("请输入%d个数:\n",x);
for(int i=0;i<x;i++)
{
scanf("%d",&arr[i]);
}
len=sizeof(arr)/sizeof(arr[0]);
sort(arr);
printf("排序后的结果为:\n");
for(int i=0;i<len;i++)
{
printf("%d ",arr[i]);
}
return 0;
}
3、封装选择排序的函数
#include<stdio.h>
int len;
int x;
//简单选择排序
void sort(int arr[x])
{
int i;
int j;
int temp;
for(i=0;i<len-1;i++)
{
for(j=0;j<len-i-1;j++)
{
if(arr[i]>arr[j])//<降序,>升序
{
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
}
}
int main()
{
//int x;
printf("几个数?");
scanf("%d",&x);
int arr[x];
printf("请输入%d个数:\n",x);
for(int i=0;i<x;i++)
{
scanf("%d",&arr[i]);
}
len=sizeof(arr)/sizeof(arr[0]);
sort(arr);
printf("排序后的结果为:\n");
for(int i=0;i<len;i++)
{
printf("%d ",arr[i]);
}
return 0;
}