gpt4 book ai didi

c - 如何从这段代码中绘制控制流图?

转载 作者:太空狗 更新时间:2023-10-29 15:54:03 24 4
gpt4 key购买 nike

int main() {
int i, grade = 0;
printf (" Enter points: \n");
scanf ("%d", &i);
if (i >= 50 && i <= 60) grade = 5;
else if (i > 50 && i <= 60) grade = 6;
else if (i > 60 && i <= 70) grade = 7;
else if (i > 70 && i <= 80) grade = 8;
else if (i > 80 && i <= 90) grade = 9;
else if (i > 90 && i <= 100) grade = 10;
char sign = ' ';
if (grade) {
int p = i % 10;
if (grade != 5) {
if (p >= 1 && p <= 3)
sign = '-';
else if (grade != 10 && (p >= 8 || p == 0))
sign = '+';
}
printf (" The grade is %d%c. \n", grade, sign);

}
return 0;
}

如何从这段代码中绘制控制流图?如果有人能展示这个过程,我将不胜感激。我可以从一个非常简单的案例中得出 CFG,但我做不到这个。我还需要确定多条件标准的基本路径和测试。这不是作业问题,我只是尝试理解类(class) Material 。谢谢。

最佳答案

这是维基百科对 CFG 的定义,我知道你已经知道了,但为了完整起见,我把它放在这里

A control flow graph (CFG) in computer science is a representation,using graph notation, of all paths that might be traversed through aprogram during its execution.

引用:https://en.wikipedia.org/wiki/Control_flow_graph

下面是Path的定义

Path: a sequence of node on the CFG (static), including an entry nodeand an exit node; path segment: a subsequence of nodes along the path

引用:http://web.cs.iastate.edu/~weile/cs513x/4.ControlFlowAnalysis.pdf

因此绘制一个的原因是确定程序采用的所有可能路径,这可能有助于我们在不实际运行程序的情况下确定测试覆盖率(静态分析)。

以下是我们可以遵循的简单规则来绘制 CFG

  1. 任何语句都是图中的一个节点
  2. 所有节点都有一条有向边到达它们或离开它们或两者都有。入口节点(第一条语句)只有出边,导出节点只有入边。
  3. 只有像 if/else ifswitchloops 这样的条件语句才会有多个输出边。
  4. 从一个节点出来的所有路径都会在某个点收敛,在最坏的情况下它们会收敛在导出处。

这是一张备忘单,可以更好地解释它

CFG cheat sheet

现在让我们将程序中的每个语句映射到一个我们将用来表示 CFG 节点的数字

   int main() {
1. int i, grade = 0;
2. printf (" Enter points: \n");
3. scanf ("%d", &i);
4. if (i >= 50 && i <= 60)
5. grade = 5;
6. else if (i > 50 && i <= 60)
7. grade = 6;
8. else if (i > 60 && i <= 70)
9. grade = 7;
10. else if (i > 70 && i <= 80)
11. grade = 8;
12. else if (i > 80 && i <= 90)
13. grade = 9;
14. else if (i > 90 && i <= 100)
15. grade = 10;
16. char sign = ' ';
17. if (grade) {
18. int p = i % 10;
19. if (grade != 5) {
20. if (p >= 1 && p <= 3)
21. sign = '-';
22. else if (grade != 10 && (p >= 8 || p == 0))
23. sign = '+';
}
24. printf (" The grade is %d%c. \n", grade, sign);
}
25. return 0;
}

这是按照上面的备忘单图表中的说明创建的输出。请注意,节点 16 和 24 之前充当许多条件节点的连接节点。

enter image description here

来源:我用过 draw.io创建上面发布的图像。

注意:绘制 CFG 的秘诀是将每个语句独立于程序,绘制它,然后将其入口和导出链接到图形的其余部分。

以下是我遵循的一些初始步骤

  1. 语句 1、2 和 3 是非条件语句,因此我创建了三个 block 将它们链接在一起。 step1
  2. 语句 4 是条件语句。所以我必须为它创建 4 个 block 。第一个用于语句 4,第二个和第三个用于 TRUE、FALSE 边,最后一个用于 JOIN 节点。如果为真则运行语句 5 如果不是则我们转到语句 6。从语句 5 我们直接转到语句 16,这是我们的连接节点。最后,我们将 block 4 链接到 block 3 的出边。 enter image description here
  3. 现在语句 6 本身是一个条件语句,所以我们再次需要 4 个 block 。我们已经有了自己的 block 6。加入节点,它将是语句 16,就好像它的条件为真,然后运行语句 7 并直接转到 16。现在我们已经有了 block 6 和 16,所以我们只需要 TRUE 的 block , FALSE 分支是语句 7 和 8。 step3

依此类推,我们不断检查适用节点的备忘单并单独创建它们,然后与之前的节点链接。

关于c - 如何从这段代码中绘制控制流图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50913708/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com