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

时间:2017-02-14 10:42:12

标签: c++ flowchart control-structure

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

Flowchart

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

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

I1I2I3是说明。我想我应该使用布尔变量来正确地做,但是怎么做?

4 个答案:

答案 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

我希望它有所帮助