将流程图转换为 C++ 代码

Translate flowchart to c++ code

我在将下面的流程图转换为 C++ 代码时遇到问题。

它应该看起来有点像这样(我现在知道这是错误的):

do {
  I1;
  if(!W1) {
      I2;
  ...
  }
}

I1I2I3是指令。我想我应该使用布尔变量来正确地做到这一点,但是怎么做呢?

流程图中有一个循环。停止循环的条件其实就是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();
}

这是我的想法:

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();
}

流程图中有两个循环,所以我们在代码中有两个循环,但是因为控制流程是"mis-nested",所以我们需要一个标志(skip_i1)在重叠位。作为一种变体,您可以将 skip_i1 = false; 放入内部 for 增量器,或放入 if 语句的 else 分支。

我假设整个代码都存在于它自己的函数中(最好有!),这样我们就可以直接使用 return.

退出内部循环

你是两个交叉循环的情况:没有嵌套到另一个循环中,所以通常的流量控制工具是不够的。
许多人通常会用人工布尔标志或重复部分代码来建模它们。但这实际上是 goto.

的极少数(我的意思是 很少 -- 事先仔细想想)的用例之一

忽略 W2true 分支,这看起来像一个简单的 while 循环:

I1;

while(!W1) {
    I2;

    if(W2)
        /* ? */;

    I3;
}

现在只需添加缺少的分支。当然,标签应该适当命名以反映您的实际域逻辑。添加评论,使其 crystal 清晰,大功告成。

    // 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;
    }
START:
I1();
while(!W1){
    I2();
    while(W2) // or if() it's the same...
        goto START;
    I3();
}
return; // finish

希望对你有帮助