111.状态机删除注释

状态模式:

//状态模式:状态模式允许一个对象在其内部状态改变的时候改变行为。
//这个对象看上去象是改变了它的类一样。状态模式把所研究的对象的行为包装在不同的状态对象里,
//每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在
//其内部状态改变的时候,其行为也随之改变。状态模式需要对每一个系统可能取得
//的状态创立一个状态类的子类。当系统的状态变化时,系统便改变所选的子类。
//例如
//跟MM交往时,一定要注意她的状态哦,在不同的状态时她的行为会有不同,
//比如你约她今天晚上去看电影,对你没兴趣的MM就会说“有事情啦”,
//对你不讨厌但还没喜欢上的MM就会说“好啊,不过可以带上我同事么?”,
//已经喜欢上你的MM就会说“几点钟?看完电影再去泡吧怎么样?”,
//当然你看电影过程中表现良好的话,也可以把MM的状态从不讨厌不喜欢变成喜欢哦。

  • 定义数据,之前读取的字符和当前读取的字符
    1 //标识状态
    2 int  state = 0;
    3 //备份前一个读取的
    4 char ch1 = 0;
    5 //当前读取的
    6 char ch2 = 0;

     

  • 状态机
     1 //状态机
     2 void  changestate(ch)
     3 {
     4     //如果是初始状态,则给予状态
     5     if (state==0)
     6     {
     7         //遇到 / 再进行判断
     8         if (ch == '/')
     9         {
    10             //如果连续两个 / 进入状态1
    11             if (ch1 == '/')
    12             {
    13                 state = 1;
    14             }
    15             return;
    16         }
    17         //如果遇到 * 
    18         else if (ch == '*')
    19         {
    20             //如果前一个为 / 进入状态2
    21             if (ch1 == '/')
    22             {
    23                 state = 2;
    24             }
    25             return;
    26         }
    27         //遇到 " 进入状态3  使 "" 中的数据输出
    28         if (ch=='"')
    29         {
    30             state = 3;
    31         }
    32         //遇到 ' 进入状态4
    33         if (ch == '\'')
    34         {
    35             state = 4;
    36 
    37         }
    38         //如果是初始状态,则输出数据
    39         putchar(ch);
    40     } 
    41     //如果是状态1,遇到"\n" 进入初始状态
    42     else  if (state==1)
    43     {
    44         if (ch == '\n')
    45         {
    46             state = 0;
    47         }
    48 
    49     }
    50     //如果是状态2
    51     else if (state == 2)
    52     {
    53         //当前是 /
    54         if (ch == '/')
    55         {
    56             //前一个是 * 进入最初状态
    57             if (ch1 == '*')
    58             {
    59                 state = 0;
    60             }
    61         }
    62     }
    63     //如果是状态3 遇到 " 结束状态 进入最初状态
    64     else if (state == 3)
    65     {
    66         if (ch=='"')
    67         {
    68             state = 0;
    69         }
    70         putchar(ch);
    71     }
    72     //如果是状态4 遇到 ' 结束状态,进入最初状态
    73     else if(state==4)
    74     {
    75         if (ch == '\'')
    76         {
    77             state = 0;
    78         }
    79         putchar(ch);
    80     }
    81 }

     

  • 主函数
     1 //主函数
     2 void main()
     3 {
     4     FILE *pfr = fopen(path, "rb");
     5     FILE *pfw = fopen(pathnew, "wb");
     6 
     7     if (pfr == NULL || pfw == NULL)
     8     {
     9         return;
    10     }
    11     else
    12     {
    13         //不断读取,ch1之前读取的数据,ch2当前读取的数据
    14         int ch = 0;
    15         while ((ch=fgetc(pfr))!=EOF)
    16         {
    17             ch1 = ch2;
    18             ch2 = ch;
    19             //进入状态机
    20             changestate(ch);
    21         }
    22     }
    23 
    24     fclose(pfr);
    25     fclose(pfw);
    26     system("pause");
    27 }

     

