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 }