实现一个通过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++; } } if (total == 0 || count == 0){ total = dal_batt_lvl_history[0]; count = 1; } 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; }
-------------------广告线---------------
项目、合作,欢迎勾搭,邮箱:promall@qq.com
本文为呱牛笔记原创文章,转载无需和我联系,但请注明来自呱牛笔记 ,it3q.com