| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2596 人关注过本帖
标题:有道程序分析不来,请指点迷津~
只看楼主 加入收藏
李若斌
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:219
专家分:184
注 册:2009-9-30
收藏
得分:0 
明白了  last在碰到第一个字符是空格之前有过赋值,所以才能做到让下面的putchar(c),然后下面再给last重新赋值为C那样使last成了上一个输出的字符,这样就能成为控制下一个不是空格的字符输出条件。
2009-11-12 22:47
longlong89
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:小飞侠
威 望:6
帖 子:1043
专家分:2754
注 册:2009-8-18
收藏
得分:0 
16L:
推荐你这本书The C Programming language(中文版新版),可以参照这本书上的风格
此书乃经典之作,认真看,你会收获很多
EOF是文件结束符,while((a=getchar())!=EOF)当输入为EOF值时判断为假,自然直接结束
源文件无法保存这个你自己找下吧(实在不好说),可能跟你软件环境有关
LS:
第一处:是变量
第二处: 是被赋值了,宏定义只是简单的字符转换
第三处:要解决的问题:将多个空格转换成一个空格,答案,是
第四处:是

想象力征服世界
2009-11-12 22:53
zouleitzk520
Rank: 1
等 级:新手上路
帖 子:15
专家分:5
注 册:2009-11-2
收藏
得分:0 
#include <stdio.h>

#define NONBLANK 'a'\*宏定义一个值a*\

main()
{
    int c, lastc;
   
    lastc = NONBLANK;\*把你的nonblank的值a赋给lastc*\
    while((c = getchar()) != EOF) \*判断当输入的字符等不等于EOF,如果不等执行IF*\
    {
        if(c != ' ')\*判断c等不等' ',如果不等输出c*\
            putchar(c);
        if(c == ' ')\*判断c是不是等于’’,成立则执行下面的IF*\
            if(lastc != ' ')\*判断如果lastc不等于’’,执行下面的*\
                putchar(c);\*输出C*\
        lastc = c;
    }
}
2009-11-12 23:03
michaelyj
Rank: 1
来 自:上海
等 级:新手上路
帖 子:55
专家分:0
注 册:2009-10-27
收藏
得分:0 
楼上几位大哥说的我还不是很明白,我还没搞懂!

#include <stdio.h>

#define NONBLANK 'a'      /*这个定义在这个程序中到底起了什么关键性作用?*/

main()
{
    int c, lastc;
    lastc = NONBLANK;       /*为什么要让这个常量赋值给这个变量?*/
   
    while((c = getchar()) != EOF)       /*如果输入的字符中不含有EOF,就执行循环体,这我明白*/
        if(c != ' ')       /*这句我搞不懂,执行循环体后,   如果(c 不等于 空格)就执行下一句?*/
            putchar(c);    /*那如果我输入的字符里带有空格呢?那这个程序就不运行了?*/
}

光上面的程序我运行后,效果是这样的,当我无论输入多少空格,它都无视我的空格,不让我打印空格!

继续下面的,恕小弟愚昧,实在看不懂各位大哥注解!完全读不通!

        if(c == ' ')   /*如果(C 等于 空格),就执行下面的如果,是这个意思吗?*/
            if(lastc != ' ')    /*如果(lastc 不等于 空格)就执行putchar(c),我觉得奇怪,lastc不会有空格啊,因为上面已经说明了lastc = NONBLANK = 'a'吗?我只看见个A,那里来的空格啊?不解*/
                putchar(c);   /*这个程序怎么会有2个putchar(c)?*/
        lastc = c;    /*  C变量存储的字符赋值给变量lastc?,lastc = NONBLANK,lastc = c,到底等于什么啊?*/

我写了复杂了点,不知各位理解我的意思否?小弟实在愚昧,请各位详细明了的带我走出困境!谢谢!
2009-11-13 15:58
小楼ai
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2009-11-11
收藏
得分:0 
回复 24楼 michaelyj
#include <stdio.h>

