write a program to print a histogram of the lengths of words in its input.It is easy to draw the histogram with the bars horizontal;a vertical orientation is more challenging.

#include <stdio.h>

#define    MAXHIST  15        /*max length of histogram */
#define    MAXWORD   11       /*max length of a word */
#define     IN        1       /*inside a word */
#define     OUT        0      /*outside a word */

/*print a horizontal histogram              */
int main(){
    int c, i, nc, state;
    int len;                      /*length of each bar */
    int maxvalue;                  /*maximum value for wl[]   */
    int ovflow;                    /*number of overflow words */
    int wl[MAXWORD];               /*word length counters */

     state =OUT;
     nc = 0;                  /*number of chars in a word */
     ovflow =0                /*number of words >= MAXWORDS*/
     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;           /*beginning of a new word */
                 }else
                      ++nc;             /*inside a word */
            }
             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 = 1;
                }else
                     len  = 0;
                while(len > 0){
                      putchar(' * ');
                      --len;
                }
                 putchar('\n');
            }
             if (ovflow > 0)

                 printf("There are %d  words >= %d\n", ovflow, MAX\WORD);
} 


/*
     VERTICAL HISTOGRAM
*/
#include <stdio.h>

#define   MAXHIST        15      /*max length of histogram */
#define   MAXWORD         11     /*max length of a word     */
#define     IN             1         /* inside a word */
#define      OUT           0         /*outside a word */

/*print vertical histogram */
int main(){
      int c, i, j, nc, state;
       int maxvalue;                 /*maximum value for wl[]   */
       int ovflow;                   /*number of overflow words  */
       int wl[MAXWORD];              /*word length counters   */
       state = OUT;
       nc = 0;                       /*number of chars in a word */
       ovflow = 0;                 /*number of words >= MAXWORD   */
       for (i = 0; i < MAXWORD; ++i)
             wl[i] = OUT;
       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;          /*beginning of a new word   */
             }else
                   ++nc;          /*inside a word             */
       }
        maxvalue = 0;
        for(i = 1; i< MAXWORD; ++i)
            if (wl[i] > maxvalue)
                maxvalue  = wl[i];
       for (i = MAXHIST; i > 0; --i){
           for (j = 1; j < MAXWORD; ++j)
                if (wl[j] = MAXHIST /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');
       if (ovflow > 0)
           printf("There are %d words >= %d\n", ovflow, MAXWORD);      
                 
}

Leave a comment