『cプログラム設計言語』練習1-12


cプログラム設計言語練習1-12:入力を1行1単語で印刷するプログラムを作成する.ここで単語は、スペース、TABキー、改行文字、ファイル終了記号(EOF)以外の文字を指します.私のコードは次のとおりです.「the c answer book」のコードは次の通りです.
 
   1. #include 《stdio.h>  
   2.   
   3. #define IN 1  
   4. #define OUT 0  
   5.   
   6. /* print input one word perl line*/  
   7. main()  
   8. {  
   9.   int c,state;  
  10.     
  11.   state = OUT;  
  12.   while((c = getchar()) !=EOF){  
  13.     if(c == ' '||c == '
' || c == '\t'){ 14. if(state == IN){ 15. putchar('
'); 16. state = OUT; 17. } 18. } else if (state == OUT){ 19. state = IN; 20. putchar(c); 21. }else 22. putchar(c); 23. } 24. }
 
このプログラムはこの問題を解決することができますが、プログラム全体が少し冗長に見えます(結局、この本は1988年に出版されました).最後の2つの状況は完全に統合できますので、別のサイトの答えは以下の通りです.
   1. #include <stdio.h>  
   2. int main(void)  
   3. {  
   4.   int c;  
   5.   int inspace;  
   6.   
   7.   inspace = 0;  
   8.   while((c = getchar()) != EOF)  
   9.   {  
  10.     if(c == ' ' || c == '\t' || c == '
') 11. { 12. if(inspace == 0) 13. { 14. inspace = 1; 15. putchar('
'); 16. } 17. /* else, don't print anything */ 18. } 19. else 20. { 21. inspace = 0; 22. putchar(c); 23. } 24. } 25. return 0; 26. }
 
 
これは少しよく見えますが、まだ簡潔ではありません.ただしcプログラム設計言語で与えられたプログラムは(教科書1.5.4単語カウントのプログラムは、このプログラムや練習問題1-9と実は同じ問題です)簡潔です.このプログラムは表面的には簡単そうに見えますが、私の頭で、最初に思いついたのは文字配列を探して単語を記憶して出力することです.後でよく考えてみると、putcharをそのまま使えばいいです.このアルゴリズムは前の文字と現在の文字の値(各値は空白文字または単語文字)は4つのケースに分けられます.値の特殊性によっては操作が不要な場合がありますので、2つのケースにまとめることができ、論理的にもより明確に見えます.私が書いたコードは次のとおりです.
   1. #include <stdio.h>  
   2.   
   3. #define TRUE 1  
   4. #define FALSE 0  
   5.   
   6. int main()  
   7. {  
   8.   int c; /* a character variable */  
   9.   int b; /* a bool variable whose value is TRUE or FALSE  
  10.       which indicates current character is in a word or out of a word*/  
  11.   
  12.   b = FALSE;  
  13.   while( (c = getchar()) != EOF)  
  14.     if( c != ' ' && c != '\t' && c != '
') 15. { 16. putchar(c); 17. b = TRUE; 18. } 19. else if(b == TRUE) 20. { 21. printf("
"); 22. b = FALSE; 23. } 24. return 0; 25. }