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的數量最多