zoukankan      html  css  js  c++  java
  • 单词计数

    这个是单词计数
    有点难理解,不是说结构多难,而是这本书其实也没阐明这个程序的功能
    再加上是翻译过来的,刚开始看还是会蒙逼的
     
    阐述下整个逻辑:
    共有5个变量,c是我们输入的字符,nl代表 的个数,nw代表单词数,nc表示字母数
    所谓的IN 和 OUT就是一个种状态,有点类似于标志寄存器
    我们首先,给定的状态state = OUT,即初始状态是在单词外的,接着nl nw nc 的初始值也都是0
    nl = nw = nc = 0相当于 nl = (nw = (nc = 0))
    现在开始循环体的执行,循环的条件不说了,上次说过
    我们令c = getchar() = 'abc'
    其实是分别循环了'a'  'b' 'c'  ' '(这个我也是在OD的时候发现的,刚开始学汇编只是无聊,但发现这玩意有时还挺有用)
    很明显经过++nc 后,nc = 4
    我们一个个分析,首先是'a':执行的是else if (state == OUT)循环体的内容,nw = 1,但此时state = IN了
                                  接着是'b':不执行啥
                   接着是'c':不执行啥
                                  接着是' ':执行的是if (c == ' ') 循环体的内容,nl = 1
     
    所以结果可能是 nl = 1, nw = 1,nc = 4
    我们来看看结果,bingo,正确的
                                                
    #define IN 1 //在单词内       
    #define OUT 0 //在单词外
     
    int main()
    {
     
           int c, nl, nw, nc, state; //nl表示单纯换行数,nw表示单词数,nc表示字符数
     
           state = OUT;
           nl = nw = nc = 0;
           while ((c = getchar()) != EOF)
           {
                  ++nc;
                  if (c == ' ')
                          ++nl;
                  if (c == ' ' || c == ' ' || c == ' ')
                          state = OUT;
                  else if (state == OUT)
                          {
                                 state = IN;
                                 ++nw;
                          }
           }
           printf("nl = %d , nw = %d , nc = %d ", nl, nw, nc);
           system("pause");
           return 0;
    }
     
    演示一遍:
    我们输入了两个单词,nw = 2,自然getchar吸收了两个 ,nl  = 2 ,
    一共有6个字母,由于getchar会吸收两个 ,nc = 6 + 2 = 8
  • 相关阅读:
    获取一个表的,字段,类型,长度,是否主键,是否为空,注释 等信息
    单个页面Request编码方式的改变,无需改动Web.config~
    关于锚点页内链接跳转出现问题(不响应,没有反应)的解决方法(ZT)
    40种网站设计常用技巧~
    在MasterPage中检验session是否存在~
    如何避免重构带来的危险
    早该知道的7个JavaScript技巧
    30个提高Web程序执行效率的好经验
    我学编程时犯的最大两个错误
    C# 中get和set属性的作用
  • 原文地址:https://www.cnblogs.com/EvilAnne/p/9435201.html
Copyright © 2011-2022 走看看