完整代码

  1 #define  _CRT_SECURE_NO_WARNINGS
  2 #include <stdio.h>
  3 #include <stdlib.h>
  4 
  5 char *path = "hello.c";
  6 char *pathnew = "hellonew.c";
  7 //状态模式:状态模式允许一个对象在其内部状态改变的时候改变行为。
  8 //这个对象看上去象是改变了它的类一样。状态模式把所研究的对象的行为包装在不同的状态对象里,
  9 //每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在
 10 //其内部状态改变的时候,其行为也随之改变。状态模式需要对每一个系统可能取得
 11 //的状态创立一个状态类的子类。当系统的状态变化时,系统便改变所选的子类。
 12 //例如
 13 //跟MM交往时,一定要注意她的状态哦,在不同的状态时她的行为会有不同,
 14 //比如你约她今天晚上去看电影,对你没兴趣的MM就会说“有事情啦”,
 15 //对你不讨厌但还没喜欢上的MM就会说“好啊,不过可以带上我同事么?”,
 16 //已经喜欢上你的MM就会说“几点钟?看完电影再去泡吧怎么样?”,
 17 //当然你看电影过程中表现良好的话,也可以把MM的状态从不讨厌不喜欢变成喜欢哦。
 18 
 19 
 20 
 21 //标识状态
 22 int  state = 0;
 23 //备份前一个读取的
 24 char ch1 = 0;
 25 //当前读取的
 26 char ch2 = 0;
 27 
 28 //状态机
 29 void  changestate(ch)
 30 {
 31     //如果是初始状态,则给予状态
 32     if (state==0)
 33     {
 34         //遇到 / 再进行判断
 35         if (ch == '/')
 36         {
 37             //如果连续两个 / 进入状态1
 38             if (ch1 == '/')
 39             {
 40                 state = 1;
 41             }
 42             return;
 43         }
 44         //如果遇到 * 
 45         else if (ch == '*')
 46         {
 47             //如果前一个为 / 进入状态2
 48             if (ch1 == '/')
 49             {
 50                 state = 2;
 51             }
 52             return;
 53         }
 54         //遇到 " 进入状态3  使 "" 中的数据输出
 55         if (ch=='"')
 56         {
 57             state = 3;
 58         }
 59         //遇到 ' 进入状态4
 60         if (ch == '\'')
 61         {
 62             state = 4;
 63 
 64         }
 65         //如果是初始状态,则输出数据
 66         putchar(ch);
 67     } 
 68     //如果是状态1,遇到"\n" 进入初始状态
 69     else  if (state==1)
 70     {
 71         if (ch == '\n')
 72         {
 73             state = 0;
 74         }
 75 
 76     }
 77     //如果是状态2
 78     else if (state == 2)
 79     {
 80         //当前是 /
 81         if (ch == '/')
 82         {
 83             //前一个是 * 进入最初状态
 84             if (ch1 == '*')
 85             {
 86                 state = 0;
 87             }
 88         }
 89     }
 90     //如果是状态3 遇到 " 结束状态 进入最初状态
 91     else if (state == 3)
 92     {
 93         if (ch=='"')
 94         {
 95             state = 0;
 96         }
 97         putchar(ch);
 98     }
 99     //如果是状态4 遇到 ' 结束状态,进入最初状态
100     else if(state==4)
101     {
102         if (ch == '\'')
103         {
104             state = 0;
105         }
106         putchar(ch);
107     }
108 }
109 
110 //主函数
111 void main()
112 {
113     FILE *pfr = fopen(path, "rb");
114     FILE *pfw = fopen(pathnew, "wb");
115 
116     if (pfr == NULL || pfw == NULL)
117     {
118         return;
119     }
120     else
121     {
122         //不断读取,ch1之前读取的数据,ch2当前读取的数据
123         int ch = 0;
124         while ((ch=fgetc(pfr))!=EOF)
125         {
126             ch1 = ch2;
127             ch2 = ch;
128             //进入状态机
129             changestate(ch);
130         }
131     }
132 
133     fclose(pfr);
134     fclose(pfw);
135     system("pause");
136 }

 

posted @ 2018-03-04 21:02  喵小喵~  阅读(212)  评论(0编辑  收藏  举报