编写一个程序,打印输入中各个字符出现频度的直方图

本文介绍了一个使用C语言编写的程序,该程序能够读取文本输入并统计不同长度单词的出现频次,并通过两种不同的直方图形式展示统计结果。一种是水平直方图,另一种是垂直直方图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#define MAXHIST 15
#define MAXWORD 11
#define IN 1
#define OUT 0
int main()
{
    int c,i,j,nc,state;
    int len;
    int maxvalue;
    int ovflow;
    int wl[MAXWORD];
    state = OUT;
    nc = 0;
    ovflow = 0;
    for(i = 0; i < MAXWORD; ++i)
        wl[i] = 0;
    while((c = getchar()) != EOF)
    {
        if(c == ' '|| c == '\n' || c == '\t')
        {
            state = OUT;
            if(nc > 0)
                if(nc < MAXWORD)
                    ++wl[nc];
                else
                    ++ovflow;
            nc = 0;
        }
        else if(state == OUT)
        {
            state = IN;
            nc = 1;
        }
        else
            ++nc;
    }
    maxvalue = 0;
    for(i = 1; i < MAXWORD; ++i)
        if(wl[i] > maxvalue)
            maxvalue = wl[i];
#if 0
    for(i = 1; i < MAXWORD; ++i)
    {
        printf("%5d - %5d :",i,wl[i]);
        if(wl[i] > 0)
        {
            if((len = wl[i] * MAXHIST / maxvalue) <= 0)
                len = 1;
        }
        else
            len = 0;
        while(len > 0)
        {
            putchar("*");
            --len;
        }
        putchar('\n');
    }
#else
    for(i = MAXWORD; i > 0; --i)
    {
        for(j = 1; j < MAXWORD; ++j)
            if(wl[j] * MAXWORD / maxvalue >= i)
                printf("  *  ");
            else
                printf("     ");
        putchar('\n');
    }
    for(i = 1; i < MAXWORD; ++i)
        printf("%4d ",i);
    putchar('\n');
    for(i = 1; i < MAXWORD; ++i)
        printf("%4d ",wl[i]);
    putchar('\n');
#endif
    if(ovflow > 0)
        printf("%d words >= %d\n",ovflow,MAXWORD);
    return 0;
}

该程序利用循环getchar()读取单词,把不同长度单词出现频数存放在数组中,利用循环打印。

分别实现了水平直方图和垂直直方图注意:

绘制直方图时的判断if((len = wl[i] * MAXHIST / maxvalue) <= 0) 用到了归一化的原理,w[i]是长度i单词出现的频数,maxvalue是最大频数,由于频数无上限,故限制成一定的输出长度MAXHIST。可以看成当前长度与最大长度的比例*限制 wl[i]/maxvalue * MAXHIST

示例结果:

把该程序重定向到输入



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值