| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 469 人关注过本帖
标题:编写一个文章,打印其输入文件中单词长度的直方图 代码如下
只看楼主 加入收藏
stanlc
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2013-11-5
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:5 
编写一个文章,打印其输入文件中单词长度的直方图 代码如下
#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(done == 0)
  {
    c = getchar();

    if(c == ' ' || c == '\t' || c == '\n' || 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;
    }
  }

  for(thisval = maxval; thisval > 0; thisval--)
  {
    printf("%4d  | ", thisval);
    for(thisidx = 0; thisidx <= MAXWORDLEN; thisidx++)
    {
      if(lengtharr[thisidx] >= thisval)
      {
        printf("*  ");
      }
      else
      {
        printf("   ");
      }
    }
    printf("\n");
  }
  printf("      +");
  for(thisidx = 0; thisidx <= MAXWORDLEN; thisidx++)
  {
    printf("---");
  }
  printf("\n       ");
  for(thisidx = 0; thisidx < MAXWORDLEN; thisidx++)
  {
    printf("%2d ", thisidx + 1);
  }
  printf(">%d\n", MAXWORDLEN);

  return 0;
}

firstletter在这里有什么用? 还有垂直方向是怎么实现直方图的?
搜索更多相关主题的帖子: include 直方图 文章 单词 
2013-11-05 22:37
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
收藏
得分:0 
字面意义就是第一个字母了,估计是碰到的某个字符出现的第一次的时候记录一下

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2013-11-06 06:44
pangshch
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:2
帖 子:443
专家分:1966
注 册:2013-4-9
收藏
得分:10 
firstletter 的作用是作为一个标记
当你输入单词的第一个字符时,等于1,
跳出这个单词时等于0;
但是这个标记其实与inspace有重复的现象
另外你的代码也不是很好,例如我输出40个同样长度的单词.那图就拉得很长了.
这道题的原题是C语言之父的<<C程序设计语言 第2版>>中的一道练习题
建议找这本书的练习题答案看看
2013-11-06 09:07
stanlc
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2013-11-5
收藏
得分:0 
回复 3楼 pangshch
这道就是那本书上的习题啊
2013-11-06 22:46
pangshch
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:2
帖 子:443
专家分:1966
注 册:2013-4-9
收藏
得分:10 
回复 4楼 stanlc
首先,建立一个数组, 数组的下标表示单词的长度, 数组的值表示出现的次数
例如: a[4]=6 的话,说明长度为5的单词出现6次.(下标从0开始,0为长度为1的单词)
输入完后, 数组的值也出来了, 例如: a[10] = {0,0,3,5,3,13,0,0,1,1}
画图的原理,
S1: 取最大值 max = 13
S2: 从数组第一个数开始遍历
S3: 如果数组元素的值大于或等于max, 输出"*", 否则输出"  "
S4: max减1;
S5: 如果max > 0, 跳到S2;
如果不理解,用笔在纸上模拟画.

另外, 你附的代码不是很好, 建议网上下载这本书的习题答案. 里面的代码对学习很有用.

[ 本帖最后由 pangshch 于 2013-11-7 20:51 编辑 ]
2013-11-07 20:48
柿饼123
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2013-11-8
收藏
得分:0 
2013-11-08 20:18
快速回复:编写一个文章,打印其输入文件中单词长度的直方图 代码如下
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016181 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved