黑马程序员——c语言基础:函数

1.函数的概念:

函数是可以完成特定功能的代码段,也是组成c语言源程序的基本单位。

优点:

1)提高程序的可读性

2)可以提高开发效率

3)提高代码重用性


2.函数的定义

格式:

返回值 函数名(形参列表){

函数体;

// retern

}


3.函数的参数

形式参数,简称形参:在函数定义中,函数名后面小括号中的参数。

   注意:

   1)形参定义后,并不会立即分配存储空间,在函数调用的时候才会分配存储空间。

   2)如果有多个形参,用逗号分隔。

   3)形参的类型可以不同。

   4)函数中不能定义和形参同名的变量。

5)  形参的作用域:只能在本函数中使用。

实际参数,简称实参:在函数调用的时候,函数名后面小括号中的参数。

   注意:

   1)实参可以是变量,也可以是常量,也可以是表达式。

2)实参的数据类型要和形参保持一致。


4.函数的参数的传递过程

实参和形参之间的值的传递过程

 1)调用函数的时候,实参的值是一个已经确定的值

 2)把实参的值赋值给形参

 3)实参和形参的个数、类型要一致,如果类型不一致,会造成精度丢失

 4)形参的值在函数内部可以修改,但是不会影响主调函数中实参的数据

 

5.函数的返回值及注意事项

主调函数和被调函数:A B两个函数,如果在A中调用了B,则A叫主调函数,B叫被调函数。

函数的返回值:被调函数返回给主调函数的值。

 使用注意:

 1)函数的返回值要用到关键字return

 2return后面可跟常量、变量,表达式,可以加上括号,也可以省略:return (常量/变量/表达式)

 3)如果return的值和函数定义的返回值类型不一致,以函数的返回值类型为准。

 

6.函数的声明

  函数的使用流程:先声明,再定义,再调用。

 函数的声明:告诉编译器这个函数已经存在了,告诉编译器被调函数的返回值类型,以便在主调函数中处理被调函数返回的数据。

 函数声明的格式:把被调函数的头部拷贝一份并加上一个分号。

 函数声明的注意事项:

 1)如果被调函数的返回值是int类型,此时可以不用声明(只会出现警告)。

 2)如果被调函数写在主调函数之前,可以不用声明。

 


7.应用举例

1)数学计算

#include <stdio.h>


// 计算三个数的和

int sum(int a,int b, int c){

    return a + b + c;

}

// 计算三个数的平均值

double avg(int a,int b, int c){

    return (a + b + c)/3.0;

}

int main(int argc,const char * argv[]) {

    int s = sum(23,6, 89);

    double a = avg(34,5,77);

    printf("s = %d, a = %f",s,a);

    return 0;

}


8.递归函数

 1.递归函数:如果在一个函数的内部存在调用当前函数本身的语句,那么这个函数就是递归函数。

 2.递归调用:递归函数中,调用自己的操作。

  注意:1)主调函数就是被调函数。

       2)在递归函数中应该存在能够让递归结束的条件。

 3.构成递归的条件:

    1)存在自己调用自己。

    2)存在一个条件,能够让递归结束(否则,死循环)。

    3)能够找到一个规律,让要解决的问题的规模缩小。

 4.递归函数的执行有两个阶段:

    1)递推阶段:问题规模缩小的过程。

    2)回归迭代:迭代计算的过程

 5.递归的优点和缺点:

    优点是:遇到问题规模能够缩小,而且有规律的问题的时候,代码比较简洁。

    缺点:消耗内存。

    建议:在程序中不能用太多

 6.应用举例:

1)5个人做在一起,第5个人比第4个人大两岁,第4个人比第3个人大两岁,第三个人比比2个人大两岁,第二个人比第1个人大两岁,第1个人10岁,问第5个人多大(用递归函数)

#include <stdio.h>

int getage(int n){

    int age = 0;

    if (n == 1) {// 1个人

        age = 10; // 年龄是10

    } else {

        //如果不是第1个人,当前这个人的年龄等于前一个人年龄+2

        age = getage (n - 1) + 2;

    }

    return age;

}

int main(int argc,const char * argv[]) {

    int a = getage(5);

    printf("5个人的年龄为:%d", a);

    return 0;

}


2)用递归法求阶乘和乘方

#include <stdio.h>

// 用递归法求n的阶乘

int jc(int n){

    int j = 0;

    if (n ==1) { // 如果n==1,阶乘的结果等于1

        j = 1;

    } else {// 如果n=1,阶乘的结果等于前一个数的阶乘乘以n

        j = jc(n - 1) * n;

    }

    return j;

}


// 用递归法实现xy次方

int chengFang(int x,int y){

    int cf = 0;

    if (y == 0) {// 如果y==0,乘方等于1

        cf = 1;

    } else {// 如果y不等于0,则xy次方等于xy-1次方乘以x

        cf = chengFang(x, y - 1) * x;

    }

    return cf;

}

int main(int argc,const char * argv[]) {

    int j = jc(4);

    printf("4的阶乘是%d\n",j);

    int c = chengFang(3,4);

    printf("34次方是%d", c);

    return 0;

}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值