C语言函数

目录

1.什么是函数

2.为什么要函数调用

3.如何定义一个函数

4.如何调用函数

5.形式参数与实际变量

6.全局变量

 7.函数嵌套

8.数组作为函数的参数 

一维数组

二维数组


1.什么是函数 


    函数是一个功能模块,它实现某个功能的代码块包含起来,并起了一个函数名,供别人 调用。如printf函数,scanf函数。是程序运行当中包装起来的一个步骤。

2.为什么要函数调用

        1.代码好看
        2.容易定位问题
        3.可复制性强
        4.分工 

3.如何定义一个函数

函数要先定义再使用,和变量一个道理

定义:抓住三要素!牢牢记住!!!!!!!!!
        1.函数名 体现功能
        2.参数列表
            比如y=f(x),x就是参数 比如z=f(x,y),x,y就是参数
            参数的个数根据需求自行定义
       3. 返回值  还比如y=f(x),y是函数根据x的值和f的功能执行后的结果
       4. 函数体 执行什么样的功能,涉及的处理代码叫做函数体

一般函数定义情况
    1.无返回无参数
        void buyRice()   void 代表无返回值,不需要return
    2.无返回有参数
        void buyRice1( 100)
    3.有返回值有参数
        int f(int x)
    4.有返回值有多个同类型参数
        int add(int x,int y,int z)
    5.有返回值有多个参数,参数类型不同
        int score(char name,int x)
    6.根据需要各种组合都行

4.如何调用函数

 函数名();如prepare();
 函数名(实际参数);如buyRice(100);
 调用的时候,传递的参数叫实际参数,对类型严格要求

函数可多级调用(也可以自己调用自己,这叫做递归)

#include <stdio.h>

//无参数无类型
void daYing()
{
	puts("====================");
	
}

//有参数有返回值
int addData(int i)
{
	printf("addData里面的i=%d\n",i);//6
	i++;
	printf("addData里面的i++=%d\n",i);//7
	printf("addData里面的i++=%d\n",i++);//7  i++ 在printf函数里面i++事先打印在自增,自增后传递给下一个i
	printf("addData里面++i=%d\n",++i);//9  ++i 是先自增在打印
	
	return i;
}

int main()
{
	int i=1;
	
	daYing();//函数调用
	
	addData(6);
	
	printf("主函数的addData里面的i=%d",i);
	return 0;
}

5.形式参数与实际变量

        形式参数:
    1.形式参数作用域仅限该函数       2.形式参数也是一个变量,局部变量,有自己的生存空间

        空间生存期,出生和死亡:
           1. 何时申请该空间
            当函数被调用的时候,才申请了该空间,才有该变量。同时,该空间内的数据被赋值成实际参数的值,函数调用把实际参数的值拷贝一份给形式参数       
           2.何时空间释放
           函数执行结束,该空间由内存管理单元自动回收(释放)


        形式参数也是局部变量,作用域(生效范围)仅限该函数。例如3年2班有一个人叫张杰,3年3班也有人叫张杰,4班没有叫张杰,2班老师点名的时候,3班的张杰会应答吗?能应答一定是3班张杰疯了!4班的老师会点名张杰吗?不会

6.全局变量

#include <stdio.h>

//全局变量一定是在头头
int max;
int min;

float getResult(int score[],int scoreLen)
{
	int sum=0;//赋初值
	int i;                    //局部变量
	max = min = score[0];
	for(i=0;i<scoreLen;i++){
		if(max < score[i]){
			max = score[i];
		}
		if(min > score[i]){
			min = score[i];
		}
		sum += score[i];
	}
	return (float)sum/scoreLen;
}
/*
int max;
int min;	//放在函数后面,上面的函数无法调用到该变量
*/
int main()
{
	int score[10]={1,2,3,4,5,6,7,8,9,10};
	float aver;
	int scoreLen;
	
	scoreLen = sizeof(score)/sizeof(score[0]);
	
	aver = getResult(score,scoreLen);
	printf("班级的最高分:%d\n最低分:%d\n平均分=%f\n",max,min,aver);
	return 0;
}

 7.函数嵌套

 main函数调用子函数a,子函数a又调用子函数b,子函数b又调用子函数c......(叠叠乐?)

 三目运算符格式:逻辑表达式?表达式 1:表达式 2 例如x>y?x:y

理解:运算逻辑表达式的值为真(1),输出表达式1;表达式的值为假(0),输出表达式2

max=(a>b)?a:b 的执行结果是将 a 和 b 中较大的数赋值给变量 max
/*
	函数嵌套:一个子函数可以调用另一个子函数来使用
	(调用它本身也可以[这叫做递归,一般不要用容易出事])
	场景:碟中谍中谍中谍.....
*/

#include <stdio.h>

int getMaxTwoNum(int x,int y)
{
	return x>y?x:y;
}

