近日再看《c語言程序設計第二版》,做了一下上面的習題。
1.編寫程序,打印出輸入中單詞長度的直方圖。
2.編寫程序,打印出輸入中各個字符出現頻率的直方圖。
先來說第一題,沒輸入一個一個單詞後,你就要出入一個空格,接著輸入一個單詞,在輸入一個空格,依此循環輸入。當一個句子輸入完了,就需要隔行另起一段。
例:
i am a studen
第1個單詞長度為1
第2個單詞長度為2
第3個單詞長度為1
第4個單詞長度為6
但是,當每輸入完一個單詞的時候需要用空格隔開,然後在輸入,編寫的過程,要判斷,詳情看代碼。
通過維基百科查詢,目前最長單詞的長度為30,有個很長的大概是225多個字母,不過我向我們一般也用不著它。
將最長字母長度MAXWORD設置為30,如果你喜歡你可以設置成任意長度
建立單詞長度數組word length,簡稱為wl[].
數組最大為wl[MAXWORLD]
將單詞長度數組中的值全部值為0
int i;
for(i = 1; i <= MAXWORD; i++)
wl[i] = 0;
為什麼要這樣做?
我遇到這個題目的時候是這麼想的,每輸入一個單詞,將其長度放入數組中保存著。
於是,我就寫呀寫呀,寫了好長時間。
後來我就沒寫了,翻了下原來的筆記,看看了,原來可以這麼想,一下子事情變得簡單多了。
我將長度為1~30的字母,分別歸類長度為1的、長度為2、長度為3等等,然後將其放入數組,讓它們保存著。
例:
internet 這個單詞長度為8,我就將其放入數組wl[8],
如果還有相同長度放入wl[8]中,wl[8]的值就得+1啦。
所以該寫成++wl[8]。
現在思路明白了,我們可以這麼寫了。
#include <stdio.h>
#define MAXWORD 30 //單詞的最大長度
#define IN 1 //在單詞內,即沒有遇到空格
#define OUT 0 //在單詞外,即遇到了空格
/*word length ==> wl單詞長度簡稱*/
int wl()
{
int c;
int i;
int nc;
int state; //state為單詞的狀態:IN或OUT;
int overflow; //操過MAXWORD的單詞個數
int wl[MAXWORD]; //長度為1~30的的字符長度統計
state = OUT;
nc = 0;
overflow = 0;
for(i = 1; i < MAXWORD; ++i)
wl[i] = 0;
while((c = getchar()) != EOF)
if(c == ' ' || c == '\n' || c == '\t')
{
state = OUT;
if(nc > 0)
if(nc < MAXWORD)
++wl[nc];
else
++overflow;
nc = 0;
}
else if(state == OUT)
{
state = IN;
nc = 1;
}
else
++nc;
for(i = 1; i < MAXWORD; ++i)
printf("長度為:%d的單詞個數為:%d : \n\n", i, wl[i]);
return 0;
}
main()
{
wl();
}
不擅長寫作,文章僅供參考,如有錯誤請指正。
Have a nice day!!!
摘自 Aric小屋