繁体   English   中英

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

[英]Translate flowchart to c++ code

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

流程图

它可能看起来像这样(我知道现在是错误的):

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

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

流程图中有一个循环。 停止循环的条件实际上是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 极少数用例之一(我的意思是很少 -很难想清楚)。

忽略W2true分支,这看起来像一个简单的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM