[英]Translate flowchart to c++ code
流程图中有一个循环。 停止循环的条件实际上是W1。
while (!W1())
{
}
无论如何(最初)都执行I1,并且在循环完成条件检查之前执行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();
}
您遇到两个交叉的循环:两个循环都不嵌套,因此通常的流控制工具不足。
许多人通常会使用人工布尔标志或代码的重复部分为它们建模。 但这实际上是goto
极少数用例之一(我的意思是很少 -很难想清楚)。
忽略W2
的true
分支,这看起来像一个简单的while
循环:
I1;
while(!W1) {
I2;
if(W2)
/* ? */;
I3;
}
现在,只需添加缺少的分支。 当然,标签应适当命名以反映您实际的域逻辑。 添加评论,使内容清晰无比,一切就绪。
// Let's W1 a stuff from our list of stuffs
handleNextStuff:
// Take a stuff
I1;
// Try W1'ing the stuff.
while(!W1) {
I2;
// No way we can W1 this stuff, drop it and try the next one.
if(W2)
goto handleNextStuff;
// A step closer to a W1'd stuff.
I3;
}
这是我的主意:
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
递增器,或进入if
语句的else
分支。
我假设整个代码都生活在自己的函数中(更好),这样我们就可以使用return
直接退出内部循环。
START:
I1();
while(!W1){
I2();
while(W2) // or if() it's the same...
goto START;
I3();
}
return; // finish
希望对您有所帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.