我在将此流程图转换为C ++代码时遇到问题。
它应该看起来有点像这样(我现在知道这是错的):
do {
I1;
if(!W1) {
I2;
...
}
}
I1
,I2
,I3
是说明。我想我应该使用布尔变量来正确地做,但是怎么做?
答案 0 :(得分:5)
流程图中有一个循环。停止循环的条件实际上是W1。
while (!W1())
{
}
I1(最初)执行,并且在循环完成条件检查之前执行,所以让我们更新代码:
I1();
while (!W1())
{
}
同样,I2是非正式执行的:
I1();
while (!W1())
{
I2();
}
现在,W2影响我们是执行I1还是I3,让我们相应地更新代码:
I1(); // for the first, unconditional execution
while (!W1())
{
I2();
if (W2())
I1();
else
I3();
}
答案 1 :(得分:1)
你是两个交叉循环的情况:两者都没有嵌套在另一个循环中,所以通常的流量控制工具是不够的。
许多人通常会使用人工布尔标志对其进行建模,或者复制部分代码。但这实际上是为数goto
使用案例的少数人之一(而且我的意思是很少 - 事先认真思考)。
忽略W2
的{{1}}分支,这看起来像一个简单的true
循环:
while
现在只需添加缺少的分支。当然,标签应该被充分命名以反映您的实际域逻辑。添加评论,以便它清晰明了,你就可以了。
I1;
while(!W1) {
I2;
if(W2)
/* ? */;
I3;
}
答案 2 :(得分:0)
以下是我的想法:
for (bool skip_i1 = false; ; skip_i1 = true)
{
for (bool w2 = true; w2; w2 = W2())
{
if (!skip_i1) { I1(); }
skip_i1 = false;
if (W1()) { Finish(); return; }
I2();
}
I3();
}
流程图中有两个循环,所以我们在代码中有两个循环,但由于控制流是"错误嵌套",我们需要一个标志(skip_i1
)来在重叠位上分支。作为变体,您可以将skip_i1 = false;
放入内部for
递增器,或放入else
语句的if
分支。
我假设整个代码都存在于它自己的函数中(因为它更好!),因此我们可以使用return
直接退出内部循环。
答案 3 :(得分:0)
START:
I1();
while(!W1){
I2();
while(W2) // or if() it's the same...
goto START;
I3();
}
return; // finish
我希望它有所帮助