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 = ;
long lengtharr[MAXWORDLEN + ];
int wordlen = ; int firstletter = ;
long thisval = ; //这个变量对于绘制垂直直方图,很有作用。
long maxval = ;
int thisidx = ;
int done = ;

for(thisidx = ; thisidx <= MAXWORDLEN; thisidx++)
{
lengtharr[thisidx] = ;
}  //为什么不利用 while((c = getchar()) != EOF) 进行接收判断一起进行?这可以处理那些不是以新行结尾的文件。
while(done == )
{
c = getchar();

  //空格、换行、制表、EOF代表单词的结束,可以根据上一个单词的wordlen做统计了,并存放到lengtharr[wordlen - 1]  
if(c == ' ' || c == '\t' || c == '\n' || c == EOF)
{
if(inspace == )
{
firstletter = ;
inspace = ; if(wordlen <= MAXWORDLEN)
{
if(wordlen > )
{
thisval = ++lengtharr[wordlen - ];
if(thisval > maxval)
{
maxval = thisval;
}
}
}
else
{
thisval = ++lengtharr[MAXWORDLEN];
if(thisval > maxval)
{
maxval = thisval;
}
}
}
if(c == EOF)
{
done = ;
}
}
else //统计当前单词的长度
{
if(inspace == || firstletter == )
{
wordlen = ;
firstletter = ;
inspace = ;
}
++wordlen;
}
}

//绘制垂直直方图,这个算法是可以借鉴的。不利用数组存储,而是根据指标变量thisval,也就是当前最大的直方图峰值来绘图。
for(thisval = maxval; thisval > ; thisval--)
{
printf("%4d | ", thisval);
for(thisidx = ; thisidx <= MAXWORDLEN; thisidx++)
{
if(lengtharr[thisidx] >= thisval)
{
printf("* ");
}
else
{
printf(" ");
}
}
printf("\n");
}
printf(" +");
for(thisidx = ; thisidx <= MAXWORDLEN; thisidx++)
{
printf("---");
}
printf("\n ");
for(thisidx = ; thisidx < MAXWORDLEN; thisidx++)
{
printf("%2d ", thisidx + );
}
printf(">%d\n", MAXWORDLEN); return ;
}

样本输出

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

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

  1. c程序设计语言_习题1-16_自己编写getline()函数,接收整行字符串,并完整输出

    Revise the main routine of the longest-line program so it will correctly print the length of arbitra ...

  2. c程序设计语言_习题1-11_学习单元测试,自己生成测试输入文件

    How would you test the word count program? What kinds of input are most likely to uncover bugs if th ...

  3. c程序设计语言_习题7-6_对比两个输入文本文件_输出它们不同的第一行_并且要记录行号

    Write a program to compare two files, printing the first line where they differ. Here's Rick's solut ...

  4. c程序设计语言_习题8-4_重新实现c语言的库函数fseek(FILE*fp,longoffset,intorigin)

      fseek库函数 #include <stdio.h> int fseek(FILE *stream, long int offset, int origin); 返回:成功为0,出错 ...

  5. c程序设计语言_习题8-6_利用malloc()函数,重新实现c语言的库函数calloc()

    The standard library function calloc(n,size) returns a pointer to n objects of size size , with the ...

  6. c程序设计语言_习题1-19_编写函数reverse(s)将字符串s中字符顺序颠倒过来。

    Write a function reverse(s) that reverses the character string s . Use it to write a program that re ...

  7. c程序设计语言_习题1-18_删除输入流中每一行末尾的空格和制表符,并删除完全是空格的行

    Write a program to remove all trailing blanks and tabs from each line of input, and to delete entire ...

  8. c程序设计语言_习题1-9_将输入流复制到输出流,并将多个空格过滤成一个空格

    Write a program to copy its input to its output, replacing each string of one or more blanks by a si ...

  9. php实现 统计输入中各种字符的个数

    php实现 统计输入中各种字符的个数 一.总结 一句话总结:谋而后动,想清楚,会非常节约编写代码的时间. 1.对结果可能是0的变量,记得初始化? 4 $len=0; 5 $len=strlen($st ...

随机推荐

  1. mysql 数据库还原出错ERROR:Unknown command '\' mysql中断

    其实造成这个问题的原因还是由于编码的问题,网站数据库设置的是gbk 的,mysql默认是gbk:但是在导出数据的时候导出了utf8的sql文件,不管我如何重新导入,在连接数据库后使用set names ...

  2. hdu 5056 Boring count

    贪心算法.需要计算分别以每个字母结尾的且每个字母出现的次数不超过k的字符串,我们设定一个初始位置s,然后用游标i从头到尾遍历字符串,使用map记录期间各个字母出现的次数,如果以s开头i结尾的字符串满足 ...

  3. Linux C 程序 函数,数组,指针,gdb调试器(SEVEN)

    函数,数组,指针,gdb调试器 1.函数定义 如果明确指定返回类型,默认为int 参数传递:实参对形参的参数传递是单向的,实参只是把自己的值赋给形参.                      形参的 ...

  4. java 的输入/输出

    java 的输入/输出 java的 I/O是通过java.io包下的类和接口支持, 其中最重要的是5个类,分别是 File,OutputStream,InputStream, Write,Reader ...

  5. TeeChart 的应用

    TeeChart 是一个很棒的绘图控件,不过由于里面没有注释,网上相关的资料也很少,所以在应用的时候只能是一点点的试.为了防止以后用到的时候忘记,我就把自己用到的东西都记录下来,以便以后使用的时候查询 ...

  6. discuz 重新定义jquery的$

    最近做个小插件 发现加了这个代码不执行: $.ajax({ url:'plugin.php?id=register:regeist_jiangsu', type:'post', data:{ 'mob ...

  7. struts2 修改action的后缀

    struts2 修改action的后缀 struts2 的默认后缀是 .action 虽然很直观,但是很烦琐.很多人喜欢将请求的后缀改为 .do 在struts2中修改action后缀有两种比较简单的 ...

  8. 关于ASE日志空间示数不正常的解决办法

        最近某系统的ASE数据库出现了异常,经过各种努力,终于把数据库正常又起起来了.但是经过检查,发现在查看剩余日志空间的时候(sp_helpsegment 'logsegment'),发现显示出来 ...

  9. RS232转RS485电路图分析

    在电子发烧友网站上,看到RS232转RS485的一个电路图,如下图所示.元件主要是HN232CP和MAX485CPA,也就是TTL转232电路和TTL转485电路的结合体.可是这个电路却不好分析,几经 ...

  10. 【filter】springmvc web.xml

    1.filter用于拦截用户请求,在服务器作出响应前,可以在拦截后修改request和response,这样实现很多开发者想得到的功能. 2.filter实现 ×编写一个继承Filter接口的类 ×在 ...