1. 程式人生 > >C primer plus 第六版 第八章 第四題 程式設計練習答案

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;
}