#define NONBLANK 'a'      /*这个定义在这个程序中到底起了什么关键性作用?*/

main()
{
    int c, lastc;
    lastc = NONBLANK;       /*为什么要让这个常量赋值给这个变量?*/首先NONBLANK不是常量,只是简单的字符替换。比如:int b = 7;那么这个“7”它不也是常量,b也是变量,这有什么不懂得。是不能对常量再赋值,不是不能把常量的值赋给变量。
   
    while((c = getchar()) != EOF)       /*如果输入的字符中不含有EOF,就执行循环体,这我明白*/
        if(c != ' ')       /*这句我搞不懂,执行循环体后,   如果(c 不等于 空格)就执行下一句?*/不是执行循环体后,while后的花括号里的所有语句就是循环体。对,如果c不是空格就执行下一句,也就是输出语句。
            putchar(c);    /*那如果我输入的字符里带有空格呢?那这个程序就不运行了?*/如果带有空格,就不输出空格,即跳过空格,继续输出下面的字符。
}

光上面的程序我运行后,效果是这样的,当我无论输入多少空格,它都无视我的空格,不让我打印空格!你执行这几句,结果就是这样的, 这样的结果才是正确的。

继续下面的,恕小弟愚昧,实在看不懂各位大哥注解!完全读不通!

        if(c == ' ')   /*如果(C 等于 空格),就执行下面的如果,是这个意思吗?*/
            if(lastc != ' ')    /*如果(lastc 不等于 空格)就执行putchar(c),我觉得奇怪,lastc不会有空格啊,因为上面已经说明了lastc = NONBLANK = 'a'吗?我只看见个A,那里来的空格啊?不解*/可以对变量再赋值的啊,变量变量,就是说在程序里,它的值可以改变。比如 可以先把5赋给变量x,然后根据需要再把6赋给x.
                putchar(c);   /*这个程序怎么会有2个putchar(c)?*/第一个putchar(c)是第一个if语句里的,也就是说是针对第一种情况的;第二个是针对第二个条件的。
        lastc = c;    /*  C变量存储的字符赋值给变量lastc?,lastc = NONBLANK,lastc = c,到底等于什么啊?*/

我写了复杂了点,不知各位理解我的意思否?小弟实在愚昧,请各位详细明了的带我走出困境!谢谢! 这后面的一堆,我想你需要学点c的基本知识。
2009-11-13 16:32
mengfp
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:45
专家分:141
注 册:2009-8-5
收藏
得分:0 
变量定义先不说,单就逻辑讲一讲:
程序开始给lastc 赋一个非空格的值。循环体内,进行输出处理,先判断c是否为空格。当其不为空格时,放心输出,无需任何处理。当其为空格时,判断lastc是否也是空格,不是的话输出空格,如果lastc是空格的话,那么前面最近一次输出地必然是空格,不用输出。然后把c当前值赋给lastc以供下次循环判断。这就是循环的逻辑。

然后从程序整体来讲,lastc相当于一个存储器。它的作用是记下上一次输入的字符,供当前循环判断。循环第一次运行的时候,lastc只要为不等于空格的其他非特殊字符,程序应该也能正确运行。

不知道讲明白了么……………………
2009-11-13 16:42
mengfp
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:45
专家分:141
注 册:2009-8-5
收藏
得分:0 
楼主可以从lastc的名字想一想——lastc,  the last c,最近的一次c的值
2009-11-13 16:45
李若斌
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:219
专家分:184
注 册:2009-9-30
收藏
得分:0 
回复 24楼 michaelyj
楼主好好看看if这个语句的运用,然后在看红色的字体。
#include <stdio.h>

#define NONBLANK 'a'      /*这个定义在这个程序中到底起了什么关键性作用?*/

