标题:做练习题,运行成功了但觉得逻辑好乱~程序还可以更加简单吗?
只看楼主
Man丶諦
Rank: 1
等 级:新手上路
帖 子:50
专家分:5
注 册:2016-7-22
结帖率:100%
已结贴  问题点数:18 回复次数:8 
做练习题,运行成功了但觉得逻辑好乱~程序还可以更加简单吗?
程序代码:
/* 练习1-9 编写一个将输入复制到输出的程序,并将其中连续的多个空格用一个空格代替 */

/* 编程思路:

 * 判断是否输入的是空格,并且变量状态为0 

 *   是的话,输出空格 把变量赋值为1

 * 在判断是不是空格,不是就直接输出字符并把变量状态回复为0

 */


#include <stdio.h>

int main(void)
{
    int state, c;

    state = 0;

    while((c = getchar()) != EOF){
        if ( c == ' ' && state == 0 ){
            putchar(c);
            state = 1;
        }   

        else if ( c != ' ' ) {
            putchar(c);
            state = 0;
        }
    }
    return 0;
}
          
感觉后面在判断一次是不是空格好多余。

搜索更多相关主题的帖子: 练习题 
2016-07-23 15:51
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
得分:6 
按题目的要求,必须要判断是不是空格。
假设:c=' ',state!=0;  
if ( c == ' ' && state == 0 )将不执行,如果else不加判断,
那么就会执行else,使state=0。
同时else输出空格,这样就达不到多个连续空格用合并成一个空格输出的效果。
所以说else的判断是必要的。

[此贴子已经被作者于2016-7-23 17:19编辑过]

2016-07-23 17:14
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2276
专家分:10647
注 册:2015-3-19
得分:6 
   
程序代码:
while((c = getchar()) != EOF){
         if ( state == ' ' && c == ' ' ){
            continue;
         } 
        putchar(c);
        state =c;
     }

剑栈风樯各苦辛,别时冰雪到时春
2016-07-23 17:23
Man丶諦
Rank: 1
等 级:新手上路
帖 子:50
专家分:5
注 册:2016-7-22
得分:0 
回复 2楼 linlulu001
这样,那有什么别的方法来解决这个问题吗?
  我写完练习后看了习题解答后对解答的程序有个疑惑: int整型可以对其赋值字母吗?
程序代码:
#include <stdio.h>

#define NONBLANK 'a'                                // 这个符号常量有什么用? 把它赋值给 lastc 变量

main()
{
        int c, lastc;

        lastc = NONBLANK;                    // int整形可以赋值字母?
        while ((c = getchar()) != EOF){
                if (c != ' ')                                       // 判断不是空格 就输出
                        putchar(c);
                if (c == ' ')                                     //  判断如果是空格就,在判断 lastc 不是空格,输出
                        if (lastc != ' ')   
                                putchar(c);
                lastc = c;                                        // 把这个输入的字符赋值给 lastc
        }
}


电脑小白~啥也不懂~
现在掉进了Linux的坑~
从C语言开始~我的计算机旅行~
2016-07-23 17:32
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
得分:0 
(c = getchar()) != EOF
因为getchar函数除了返回终端输入的字符外,在遇到Ctrl+D(Linux下)即文件结束符EOF时,getchar ()的返回EOF,这个EOF在函数库里一般定义为-1。
因此,在这种情况下,getchar函数返回一个负值,把一个负值赋给一个char型的变量是不正确的。
为了能够让所定义的变量能够包含getchar函数返回的所有可能的值,所以用int。
2016-07-23 17:43
Man丶諦
Rank: 1
等 级:新手上路
帖 子:50
专家分:5
注 册:2016-7-22
得分:0 
回复 3楼 林月儿
程序代码:
#include <stdio.h>
int main(void)
{
        int c, state;
        while((c = getchar()) != EOF){
                if ( state == ' ' && c == ' ' ){        // 判断state 和 c是不是都等于空格~如果是就直接跳出循环
                        continue;
                }
                putchar(c);                             // 如果是字母就直接输出
                state = c;                              // 把这一个字符赋值给 state 好进行下一个字符的判断
        }
        return 0;
}


哈哈,理解了,这样就感觉简洁多了。没有呢么多判断~

电脑小白~啥也不懂~
现在掉进了Linux的坑~
从C语言开始~我的计算机旅行~
2016-07-23 17:43
Man丶諦
Rank: 1
等 级:新手上路
帖 子:50
专家分:5
注 册:2016-7-22
得分:0 
回复 5楼 linlulu001
原来是这样,EOF的值是 -1。
        我刚刚试了下把变量c 给改为char字符型。 程序也编译成功了。运行也没有错误啊?
这又是什么原因。是因为我输入 ctrl+D 程序直接结束了所以没有错误出现吗?

程序代码:
#include <stdio.h>
int main(void)
{
        char c, state;

        while((c = getchar()) != EOF){
                if ( state == ' ' && c == ' ' ){        // 判断state 和 c是不是都等于空格~如果是就直接跳出循环
                        continue;
                }
                putchar(c);                             // 如果是字母就直接输出
                state = c;                              // 把这一个字符赋值给 state 好进行下一个字符的判断
        }
        return 0;
}


电脑小白~啥也不懂~
现在掉进了Linux的坑~
从C语言开始~我的计算机旅行~
2016-07-23 17:51
zx315
Rank: 5Rank: 5
来 自:广东
等 级:职业侠客
威 望:2
帖 子:86
专家分:378
注 册:2016-7-13
得分:6 
回复 7楼 Man丶諦
之所以不把 c 声明成 char 型,是因为 c 需要足够大,能够存储任何可能的字符外,还要存储 EOF,而 EOF 本身是 int 类型,而它的值在不同的系统中不一定都是 -1 。

===
可参考《C程序设计语言》1.5.1 小节

Read The Fucking Source Code~
2016-07-23 18:27
Man丶諦
Rank: 1
等 级:新手上路
帖 子:50
专家分:5
注 册:2016-7-22
得分:0 
回复 8楼 zx315
去看了,昨天看过,现在又给忘了。
  我现在就在自学这边书~

电脑小白~啥也不懂~
现在掉进了Linux的坑~
从C语言开始~我的计算机旅行~
2016-07-23 18:42



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-467169-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.193506 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved