You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 22:01:06