int getMaxFourNum(int a,int b,int c,int d)
{
	int max;
	max = getMaxTwoNum(a,b);
	max = getMaxTwoNum(max,c);
	max = getMaxTwoNum(max,d);
	return max;
}

int getMinTwoNum(int x,int y)
{
	return x<y?x:y;
}

int getMinFourNum(int a,int b,int c,int d)
{
	int min;
	min = getMinTwoNum(a,b);
	min = getMinTwoNum(min,c);
	min = getMinTwoNum(min,d);
	return min;
}

int main()
{
	int a;
	int b;
	int c;
	int d;
	int max;
	int min;
	
	puts("please Input Four nums:");
	scanf("%d%d%d%d",&a,&b,&c,&d);
	max = getMaxFourNum(a,b,c,d);
	printf("四个数最大是:%d\n",max);
	min = getMinFourNum(a,b,c,d);
	printf("四个数最小是:%d\n",min);
	return 0;
}

 函数的递归(嵌套了自己,少用)
        编程案例

思路

代码实现 

/*
	函数递归:嵌套我自己(很少用,最好别用,易出错)
	场景:n!的计算 5!=5*4*3*2*1;
*/

#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;
	puts("你要知道第几个学生的年龄:");
	scanf("%d",&num);
	
	age = getAge(num);
	
	printf("第%d个学生的年龄是:%d\n",num,age);
	return 0;
}

 案例二:n!的计算(面试可能会写)

/*
	函数递归:嵌套我自己(很少用,最好别用,易出错)
	场景:n!的计算 5!=5*4*3*2*1;
*/

#include <stdio.h>

long int getJieCheng(int num)
{
	int result;
	
	if(num==1){
		result = 1;
	}else{
		result = getJieCheng(num-1)*num;
	}
	return result;
}

int main()
{
	long int ret;
	int num;
	puts("请输入要求的阶乘数:");
	scanf("%d",&num);
	
	ret = getJieCheng(num);
	
	printf("%d阶乘=%d\n",num,ret);
	printf("long int 的字节=%d\n",sizeof(long int));//4个字节4*8=32.2的32次方
	return 0;
}

8.数组作为函数的参数 

一维数组

传递数组中的某个元素意义不大。

数组名当做函数实际参数
    传递的是什么,内存空间和变量的值传递有什么不同点和相同点
        也是值传递
            不过传递的是地址而已
                
    有意思的案例,关于地址(未来的指针)
        
    编程案例:有两个班的同学,分别是10个人和5个人,分别求这两个班的平均分

二维数组

1.形参怎么写
    合法写法
        int arr[2][3]
        int arr[ ][3]
    不合法写法
        int arr[ ][ ]
            说明
    补充说明
        
            关心两点
                数组数据类型
                二维中的一维数组有多少个
    练习:有3x4矩阵,初始化它并输出,然后求最大值并输出

#include <stdio.h>
//练习:有3x4矩阵,初始化它并输出,然后求最大值并输出

//初始化二维数组
void initArray(int array[][4],int hang,int lie)
{
	int i,j;
    for(i=0;i<hang;i++){
		for(j=0;j<lie;j++){
			printf("请输入第%d行,第%d列的数据\n",i+1,j+1);
            scanf("%d",&array[i][j]);
        }
    }
}

//遍历数组 (和初始化二维数组差不多)
void printArray(int array[][4],int hang,int lie)
{
	int i,j;
    for(i=0;i<hang;i++){
		for(j=0;j<lie;j++){
			
            printf("%d ",array[i][j]);
        }
        putchar('\n');//好看,显示出像矩阵
    }
}

//求数组最值
void zhuiDaArray(int array[][4],int hang,int lie)
{
	int i,j;
    int max;
    int maxHang,maxLie;
       
    max = array[0][0];
    
    for(i=0;i<hang;i++){
		for(j=0;j<lie;j++){
			if(max < array[i][j]){
				max = array[i][j];
                maxHang = i+1;
                maxLie = j+1;
            }
            
        }
    }
    printf("数组最大值是第%d行,第%d列的%d\n",maxHang,maxLie,max);
   
}

void zhuiXiaoArray(int array[][4],int hang,int lie)
{
	int i,j;
	int min;
    int minHang,minLie;
    
    min = array[0][0];
    
    for(i=0;i<hang;i++){
		for(j=0;j<lie;j++){
            if(min > array[i][j]){
				min = array[i][j];
                minHang = i+1;
                minLie = j+1;
            }
        }
    }
    printf("数组最小值是第%d行,第%d列的%d\n",minHang,minLie,min);
}

int main()
{
	int array[3][4];
    
	initArray(array,3,4);
    printArray(array,3,4);
    zhuiDaArray(array,3,4);
    zhuiXiaoArray(array,3,4);
	system("pause");
	return 0;
}

如何看懂一个函数

    1.参数怎么传
        参数的类型,参数的个数
    2.函数的返回值
        返回值的类型
    3.功能
        函数名字来体现功能

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值