函数进阶(2)

函数嵌套调用

        嵌套调用:在被调函数内有去主动去调用其他函数;

案例1
需求:输入四个整数,找出其中最大的数,用函数嵌套来处理,要求每次只能两个数比较
// 函数声明
int max_2(int,int);
int max_4(int,int,int,int);
 
// 主函数
int main()
{
    int a=12,b=44,c=33,d=16,result;
 
    result =  max_4(12,44,33,16);
 
    printf("%d,%d,%d,%d中的最大数是%d\n",a,b,c,d,result);
 
    return 0;
}
 
// 求2个数中的最大数
int max_2(int a,int b)
{
    return a > b ? a : b;
}

// 求4个数中的最大数
int max_4(int a,int b,int c,int d)
{
	int max;// 存储比较的最大数
	max = max_2(a,b);// 第一次比较:a,b中最大数
	max = max_2(max,c);// 第二次比较:a,b,c中最大数
	max = max_2(max,d);// 第三次比较:a,b,c,d中最大数
	return max;
}
经典(递归)

        简言之就是直接间接调用自己(本质:构成循环结构——死循环),一般用于阶乘(从后往前思考,与for相反)、幂运算、字符串翻转

void f()
{
    f();	//调用自己,但是也会退出,因为调用需要分配栈空间,直到栈空间不足
}
//阶乘
int jiecheng(int n)
{
    if(n == 1)
        return 1;	//结束条件
    return jiecheng(n-1) * n;
}

int main()
{
    int m = jiecheng(3);
    printf("%d\n",m);
    
    return 0;
}
//幂运算 a^n = a^(n-1) * a

        注意事项:

                1.递归必须要有出口来终止递归;

                2.终止条件的判断一定要在函数递归之前;

                3.函数递归的同时要将将函数调用向出口逼近;

第一个人10岁,后面每一个人比前一个大两岁,问第五个
int age(int n);

int main()
{
    int n, c = 0;
    scanf("%d", &n);
    c = age(n);
    printf("%d\n",c);
    return 0;
}

int age(int n)
{
    int c;
    
    if(n == 1)
    {
        c = 10;
    }else if(n > 1)
    {
        c = age(n -1) + 2;
    }
    
    return c;
}

数组作为函数参数

        注意:

                当数组为实参时,形参也要用对应数组/指针接收。特别注意,此次传递仅仅是传递数组首地址(而不是整个数组),实参和形参共用一个内存,形参会改变实参。这叫引用传递

                当数组为形参时,我们需要额外提供数组元素个数。这样就可以依据长度来构建一个和实参一样的数组,防止访问越界。

        特别的:字符数组为形参时,且字符数组存放着字符串(形参是字符数组,实参是字符串)。不需要表示长度的形参,因为字符串自带结束符\0

案例1
判断两个数组的大小,逐个比较,大的多为大
static int compare(int x, int y);

int main()
{
    int a[10], b[10];
    int max,min,k;

    printf("请输入十个数:\n");

    for(int i = 0; i < 10; i++)
    {
        scanf("%d", &a[i]);
    }

    for(int i = 0; i < 10; i++)
    {
        scanf("%d", &b[i]);
    }

    for(int i = 0; i < 10; i++)
    {
        if(compare(a[i],b[i]) == 1)
        {
            max++;
        }else if(compare(a[i],b[i]) == 0)
        {
            k++;
        }else if(compare(a[i],b[i]) == -1)
        {
            min++;
        }
    }

    printf("a数组大于b数组有%d个,小于%d个,等于%d个。",max,min,k);

    return 0;
}

static int compare(int x, int y)
{
    int flag = 0;

    if(x > y)
    {
        flag = 1;
    }else if(x == y)
    {
        flag = 0;
    }else{
        flag = -1;
    }

    return flag;
}
案例2
求两个不同大小的数组的平均值
static double average(float a[], int len);

int main()
{
    double avg = 0.0;

     float a[5] = {1,2,3,4,5};
     float b[10] = {1,2,3,4,5,6,7,8,9,10};

     printf("a班平均数%lf\n",avg = average(a,sizeof(a) / sizeof(a[0])));
     printf("b班平均数%lf\n",avg = average(b,sizeof(b) / sizeof(b[0])));

     return 0;
}

static double average(float a[], int len)
{
    double avg = 0.0;
    float sum = 0.0;

     for(int i = 0; i < len; i++)
     {
         sum += a[i];
     }

     avg = sum / len;

     return avg;
}
  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值