• c程序设计语言_习题1-13_统计输入中单词的长度,并且根据不同长度出现的次数绘制相应的直方图


    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.
    统计输入中单词的长度,并且绘制相应的直方图。水平的直方图比较容易绘制,垂直的直方图较困难一些

    /* This program was the subject of a thread in comp.lang.c, because of the way it handled EOF.
     * The complaint was that, in the event of a text file's last line not ending with a newline,
     * this program would not count the last word. I objected somewhat to this complaint, on the
     * grounds that "if it hasn't got a newline at the end of each line, it isn't a text file".
     *
     * These grounds turned out to be incorrect. Whether such a file is a text file turns out to
     * be implementation-defined. I'd had a go at checking my facts, and had - as it turns out -
     * checked the wrong facts! (sigh)
     *
     * It cost me an extra variable. It turned out that the least disturbing way to modify the
     * program (I always look for the least disturbing way) was to replace the traditional
     * while((c = getchar()) != EOF) with an EOF test actually inside the loop body. This meant
     * adding an extra variable, but is undoubtedly worth the cost, because it means the program
     * can now handle other people's text files as well as my own. As Ben Pfaff said at the
     * time, "Be liberal in what you accept, strict in what you produce". Sound advice.
     *
     * The new version has, of course, been tested, and does now accept text files not ending in
     * newlines.
     *
     * I have, of course, regenerated the sample output from this program. Actually, there's no
     * "of course" about it - I nearly forgot.
     */
    
    #include <stdio.h>
    
    #define MAXWORDLEN 10
    
    int main(void)
    {
      int c;
      int inspace = 0;
      long lengtharr[MAXWORDLEN + 1];
      int wordlen = 0;
    
      int firstletter = 1;
      long thisval = 0;  //这个变量对于绘制垂直直方图,很有作用。
      long maxval = 0;
      int thisidx = 0;
      int done = 0;
    
    for(thisidx = 0; thisidx <= MAXWORDLEN; thisidx++) { lengtharr[thisidx] = 0; }

     //为什么不利用 while((c = getchar()) != EOF) 进行接收判断一起进行?这可以处理那些不是以新行结尾的文件。
    while(done == 0) { c = getchar();
      //空格、换行、制表、EOF代表单词的结束,可以根据上一个单词的wordlen做统计了,并存放到lengtharr[wordlen - 1]  
    if(c == ' ' || c == ' ' || c == ' ' || c == EOF) { if(inspace == 0) { firstletter = 0; inspace = 1; if(wordlen <= MAXWORDLEN) { if(wordlen > 0) { thisval = ++lengtharr[wordlen - 1]; if(thisval > maxval) { maxval = thisval; } } } else { thisval = ++lengtharr[MAXWORDLEN]; if(thisval > maxval) { maxval = thisval; } } } if(c == EOF) { done = 1; } } else //统计当前单词的长度 { if(inspace == 1 || firstletter == 1) { wordlen = 0; firstletter = 0; inspace = 0; } ++wordlen; } }
    //绘制垂直直方图,这个算法是可以借鉴的。不利用数组存储,而是根据指标变量thisval,也就是当前最大的直方图峰值来绘图。
    for(thisval = maxval; thisval > 0; thisval--) { printf("%4d | ", thisval); for(thisidx = 0; thisidx <= MAXWORDLEN; thisidx++) { if(lengtharr[thisidx] >= thisval) { printf("* "); } else { printf(" "); } } printf(" "); }
    printf(
    " +"); for(thisidx = 0; thisidx <= MAXWORDLEN; thisidx++) { printf("---"); } printf(" "); for(thisidx = 0; thisidx < MAXWORDLEN; thisidx++) { printf("%2d ", thisidx + 1); } printf(">%d ", MAXWORDLEN); return 0; }



    样本输出


    Here's the output of the program when given its own source as input:

     113  | *                                
     112  | *                                
     111  | *                                
     110  | *                                
     109  | *                                
     108  | *                                
     107  | *                                
     106  | *                                
     105  | *                                
     104  | *                                
     103  | *                                
     102  | *                                
     101  | *                                
     100  | *                                
      99  | *                                
      98  | *                                
      97  | *                                
      96  | *                                
      95  | *                                
      94  | *  *                             
      93  | *  *                             
      92  | *  *                             
      91  | *  *                             
      90  | *  *                             
      89  | *  *                             
      88  | *  *                             
      87  | *  *                             
      86  | *  *                             
      85  | *  *                             
      84  | *  *                             
      83  | *  *                             
      82  | *  *                             
      81  | *  *                             
      80  | *  *                             
      79  | *  *                             
      78  | *  *                             
      77  | *  *                             
      76  | *  *                             
      75  | *  *                             
      74  | *  *                             
      73  | *  *                             
      72  | *  *                             
      71  | *  *                             
      70  | *  *                             
      69  | *  *                             
      68  | *  *                             
      67  | *  *                             
      66  | *  *                             
      65  | *  *                             
      64  | *  *                             
      63  | *  *  *                          
      62  | *  *  *                          
      61  | *  *  *                          
      60  | *  *  *                          
      59  | *  *  *                          
      58  | *  *  *                          
      57  | *  *  *                          
      56  | *  *  *                          
      55  | *  *  *                          
      54  | *  *  *                          
      53  | *  *  *                          
      52  | *  *  *  *                       
      51  | *  *  *  *                       
      50  | *  *  *  *                       
      49  | *  *  *  *                       
      48  | *  *  *  *                       
      47  | *  *  *  *                       
      46  | *  *  *  *                       
      45  | *  *  *  *                       
      44  | *  *  *  *                       
      43  | *  *  *  *        *              
      42  | *  *  *  *        *              
      41  | *  *  *  *        *              
      40  | *  *  *  *        *              
      39  | *  *  *  *        *              
      38  | *  *  *  *        *              
      37  | *  *  *  *        *              
      36  | *  *  *  *        *              
      35  | *  *  *  *        *              
      34  | *  *  *  *        *              
      33  | *  *  *  *        *              
      32  | *  *  *  *        *              
      31  | *  *  *  *        *              
      30  | *  *  *  *        *           *  
      29  | *  *  *  *        *           *  
      28  | *  *  *  *  *     *           *  
      27  | *  *  *  *  *     *           *  
      26  | *  *  *  *  *     *           *  
      25  | *  *  *  *  *  *  *           *  
      24  | *  *  *  *  *  *  *           *  
      23  | *  *  *  *  *  *  *           *  
      22  | *  *  *  *  *  *  *        *  *  
      21  | *  *  *  *  *  *  *        *  *  
      20  | *  *  *  *  *  *  *        *  *  
      19  | *  *  *  *  *  *  *        *  *  
      18  | *  *  *  *  *  *  *        *  *  
      17  | *  *  *  *  *  *  *        *  *  
      16  | *  *  *  *  *  *  *        *  *  
      15  | *  *  *  *  *  *  *        *  *  
      14  | *  *  *  *  *  *  *  *     *  *  
      13  | *  *  *  *  *  *  *  *     *  *  
      12  | *  *  *  *  *  *  *  *     *  *  
      11  | *  *  *  *  *  *  *  *     *  *  
      10  | *  *  *  *  *  *  *  *     *  *  
       9  | *  *  *  *  *  *  *  *  *  *  *  
       8  | *  *  *  *  *  *  *  *  *  *  *  
       7  | *  *  *  *  *  *  *  *  *  *  *  
       6  | *  *  *  *  *  *  *  *  *  *  *  
       5  | *  *  *  *  *  *  *  *  *  *  *  
       4  | *  *  *  *  *  *  *  *  *  *  *  
       3  | *  *  *  *  *  *  *  *  *  *  *  
       2  | *  *  *  *  *  *  *  *  *  *  *  
       1  | *  *  *  *  *  *  *  *  *  *  *  
          +---------------------------------
            1  2  3  4  5  6  7  8  9 10 >10
    
  • 相关阅读:
    大道至简读后感
    CodeWarrior10 如何复制Workspace配置到另一个workspace
    CCS 6新建文件自动生成注释
    C语言之标准头文件模板
    C语言之标准源文件模板
    正确理解c和c ++的复杂类型声明
    各种滤波算法的介绍及其实现
    函数的前部注释
    关于C语言头文件写法的探讨
    02_温湿度传感器
  • 原文地址:https://www.cnblogs.com/haore147/p/3647930.html
Copyright © 2020-2023  润新知