可变参数编程问题探究

问题引入:为什么要使用可变参数编程

问题探究:
1.假设要求一个两位数的平均数,仅使用函数实现,两个形参分别传入两个数字,可以很快得出该函数计算两个数字的平均值问题

int Avg(int a,int b)
{
	return (a+b)/2;
}

2.假设要求一个三位数的平均数,仅使用函数实现,三个形参分别传入三个数字,可以很快得出该函数计算三个数字的平均值问题

int Avg(int a,int b,int c)
{
	return (a+b+c)/3;
}

3.假设要求一个1~5位数的平均数,仅使用函数实现,内部使用if…else实现,可以很快得出该函数平均值问题

int Avg1(int n,int a,int b,int c,int d,int e)
{
	assert(n > 0);//需要引入<assert.h>头文件
	int sum = 0;
	if(n == 1)
	{
		sum = a;
	}
	else if(n == 2)
	{
		sum = a + b;
	}
	else if(n == 3)
	{
		sum = a + b+c;
	}
	else if(n == 4)
	{
		sum = a + b+ c + d;
	}
	else
	{
		sum = a+b+c+d+e;
	}
	return sum/n;
}

问题解决:为了解决大量同类型问题,不必每一次都要写一个函数,引入可变参数方程,不必每次把所有形参都写出来,可以高效率解决同类型问题
我们知道C支持可变参数的函数,这里的意思是C支持函数带有可变数量的参数,最常见的例子就是我们十分熟悉的printf()系列函数。
函数调用时参数是自右向左压栈的,举个例子:
在这里插入图片描述
该程序会输出什么呢?
在这里插入图片描述
因为函数调用时候是自右向左压栈的,所以arr[++i]即为arr[2]为3,arr[i]亦为3
所以在可变参数函数的一般形式中,左边是已经确定的参数,右边省略号代表未知参数部分

n的作用:1.定位到…开头;2.记录…中数据的个数

//n的作用:1.定位到...开头;2.记录...中数据的个数
int Avg(int n,...)
{
	int sum = 0;
	va_list list;//游标指针.char *list;
	va_start(list,n);//将list定位到...开头

	for(int i=0;i<n;i++)
	{
		sum += va_arg(list,int);//从list中取数据
	}
	va_end(list);//关闭list.list = NULL;

	return sum/n;
}

测试用例:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值