标签:va 平均值 int list 给出 参数 mode 数组
求给出数据的平均值(不能用数组)
我们都会求给定数字个数的平均值,如求两个数的平均值的函数如下:
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)¶m1+ 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));
}
标签:va,平均值,int,list,给出,参数,mode,数组 来源: https://blog.csdn.net/wangjiaxin_/article/details/89001292
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。