最近学习一段代码,关于求平均值过滤的,曩昔使用时,一般是这样算,先一会儿读出10个值来,求和再除以10,然后回来平均值。
今日学到了一种新的求平均值法,不必一会儿读出10个来,而是正常读,只不过是曾经读的都会记载保存下来,然后经过移位来更新这10个数据,
简略来说 假如 收集的数据为(2.0,2.1,2.5,2.3,2.5,2.2,2.5,2.6,5.9,2.7),那么下次收集为 2.5,那么就会将2.0丢掉,2.1为第一位,顺次移位完成数据的更新。感觉奇妙之级。
这种办法的代码完成如下‘
/*******************************************************************************
* Function Name : static int _filter(int m)
* Description :
* Input :
* Output : None
* Return :
* Attention : None
*******************************************************************************/
static int _filter(int m)
{
static int flag_first = 0, _buff[10], sum;
const int _buff_max = 10;
int i;
if(flag_first == 0)
{
flag_first = 1;
for(i = 0, sum = 0; i < _buff_max; i++)
{
_buff[i] = m;
sum += _buff[i];
}
return m;
}
else
{
sum -= _buff[0];
for(i = 0; i < (_buff_max - 1); i++)
{
_buff[i] = _buff[i + 1];
}
_buff[9] = m;
sum += _buff[9];
i = sum / 10.0;
return i;
}
}
一开始认为 else 后边的不会履行,后来我错了。
static有一个特色
特色: static局部变量的”回忆性”与生存期的”全局性”
所谓”回忆性”是指在两次函数调用时, 在第2次调用进入时, 能坚持第一次调用退出时的值.
示例程序一
#include
using namespace std;
void staticLocalVar()
{
static int a = 0; // 运行期时初始化一次, 下次再调用时, 不进行初始化作业
cout<<"a="<++a;
}
int main()
{
staticLocalVar(); // 第一次调用, 输出a=0
staticLocalVar(); // 第2次调用, 回忆了第一次退出时的值, 输出a=1
return 0;
}