将流程图转换为 C++ 代码
Translate flowchart to c++ code
我在将下面的流程图转换为 C++ 代码时遇到问题。
它应该看起来有点像这样(我现在知道这是错误的):
do {
I1;
if(!W1) {
I2;
...
}
}
I1
、I2
、I3
是指令。我想我应该使用布尔变量来正确地做到这一点,但是怎么做呢?
流程图中有一个循环。停止循环的条件其实就是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
.
的极少数(我的意思是 很少 -- 事先仔细想想)的用例之一
忽略 W2
的 true
分支,这看起来像一个简单的 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
希望对你有帮助
我在将下面的流程图转换为 C++ 代码时遇到问题。
它应该看起来有点像这样(我现在知道这是错误的):
do {
I1;
if(!W1) {
I2;
...
}
}
I1
、I2
、I3
是指令。我想我应该使用布尔变量来正确地做到这一点,但是怎么做呢?
流程图中有一个循环。停止循环的条件其实就是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
.
忽略 W2
的 true
分支,这看起来像一个简单的 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
希望对你有帮助