函数的定义与使用
为什么要用函数
1.避免代码冗长
2.模块化的设计思路
3.按功能划分,每个函数代表一个功能,而函数的名字要体现函数的功能含义,类似变量标识符y=f(x)
函数要先定义再使用
三要素:1.函数名——体现功能
2.参数列表——参数的个数按照需求自行定义
3.返回值
函数体——执行什么样的功能,涉及的处理代码叫做函数体
函数的调用
一.定义无参数函数
二.定义有参数有返回值的函数
#include<stdio.h>
int add(int x,int y,int z)
{
int data;
data=x+y+z;
return data;
}
int main()
{
int x;
int y;
int z;
int fret;
puts("请输入一个数:");
scanf("%d",&x);
puts("请再输入一个数:");
scanf("%d",&y);
puts("请再输入一个数:");
scanf("%d",&z);
fret=add(x,y,z)+100;
printf("%d+%d+%d=%d\n",x,y,z,add(x,y,z));
printf("fret=%d\n",fret);
return 0;
}
要点:1.int add(2,3)——带了返回值类型
2.add(int a,int b)——形参带类型
函数的嵌套
输入四个数,函数方式找出最大值
#include<stdio.h>
int getTheBigFromTwo(int data1,int data2)
{
int Bigger;
bigger=data1>data2?data1:data2;
return bigger;
}
int getMaxDataFromFour(int a,int b,int c,int d)
{
int max;
max=getTheBigFromTwo(a,b);
max=getTheBigFromTwo(max,c);
max=getTheBigFromTwo(max,d);
return 0;
}
int main()
{
int data1;
int data2;
int data3;
int data4;
puts("please Input Four nums: ");
scanf("%d%d%d%d",&data1,&data2,&data3,&data4);
getMaxDataFromFour(data1,data2,data3,data4);
printf("the biggest is %d\n",theBigone);
return ;
}
函数的递归
#include<stdio.h>
int getAge(int currpersonnum)
{
int age;
if(currpersonnum==1){
age=10;
}else{
age=getAge(currpersonnum-1)+2;
}
return age;
}
int main()
{
int age;
int num;
printf("请输入第几个学生的年龄: \n");
scanf("%d",&num);
age=getAge(num);
printf("第%d学生的年龄%d\n",num,age);
return 0;
}
#include<stdio.h>
int getFactorial(int num)
{
int result;
if(num==1){
result=1;
}else{
result=getFactorial(num-1)*num;
}
return result;
}
int main()
{
int num;
int ret;
printf("请输入你的阶乘数:\n");
scanf("%d",&num);
ret=getFactorial(num);
printf("%d的阶乘:%d\n",num,ret);
return 0;
数组作为函数的参数
数组名当做函数实际参数
数组也是值传递,传递的是地址
有两个班的同学,分别是个人和5个人,分别求这两个班的平均分
#include<stdio.h>
void initArry(int arry[],int len)
{
int i;
for(i=0;i<len;i++){
printf("请输入第%d个学生的成绩:\n",i+1);
scanf("%d",&arry[i]);
}
puts("\n done\n");
}
void printArry(int arry[],int len)
{
int i;
printf("总人数%d个\n",len);
for(i=0;i<len;i++){
printf("%d ",arry[i]);
}
puts("\n done\n");
}
float getAverage(int arry[],int len)
{
int i;
float aver=0.0;
int sum=0;//总分这个变量一定手动初始化为0,默认值可能是一个大数可能会影响结果
for(i=0;i<len;i++){
sum+=arry[i];
}
aver=(float)sum/len;
return aver;
}
int main()
{
int classOne[5];
int classTwo[10];
float averOfClassOne;
float averOfClassTwo;
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);
averOfClassOne=getAverage(classOne, lenofclassOne);
averOfClassTwo=getAverage(classTwo,lenofclassTwo);
printf("一班的平均分:%.2f\n",averOfClassOne);
printf("二班的平均分:%.2f\n",averOfClassTwo);
return 0;
}
二维数组
合理写法:int arr[2][3]
int arr[] [3]
不合理写法:int arr[][]或 int arr[3][]
有3*4矩阵,初始化它并输出,然后求最大值并输出
#include<stdio.h>
void printArrayDouble(int array[][4],int ihang,int ilie )
{
int i;
int j;
for(i=0;i<ihang;i++){
for(j=0;j<ilie;j++){
printf("%d ",array[i][j]);
}
putchar('\n');
}
}
void initArrayDouble(int array[][4],int ihang,int ilie)
{
int i;
int j;
for(i=0;i<ihang;i++){
for(j=0;j<ilie;j++){
printf("请输入第%d行,第%d列的值\n",i+1,j+1);
scanf("%d",&array[i][j]);
}
putchar('\n');
}
}
int getMaxDataFromArrayDouble(int array[][4],int ihang,int ilie)
{
int i;
int j;
int max;
max=array[0][0];
for(i=0;i<ihang;i++){
for(j=0;j<ilie;j++){
if(max<array[i][j]){
max=array[i][j];
}
}
}
return max;
}
int main()
{
int max;
int array[3][4];
initArrayDouble(array,3,4);
printArrayDouble(array,3,4);
max=getMaxDataFromArrayDouble(array,3,4);
printf("二维数组最大的值:%d\n",max);
return 0;
}
全局变量
#include<stdio.h>
int max;
int 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,87,98,35,65,78,99,31,59,100};
float aver;
aver=getResult(scores,sizeof(scores)/sizeof(scores[0]));
printf("班级的最高分是:%d\n最低分是%d\n,平均分是%.2f\n",max,min,aver);
return 0;
}