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

来源:互联网 发布:自学广告设计软件 编辑:程序博客网 时间:2024/05/22 10:34

#include <stdio.h>
#define MAXHIST 15#define MAXWORD 11#define IN 1#define OUT 0int 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

示例结果:

把该程序重定向到输入



阅读全文
0 0