main()
{
    int c, lastc;
    lastc = NONBLANK;       /*为什么要让这个常量赋值给这个变量?*/
   
    while((c = getchar()) != EOF)       /*如果输入的字符中不含有EOF,就执行循环体,这我明白*/
        if(c != ' ')       /*这句我搞不懂,执行循环体后,   如果(c 不等于 空格)就执行下一句?*/
            putchar(c);    /*那如果我输入的字符里带有空格呢?那这个程序就不运行了?*/
}

光上面的程序我运行后,效果是这样的,当我无论输入多少空格,它都无视我的空格,不让我打印空格!

继续下面的,恕小弟愚昧,实在看不懂各位大哥注解!完全读不通!

        if(c == ' ')   /*如果(C 等于 空格),就执行下面的如果,是这个意思吗?*/
            if(lastc != ' ')    /*如果(lastc 不等于 空格)就执行putchar(c),我觉得奇怪,lastc不会有空格啊,因为上面已经说明了lastc = NONBLANK = 'a'吗?我只看见个A,那里来的空格啊?不解*/
                putchar(c);   /*这个程序怎么会有2个putchar(c)?*/你要注意看if这个语句啊,条件成立的话才执行下面语句啊,不成立的话就不执行。两个语句分别控制的是不同的输出。
        lastc = c;    /*  C变量存储的字符赋值给变量lastc?,lastc = NONBLANK,lastc = c,到底等于什么啊?*/
其实楼主主要是不知道lastc在这里的作用,我开始也和你一样的有那些疑问,我来给你详细的解释吧。
你不用去想lastc是放什么东西,它就是一个变量,你根据程序慢慢的理解下来,
首先我们宏定义一个非空格的字符给NONBLANK,然后用赋值的形式把NONBLANK赋值给了lastc,下面在第一个输入字符开始判断,如果输入的字符不是空格的话,那么就输出这个字符。,然后进行下一次循环输入字符,当下一个字符是空格的话,主要在这里了:if (lastc!=' '),上面已经给lastc赋值了,那么这个判断当成是成立的,那么就输出了字符c(这里c是空格),然后把c(空格)赋值给了lastc,那么进行下一个字符的判断,下一个如果是空格字符的话,就进行if(lastc!=‘ ’)的判断就是为假(因为在上一个空格字符判断的循环结束的时候我们已经把空格字符赋值给了lastc这个变量了)。当if为假,那么就不执行下面的赋值和输出语句了,  现在你理解清楚了么?你不用去理解那个为什么lastc要代表前面一个字符的意思,你接直接去理解程序,lastc在程序中就是一个变量。
2009-11-13 18:22
viky2003
Rank: 5Rank: 5
等 级:职业侠客
帖 子:375
专家分:383
注 册:2007-4-11
收藏
得分:0 
程序代码:
#include <stdio.h>

#define NONBLANK 'a'

main()
{
    int c, lastc;
   
    lastc = NONBLANK;/* 将这个初始化为一个非空格字符 */

    while((c = getchar()) != EOF)
    {
        if(c != ' ') /* 如果输入的不是空格那么就输出 */
            putchar(c);
        if(c == ' ') /* 如果这里输出的是空格*/
            if(lastc != ' ')/*判断上次输入的是否是空格*/
                putchar(c);/*如果上次不是空格,那么就输出 */
        lastc = c;/*每次输入后,将输入的字符保持起来一边下次循环用*/
    }
}
那么这个程序就比较好理解了:如果输入的不是空格,那么就输入,如果是空格,前一个不是空格也会输出这个空格,否则不输出这个空格。所以这个程序的目的是将几个连着的空格处理为一个空格输出。



要练习算法就来http:///!!有挑战哦!!
2009-11-13 23:29
michaelyj
Rank: 1
来 自:上海
等 级:新手上路
帖 子:55
专家分:0
注 册:2009-10-27
收藏
得分:0 
为什么我把#define NONBLANK 'a'    lastc = NONBLANK 这句删掉,程序还能正常运行?结果还是一样?

这两句根本不重要?
2009-11-30 15:45
快速回复:有道程序分析不来,请指点迷津~
数据加载中...
 
   



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

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