实现一个通过ADC采样电压值,每次采样5次,去掉一个最大值,一个最小值后,取剩下三次的平均值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | //取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个元素的平均值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #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