C程序設計語言——例子1.13

#include
#define LENGTH 10  /*規定,輸出爲直方圖的單詞數只能爲LENGTH個*/
#define OUT 0 /*輸入非字母時候的狀態*/
#define IN 1 /*輸入爲字母時候的狀態*/


/*
*該函數最基本的思想是,
*定義一個數組用於保存從第一個出現的單詞到最後一個或者規定限度爲止的單詞的長度,
*定義一個變量用於保存最長的單詞的長度。
*依據上面兩個變量,打印出垂直直方圖。
*主要的判斷是,最長的單詞長度變量依次減一一直減到零,
*在這一過程中,依次判斷長度數組中每個單詞與上面的自減量相比,
*當大於或等於這個變量的時候輸出‘*’,當小於這個變量時,輸出‘ ’。
*/
int main() 
{
int wLengths [LENGTH]; /*用於依次保存單詞長度的數組*/
for(int i = 0; i < LENGTH; i++)
{
wLengths[i] = 0;
}
int maxLength; /*用於保存最長單詞的數組*/

short state; /*用於保存輸入狀態*/
short wl; /*用於計算字長的變量*/
int lIndex; /*用於計算數組的下標*/

int c; /*用於保存當前輸入的字符*/
state = OUT; /*state的初始狀態爲沒有輸入字母*/
wl = 0;
lIndex = 0;
/*判斷當輸入的字符不爲EOF時,則去判斷當下的字符*/
while((c = getchar()) != EOF && lIndex < LENGTH) 
{ /*當c是字母時,如果當前的輸入狀態爲OUT,則改爲IN。wl自增一位。*/
if((c <= 'z' && c >= 'a') || (c <= 'Z' && c > 'A'))
{
if (state == OUT) {
state = IN;
}
wl++;
} else /*當輸入狀態爲IN時,說明剛剛結束一個字母的取值。保存當前wl的長度到數組中去,wl置0;狀態改爲OUT*/
{
if (state == IN) 
{
wLengths[lIndex++] = wl;
if (maxLength < wl) {
maxLength = wl;
}
wl = 0;
}
state = OUT;
if (c == '\n') {
break;
}
}
}

/*現在得到了一個字長的數組wlengths[], 還有一個最大長度的字母
*用着兩個變量打印直方圖。
*/
for (int lenStep = maxLength; lenStep > 0; lenStep--)
{
for (int i = 0; i < LENGTH; i++) 
{
if (wLengths[i] < lenStep)
{
printf("  ");
} else
{
printf("* ");
}
}
printf("\n");

}

/*長度不爲0的輸出作爲直方圖的下標*/
for(int i = 0; i < LENGTH; i++)
{
int wi = wLengths[i];
if (wi != 0) 
{
printf("%d ", wLengths[i]);
}
}

return 0 ;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章