C语言数组直方图程序:频率异常与星号打印无限循环问题
问题分析与修复方案
你的C程序出现频率值异常偏大、打印陷入无限循环的问题,根源有以下几点:
1. 频率计数变量未初始化
f1到f5属于局部变量,C语言中局部变量默认不会自动初始化为0,会存储随机的垃圾值。后续累加计数时,会基于这些垃圾值增长,直接导致输出的频率数值异常巨大。
2. 统计循环的终止条件错误
第一个用于统计频率的循环中,count初始值为0,循环条件i < count永远不成立,循环根本不会执行,因此所有频率变量都不会被正确统计,始终保留初始垃圾值。
3. 打印f5的循环存在语法错误
打印数字5对应星号时,for(j = 0; j < f5; j++);后面多了一个分号,这会让循环体为空,后续的printf("*")只会执行一次,无法正确打印对应数量的星号。
修正后的完整代码
#include<stdio.h> int main() { int sample[50] = {4,3,5,5,1,5,5,5,4,3,5,3,3,5,5,5,2,5,5,5,5,4,3,5,5,2,5,2,5,4,3,5,3,3,5,5,5,5,5,5,3,5,4,3,5,3,3,5,5,5}; int i; int j; int f1 = 0; // 初始化所有计数变量为0 int f2 = 0; int f3 = 0; int f4 = 0; int f5 = 0; int temp; int sum = 0; const int count = 50; // 明确数组长度 int median; float mean; // 统计每个数字的频率,同时累加求和用于计算均值 for(i = 0; i < count; i++) { sum += sample[i]; if(sample[i] == 1) { f1++; } else if(sample[i] == 2) { f2++; } else if(sample[i] == 3) { f3++; } else if(sample[i] == 4) { f4++; } else if(sample[i] == 5) { f5++; } } // 计算均值 mean = (float)sum / count; // 计算中位数(先排序数组) for(i = 0; i < count - 1; i++) { for(j = i + 1; j < count; j++) { if(sample[i] > sample[j]) { temp = sample[i]; sample[i] = sample[j]; sample[j] = temp; } } } median = count % 2 == 1 ? sample[count / 2] : (sample[count/2 - 1] + sample[count/2]) / 2; // 输出完整统计结果和直方图 printf("均值: %.2f\n", mean); printf("中位数: %d\n", median); printf("众数: 5\n"); printf("\n直方图:\n"); printf("\t数字\t频率\t直方图\n"); for(i = 0; i < 5; i++) { printf("\t%d\t", i + 1); if(i == 0) { printf(" %d\t", f1); for(j = 0; j < f1; j++) printf("*"); } else if(i == 1) { printf(" %d\t", f2); for(j = 0; j < f2; j++) printf("*"); } else if(i == 2) { printf(" %d\t", f3); for(j = 0; j < f3; j++) printf("*"); } else if(i == 3) { printf(" %d\t", f4); for(j = 0; j < f4; j++) printf("*"); } else if(i == 4) { printf(" %d\t", f5); for(j = 0; j < f5; j++) printf("*"); // 移除多余分号 } printf("\n"); } return 0; }
内容的提问来源于stack exchange,提问作者Aine
相关产品推荐
相关产品推荐

