C primer plus 第六版 第八章 第四題 程式設計練習答案
/*
本程式應題目而建立。
題目要求: 遇到EOF之前,將輸入作為字元流讀取。
該程式要求報告平均每個單詞的字母數。
*/
/* 邏輯 - 程式碼構建
本題實現要求的核心結構就是使用標頭檔案 ctype 的 isalpha 判斷是否為字母。
首先建立一個變數 int ch 獲取輸入。
再建立一個變數 int last 儲存上一次輸入。 為了程式完美,需要細緻的判斷。具體看 while 迴圈體 if 的實現。
再去建立 while 迴圈獲取輸入,判斷則放入迴圈體。
while(expression)expression 依舊是 (ch = getchar() ) != EOF
if 判斷是否為 isalpha 字母。
是字母則跳過把。
之所以先判斷是否為字母,是為了last 變數儲存上一個字元。。。具體看 while 迴圈體的實現。
else if 再判斷是否為 ispounct 標點符號,
然後內嵌一個if判斷上一個是否為字母。
如果是則 用一個變數計數字母數量加1 。 正常標點符號前都是一個單詞。。
else if 再判斷是否為 isspace 空白字元(空格,製表符,換行符等)
是則判斷 last 是否為 ispounct。
如果是則表示上一個字母用標點符號結尾,則不計數單詞。
如果不是,就計數單詞。。。
else if 再判斷是否為 isalpha 字母。
是字母則跳過把。
else 就錯誤報告吧,除了 空白,字母,標點符號我還真想不出來還有什麼字元了。。
*/
本來這東西我是放到程式碼裡面的,不過這麼長,而且程式碼裡的註釋是黑色的不好分辨,閱讀艱辛困苦,故而取出單獨放一邊。
/* 本程式應題目而建立。 題目要求: 遇到EOF之前,將輸入作為字元流讀取。 該程式要求報告平均每個單詞的字母數。 */ #include<stdio.h> #include<ctype.h> int main(void) { // 本文讀者會看到last的更新會放入if中。 // 這是因為if判斷時ch已經讀取,結束判斷後則會迭代。所以把last放入if中可以達成儲存上一個字元的效果。 int ch = 0; // Save input. int last = 0; // Save last input. int words = 0; // Save words amount. int letters = 0; // Save character amount. printf("Please input:"); while( (ch = getchar() ) != EOF ) { if(isalpha(ch)) { last = ch; letters++; continue; } else if(ispunct(ch)) { if(isalpha(last)) { // 如果上一個是字母,則計數單詞。 last = ch; words++; printf("This is a words. %c \n", ch); } else { last = ch; } } else if(isspace(ch)) { if(ispunct(last)) { // 如果上一個是標點符號,則不計數單詞數。 last = ch; } else if(isalpha(last)) { // 如果上一個不是標點符號,則代表一個單詞結束,計數單詞數。 last = ch; words++; printf("This is a words. %c \n", ch); } } else { printf("\n\nWarning !!! Switch has some problem. Please fix it !!\n\n"); } } printf("\n\n There have %d words .\n", words); printf("And each words has an average of %d letters. \n", letters/words); printf("Bye ~\n"); getchar(); return 0; }