求给出数据的平均值(不能用数组)

求给出数据的平均值(不能用数组)

我们都会求给定数字个数的平均值,如求两个数的平均值的函数如下:

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

但是这个功能函数,只能求出两个数字的平均数,并不能求出三个数字的平均数、四个数字的平均数等。
那么,能不能写出一个函数,无论有多少个数字,都能求出期平均值?
首先,介绍一个头文件,#include <stdarg.h>,这个头文件主要目的为让函数能够接收可变参数。

va_list 是在C语言中解决变参问题的一组宏,所在头文件:#include <stdarg.h>,用于获取不确定个数的参数;
va_start宏,获取可变参数列表的第一个参数的地址(list是类型为va_list的指针,param1是可变参数最左边的参数):
#define va_start(list,param1) ( list = (va_list)&param1+ sizeof(param1) );
va_arg宏,获取可变参数的当前参数,返回指定类型并将指针指向下一参数(mode参数描述了当前参数的类型):
#define va_arg(list,mode) ( (mode *) ( list += sizeof(mode) ) )[-1];
va_end宏,清空va_list可变参数列表:
#define va_end(list) ( list = (va_list)0 );
注:以上sizeof()只是为了说明工作原理,实际实现中,增加的字节数需保证为为int的整数倍。
那么平均值的功能函数可变为

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;
}

int main()
{
	//测试用例
	printf("%d\n",Avg(1,10));
	printf("%d\n",Avg(2,10,20));
	printf("%d\n",Avg(3,10,20,30));
	printf("%d\n",Avg(4,10,20,30,40));
	printf("%d\n",Avg(5,10,20,30,40,50));
	printf("%d\n",Avg(6,10,20,30,40,50,60));
	printf("%d\n",Avg(7,10,20,30,40,50,60,70));
}

猜你喜欢

转载自blog.csdn.net/wangjiaxin_/article/details/89001292