C语言偶数数组乘0.02求均值取倒数输出0问题排查
C语言奇偶拆分后数组计算问题修复方案
错误原因
- 变量类型不匹配:原有
sum为int类型,累加浮点数时会截断小数部分;average声明为int类型,无法存储浮点计算结果,用%f打印int变量属于未定义行为,直接导致输出0.000000 - 变量未重置:原有
sum在之前计算Frequency逻辑中已经被赋值,计算新数组均值前没有清零,初始值错误 - 有效长度计算冗余:可变长度数组
Arr的有效元素数就是EVEN数组的元素数j,不需要通过sizeof计算,避免出现长度计算错误
正确完整实现
#include<stdio.h> int main() { int NUM[] = {1,2,3,4,5,6,7,8,9,10}; int i,j,k; int len = sizeof NUM / sizeof * NUM; int ODD[len]; int EVEN[len]; j = 0; k = 0; // 单独定义int类型变量用于原有Frequency计算逻辑 int int_sum = 0; int int_average; for(i = 0; i<len ; i++){ if(NUM[i]%2 == 0){ EVEN[j] = NUM[i]; j++; }else{ ODD[k] = NUM[i]; k++; } } printf("Even numbers : "); for(i = 0;i<j; i++){ printf("%d ",EVEN[i]); } printf("\nOdd numbers : "); for(i = 0;i<k; i++){ printf("%d ",ODD[i]); } printf("\nFrequency of EVEN array is :"); for(i = 0;i<j; i++){ int_sum = int_sum + EVEN[i]; int_average = int_sum / j; printf("%d ",int_average); } printf("\n"); // 修正后的新逻辑代码 double Arr[j]; // 直接用EVEN的有效长度j定义数组更稳妥 double arr_sum = 0.0; // 用double类型存储浮点数累加和,避免截断 double average, res; for(i=0;i<j;i++){ Arr[i] = EVEN[i]*0.02; printf("转换后元素:%f ", Arr[i]); arr_sum += Arr[i]; // 遍历转换的同时直接累加,减少一次循环 } average = arr_sum / j; // 直接用j作为有效元素数计算均值 res = 1 / average; // 按需求计算平均值的倒数 printf("\nEVEN转换后数组的平均值为:%f", average); printf("\n平均值的倒数为:%f\n", res); return 0; }
运行结果
Even numbers : 2 4 6 8 10 Odd numbers : 1 3 5 7 9 Frequency of EVEN array is :0 1 2 4 6 转换后元素:0.040000 转换后元素:0.080000 转换后元素:0.120000 转换后元素:0.160000 转换后元素:0.200000 EVEN转换后数组的平均值为:0.120000 平均值的倒数为:8.333333
内容的提问来源于stack exchange,提问作者Ashton Stark
相关产品推荐
相关产品推荐

