【C Programming】单词直方图

来源:互联网 发布:网络澳门赌博 编辑:程序博客网 时间:2024/06/08 06:07

C programming一栏用于记录《The C Programming Learning》中的学习历程,代码均来源于其对应习题解答。
习题1-13 打印输入中单词长度的直方图。

//单词水平长度直方图#include<stdio.h>#define MAXWORD 11 //单词最长的长度#define MAXHIST 15 //直方图最长的长度#define OUT 0#define IN  1int main(){int c,i,j,state;int wl[MAXWORD];//各长度的次数int nc; //一个单词的长度int len;//输出*的长度int maxvalue;//单词长度的最大值int overflow;state=OUT;overflow=0;nc=0;for(i=0;i<MAXWORD;i++)wl[i]=0;while((c=getchar())!=EOF){if(c==' '|| c=='\t' || c=='\n'){if(nc>0){    if(nc<MAXWORD)wl[nc]++; elseoverflow++;     }         nc=0;     state=OUT;}else if(state==OUT){ //一个单词开头nc=1;        state=IN;}else                //一个单词内部nc++;}//给maxvalue赋值maxvalue=0;for(i=1;i<MAXWORD;i++){    if(wl[i]>maxvalue)   maxvalue=wl[i];}for(i=1;i<MAXWORD;i++){printf("%5d  --%5d  : ",i,wl[i]);    if(wl[i]>0){        if((len=wl[i]*MAXHIST/maxvalue)<=0) //len=wl[i]*MAXHIST/maxvalue归一化len=1;}elselen=0;for(j=len;j>0;j--)printf(" * ");    printf("\n");}if(overflow>0)printf("有 %d 个单词长度超过了 %d  ",overflow,MAXWORD);}


以下为打印垂直直方图代码段,从两个for语句开始,前面同水平直方图

for(j=MAXHIST;j>0;j--){ //行    for(i=1;i<MAXWORD;i++)       //列  if((len=wl[i]*MAXHIST/maxvalue)>=j)printf("   *");  elseprintf("    ");    printf("\n");}for(i=1;i<MAXWORD;i++) printf("%4d",wl[i]);printf("\n");for(i=1;i<MAXWORD;i++) printf("%4d",i);printf("\n");if(overflow>0)printf("有 %d 个单词长度超过了 %d  ",overflow,MAXWORD);


各字符出现频度的直方图,同水平。

#include<stdio.h>#include<ctype.h>#define MAXCHAR 128 //#define MAXHIST 15 //直方图最长的长度int main(){int c,i,j;int len;//输出*的长度int maxvalue;int cc[MAXCHAR];for(i=0;i<MAXCHAR;i++)cc[i]=0;while((c=getchar())!=EOF){if(c<MAXCHAR)  cc[c]++;}maxvalue=0;for(i=1;i<MAXCHAR;i++){    if(cc[i]>maxvalue)   maxvalue=cc[i];}for(i=1;i<MAXCHAR;i++){    if(isprint(i))    printf("%5d --  %c  --%5d  :",i,i,cc[i]);elseprintf("%5d --      --%5d  :",i,cc[i]);        if(cc[i]>0){    if((len=cc[i]*MAXHIST/maxvalue)<=0)   len=1;}elselen=0;for(j=len;j>0;j--)printf(" * ");printf("\n");}}


0 0
原创粉丝点击