实现一个通过ADC采样电压值,每次采样5次,去掉一个最大值,一个最小值后,取剩下三次的平均值。
//取5次adc,去掉最大值,去掉最小值,取平均值
#define BATT_LVL_COUNT 5
static int batt_lvl_history[BATT_LVL_COUNT] = {0};
static int batt_lvl_idx = 0;
static void put_batt_avg_lvl(int lvl)
{
batt_lvl_history[batt_lvl_idx] = lvl;
batt_lvl_idx++;
if (batt_lvl_idx >= BATT_LVL_COUNT)
{
batt_lvl_idx = 0;
}
return;
}
//产生bug的函数
static int get_batt_avg_lvl(int min, int max)
{
int i = 0;
int total = 0;
int count = 0;
for (i = 0; i < BATT_LVL_COUNT; i++)
{
if (batt_lvl_history[i] != 0
&& min < batt_lvl_history[i]
&& max > batt_lvl_history[i])
{
total += batt_lvl_history[i];
count++;
}
}
int avg = total / count;
return avg;
}
void test_get_adc(){
int times = BATT_LVL_COUNT;
int max = 0;
int min = 0;
do{
//通过adc采样读取电压值,读的过程中,将值放到缓冲区中,并拿到最大值和最小值
voltage = start_adc_read(dev, BSP_BATTERY_DETECT_ADC_CHANNEL);
put_batt_avg_lvl(voltage);
if (min == 0){
min = voltage;
max = voltage;
}else{
if (voltage < min){
min = voltage;
}
if (voltage > max){
max = voltage;
}
}
}while(times-- > 0);
//求取平均值
avg_value = get_batt_avg_lvl(min, max);
printf("rt_adc_read: %d,avg_value:%d\n", voltage, avg_value);
}
测试发现,求平均的方法偶尔会返回0 糗大了。其实,就是出现在如果min和max都是同一个值,如果每次采样都是同一个值,是不是bug就出来了。糗大了。
参考下文言一下生成的代码:
实现一个C方法,从一个5个整形数组中,去掉最大值,去掉一个最小值,然后求取平均值的方法
你可以使用下面的C语言代码来实现这个功能。这个代码定义了一个函数calculateAverage()
,它接受一个包含5个整数的数组作为参数,然后去掉数组中的最大值和最小值,计算并返回剩余3个元素的平均值。
#include <stdio.h>
double calculateAverage(int arr[], int size) {
// 假设第一个元素是最大值和最小值
int max = arr[0];
int min = arr[0];
int sum = 0;
// 找到最大值和最小值,并计算总和
for (int i = 0; i < size; i++) {
if (arr[i] > max) {
max = arr[i];
} else if (arr[i] < min) {
min = arr[i];
}
sum += arr[i];
}
// 从总和中减去最大值和最小值
sum = sum - max - min;
// 计算平均值
double average = (double)sum / (size - 2);
return average;
}
int main() {
int arr[5] = {1, 2, 3, 4, 5}; // 可以替换为任何包含5个整数的数组
double average = calculateAverage(arr, 5);
printf("Average: %.2f\n", average);
return 0;
}
本文为呱牛笔记原创文章,转载无需和我联系,但请注明来自呱牛笔记 ,it3q.com