编写一个程序,打印输入中单词长度的直方图.垂直方向
1.问题描述与分析
描述:编写一个程序,打印输入中单词长度的直方图.水平方向的直方图比较容易绘制,垂直方向的直方图则比较困难.当然是选难的做了.
分析:本题目主要有两个要求(1):统计一段文本中单词的长度分布 (2)将单词长度的分布用直方图打印出来
(1):单词长度分布,我们这里的单词比较广,只要连着没有被空格 换行符 制表符分开就算.可能存在多个空格,多个空行,所以要判断当前状态是否在一个单词内.
在单词内遇到空格,说明是单词的边界,可以将单词的长度存入相应数组,并清空对单词长度的统计.
(2)打印垂直直方图, 循环分为y轴和x轴,我们先要知道y的最大值(某长度的单词数量最多的那个),从上向下打印
以红线时i的值为例,在红线上面的打印**,在红线下面的打印空格.所以我们外层循环(y轴)要判断的就是 当前i 与某长度的单词的数量.
2.
1 /** 2 *************** 3 * 2018-4-7 4 * Author : 五块钱的鸡腿 5 * 打印输入中单词长度的直方图.垂直方向 6 * 7 **/ 8 9 #include <stdio.h> 10 #include <stdlib.h> 11 12 #define Word_IN 1 /* 在单词内*/ 13 #define Word_Out 0 /* 在单词外*/ 14 15 #define MaxWordLen 15 //单词的最大长度 16 17 void vertical(int a[] ,int n); 18 19 int main() 20 { 21 int c,i,j,wordLength; 22 int overflowWord = 0; //单词长度超过单词的最大长度的个数 23 //存放不同长度的单词个数. 单词长度为1的存放在 wordGraph[0] 24 int wordGraph[MaxWordLen]; 25 26 //初始化数组 27 for(i = 0; i< MaxWordLen; ++i){ 28 wordGraph[i] = 0; 29 } 30 31 int state = Word_Out; //初始在单词外 32 while((c = getchar()) != EOF){ 33 if(c ==' ' || c == '\t' || c == '\n'){ 34 if(state == Word_IN){ //遇到空格和制表符判断是否在单词内 35 if(wordLength <= MaxWordLen){ 36 wordGraph[wordLength - 1]++; 37 state = Word_Out; 38 } 39 else{ 40 ++overflowWord; 41 } 42 wordLength = 0; //清除单词的长度,为统计下一个单词做准备. 43 } 44 } 45 else{ 46 state = Word_IN; 47 ++wordLength; //在单词内,单词长度+1 48 } 49 } 50 //调用函数 51 vertical(wordGraph,MaxWordLen); 52 printf("\nThe overflow wrod num is:%d",overflowWord); 53 } 54 55 //打印垂直直方图 56 void vertical(int a[],int n){ 57 //1.寻找直方图最大值 58 int i,j,max=0; 59 for(i=0;i<n;++i){ 60 if(a[i]>max){ 61 max =a[i]; 62 } 63 } 64 //2.值为0的不打印 65 //外循环打印 y轴 高度 66 //内循环打印 x轴 67 for(i = max;i > 0; --i){ //从值最大的开始打印 68 for(j = 0;j < n; ++j){ 69 if(a[j] != 0){ //如果值为0,说明不存在此长度的单词,不打印 70 if(a[j] >= i){ 71 printf("** "); 72 } 73 else{ 74 printf(" "); 75 } 76 } 77 } 78 printf("\n"); 79 } 80 //打印单词的长度 81 for(j = 0;j < n; ++j){ 82 if(a[j] != 0){ 83 printf("%-4d",j + 1); 84 } 85 } 86 printf("\n"); 87 //打印各个单词长度的个数 88 for(j = 0;j < n; ++j){ 89 if(a[j] != 0){ 90 printf("%-4d",a[j]); 91 } 92 } 93 }
3.结果
我从网上随意找了几百单词的英文短文粘贴上去.结果如下.太长了,没有截下.但是从数量上可以看到单词长度为2,3,4的数量最多