蓝盟IT小贴士,来喽!
什么是Part 1.有限状态机
从百科全书看,有限状态机( FSM/FSA )是为了研究有限内存的计算过程和某种语言类而抽象化的计算机模型,可以表现为有向图。 有限状态机有Moore功能和Mealy功能两种,Moore功能对每个状态附加输出动作,Mealy功能对每个转移附加输出动作。 简单起来,Moore设备的下一状态仅由当前状态确定,而Mealy设备的下一状态不仅与当前状态有关,还与当前输入值有关。 正好今天敲门的两个问题,一个属于Moore机,一个属于Mealy机。
Part 2.单结合电风扇问题
单耦合电风扇只有一把钥匙。 例如,在风速为高、中、低三个阶段的单结合电风扇中,调节风速时,中速在高速和低速之间,其下一阶段和前一阶段的关系是固定的,其下一阶段的状态仅由现在的状态决定,因此属于Moore机。 主题图:大体的要求是,假设单击电风扇处于停止状态,模拟各状态下按下按钮的事件。
看到这个问题,当然可以用数组来解决。 也可以将各种状态写入字符类型数组,使用循环依次读取数组,使用从最后开始读取的int类型数组,排列与各状态对应的数字,使用switch语句的printf输出状态。 但是,由于这个图像链接表,最终单纯地用单向链接表来写。 方案包括:
#include
struct FanState{;
char *state=NULL;
struct FanState *next;
}
int main ( )
FanState A、b、c、d、*head、*p;
chara[5]='stop ',b[4]='low ',c[7]='medium ',d[5]='HIGH ';
a .状态=a;
b .状态=b;
C.state=c;
D.state=d;
head=A;
a .下一步=b;
b .下一步=c;
c .下一步=d;
d .下一步=a;
p=头;
char s;
while((s=getchar ( ) )!=eof){}
if ( s==\n ' ) printf (“% s”)
%s\n ',p-
state,p-
下一步-
state;
else if(s=='q'||s=='Q')break; 以//q或q结束
p=p-
下一步;
以下称为
p=NULL;
return 0;
以下称为
只需按enter键,即可模拟按钮的移动。 凭直觉,按q键或q键结束循环。
然而,当遇到第二个问题时,状态与状态转移的关系变得复杂,方法的选择变得重要。
Part 3.多媒体播放器问题
这个玩家并不是只按下按钮就能确定下一个状态。 以下的状态不仅与现有的状态有关,还与按钮的方式有关。 这已经是Mealy机器了。
然而,乍一看,第一反应还是链路计——是正确的双向链路计。 但是,此双向链接表中的某些节点next和prior的点似乎只有一个,例如“暂停”。 那个插入吧。 是啊,还不够。 我们应该把它们当作原始节点吗?停止-
播放-
快点走? 停止-
播放-
你会早点后退吗? 我开始头晕了。 并且,万一遇到某种情况,为了到达某个节点,不是有必要删除节点吗? 结果,这个next和prior不能指向多个地方……
本菜鸡用链接计等高级手段晕过去,果然是考虑传统要点的方法吧。 用数组表示状态和执行操作时,需要考虑当前状态、按键操作、以下状态这3个信息。 三维的吗?不,二维的就足够了。 如果在当前状态下将“暂停”表示为阵列的第2行,将“第2列”、“按3秒”表示为第5列,将阵列名称表示为Array,则Array[1][1]可表示为“点击当前状态”,Array[1][4]可表示为“按3秒当前状态”,与该阵列位置对应的要素可表示以下状态 当然,只要用数字显示状态并用开关结构输出所对应的下一状态即可。
#include
int main ( )
int x=0,y,z=1;
intarray [5]={ { 6,2,6,6,6 }、{ 6,2,6,6,0 }、{ 6,1,3,4,0 }、{ 6,2,6,6 }、{ 6,2,6,6 };
printf ( '初始状态为停止状态:\n点击,请输入数字1双击,输入数字2\n ' );
printf ( '按三次。 请输入数字3。按3秒钟,输入数字4。要退出,请输入数字5.\n ';
printf ( ' * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * n ' );
printf ( '多媒体播放状态:\n停止\n ' );
while(1){scanf('%d”,y );
if(y==5)break;
交换机(阵列[ x ] [ y ] ) [交换机]
case 0:printf ( '停止\n ' ); break;
case 1:printf ( '暂停\n ' ); break; case 2:printf ( '播放\n ' ); break;
case 3:printf ( '快进\n ' ); break;
case 4:printf ( '快速返回\n ' ); break;
default:z=0; printf ( '输入错误。 请重新输入\n ' ) : break;
以下称为
if(z)x=Array[x][y];
z=1;
以下称为
return 0;