流程图当中没有状态,一般也不顶用事件或者使用事件来控制转移的执行。这样在创建流程图时,主要用到的图形对象就是连接节点和转移,用到的非图形对象就是数据对象。
1.常见逻辑结构模型
结构化的程序主要有三种基本的程序结构,顺序结构、选择结构和循环结构。
顺序结构:就是程序语句按照由上至下的次序依次执行,直到程序的最后一个语句。
选择结构:就是根据不同的判断条件进行判断,然后根据判断的结果选择其中一种方法来解决一个问题。
循环结构:就是在程序中的某一语句或者多条语句可以重复多次地运行。
其中顺序结构比较好理解,就不进行展开。
1.1 选择结构
在一般的高级语言中,选择结构通常是使用if语句、if-else语句和switch语句等实现。
1.1.1 if(条件){动作}
在Stateflow中,默认转移连接的节点成为了判决节点,这里的Stateflow根据默认的转移检测优先权,将优先检测具有条件的分支,如果条件满足,则执行动作Action,否则执行判决节点的无条件转移分支,哪里没有任何动作。最后,所有的转移都汇合到一个只有入口而没有出口的连接节点上,这个节点被称为终止节点。在利用Stateflow创建流程图时,一定要创建一个终止节点。


1.1.2 if(条件){动作A} else {动作B}
如图所示的无条件分支增加必要的动作,则构成了if-else语句。


1.1.3 if(条件1){动作A} else if(条件2){动作B} else{动作C}
这种选择分支结构相当于多条件分支,是上面两种选择分支结构的组合和扩充,具有结如下图所示:


1.1.4 if(条件1){动作A if(条件2){动作B}}
这种选择分支结构是由if-else语句嵌套组成的,具体结果如下图所示:


如果嵌套的层数进一步增加,则可以扩充流程图的包含层次,构成更复杂的逻辑流程分支。
1.1.5 switch-case结构
如果编写程序时遇到较多根据单一变量进行判断的分支,则可以考虑使用switch-case语句来处理,具体结构如下图所示:


在默认转移的条件动作中,对变val进行赋值,然后分别在不同的分支中进行判断,并执行不同的动作。
为了使开发出来的流程图简洁明了,建议大家在开发流程图的过程中,将条件置于水平的转移线上,而将所有的动作都定义在垂直的转移线上。
1.2 循环结构
尽管循环结构中分为“当型循环”和“直到型循环”,但是在很多高级语言中,都存在三种可以创建的循环结构的语句,分别是for循环语句、do-while循环语句和while循环语句。
1.2.1 for循环
一般地,for循环用来处理循环次数确定的循环结构,通常在c语言中都按照如下结构来表示:
for(index=0;index< nloops;index++)
{
Action;
}
for循环对应的Stateflow流程图如图所示:


1.2.2 while循环
语句while可以创建“当”型循环结构,通常在c语言中,它和do-while循环语句用来处理循环次数不确定的问题。当while后面的语句满足条件时,循环就一直持续下去,直到在相应的语句中修改while的条件。一般的,在高级语言中,while循环语句通常表示如下:
while(Condition)
{
Action;
}
在使用while循环结构时,切记相应的动作Action要能够影响相应的条件,以免出现死循环,while循环的Stateflow结构如下图所示。


1.2.3 do-while循环
do-while循环与while循环之间的区别就在于相应的动作在do-while循环中无论如何都要执行一次。在高级语言中,do-while循环通常表示如下:
do{
Action;
}while(Condition)
do-while循环对应的Statefolw流程图如图所示:


2.流程图的回溯现象
什么是流程图的回溯现象?可以对比分析流程图A和B:

流程图 A

流程图B
这两个流程图的唯一区别就在于条件c3的分支。流程图A中,c3的条件分支具有无条件的转移通路,而流程图B中,没有无条件的转移通路。若把这两个流程图改成成编程语言,那么两个流程图表示的选择分支结构是一样的:
if(c1)
{
act1;
if(c2)
{
act2;
}
else if(c3)
{
act3;
}
}
else{
act4;
}
}
同样的分支结构对应的两个流程图,运行结果是不一样的。假设,条件c1为真,条件c2和条件c3为假,从语言表达式上看应该仅执行act1动作,而在对应的流程图中,流程图A能够正确的处理这种情况。
但是流程图B执行情况不同。当该流程图开始执行时,首先条件c1为真,因此在第一个判决节点处流程图执行了act1动作分支。根据流程图的特点,流程图一旦开始执行就一直要执行到没有出口的终止节点为止,因此流程图B还需要继续向下判断执行。由于条件c2和c3都为假,因此这两个连接节点处不存在有效的转移通路。特别是条件c3,由于没有无条件的转移通路,因此流程图认为此条转移通路整体上无效(局部有效),于是就会退回到条件c1的判决节点处,那么这个时候就不得不去执行动作act4的转移分支了。很显然,这是明显错误的,而这种现象就是流程图中的回溯现象。
有人可能会想到,既然这样,就在流程图的转移上使用转移动作不就可以了。其实也不可以,因为流程图中并不存在状态,也就没有转移,而转移动作只有在状态转移执行时才能够执行。在流程图中,仅存在转移的检测,而不存在转移真正的执行。所以,在流程图中,所有的动作都需要在条件动作中完成,即使定义了转移动作,在执行流程图的时候,转移的动作也不会发挥任何作用。
因此,在创建流程图的时候,要注意和牢记以下几点:
- 在流程图中,存在且仅存在一个终止节点,流程图的更新执行最终终止在流程图的终止节点上。
- 所有转移通路必须最终汇合到终止节点。
- 为每一个分支节点提供无条件转移的通路,用于控制一些异常情况或者未预料到的情况。
- 流程图不能出现回溯现象。
- 如果流程图位于Stateflow的Chart层次,则在连续两次更新之间,整个Stateflow框图处于非活动的状态。
参考内容
[1] 张威.Stateflow逻辑系统建模[M].西安:西安电子科技大学出版社,2007.
本文内容来源于网络,仅供参考学习,如内容、图片有任何版权问题,请联系处理,24小时内删除。
作 者 | 郭志龙编 辑 | 郭志龙校 对 | 郭志龙