c程序设计语言练习1-12:编写一个程序,以每行一个单词的形式打印其输入。
此处单词是指除空格,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 == '\n' || c == '\t'){
14. if(state == IN){
15. putchar('\n');
16. state = OUT;
17. }
18. } else if (state == OUT){
19. state = IN;
20. putchar(c);
21. }else
22. putchar(c);
23. }
24. }
这个程序能够解决这个习题,但是整个程序看起来却有点冗余(毕竟这本书是1988年出版的)。因为最后的两种情况完全可以合并。
所以另一个网站 给出的答案如下:
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 == '\n')
11. {
12. if(inspace == 0)
13. {
14. inspace = 1;
15. putchar('\n');
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就可以了。这个算法根据前一个字符和当前字符的值(每个值都可能是空白字符或者单词字符)分成四种情况。而根据其值的特殊性有些情况下是不需要做任何操作,所以可以合并成两种情况就可以了,这样看起来逻辑也更清晰一些。
我写的代码如下:
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 != '\n')
15. {
16. putchar(c);
17. b = TRUE;
18. }
19. else if(b == TRUE)
20. {
21. printf("\n");
22. b = FALSE;
23. }
24. return 0;
25. }
本文探讨了C程序设计语言中单词打印程序的不同实现方法。通过对比原始代码与优化后的代码,详细分析了如何简化程序逻辑并提高代码的可读性。
725

被折叠的 条评论
为什么被折叠?



