1.结构对应

通过源码画流程图,每种循环结构一一对应一种流程图

1.1 for循环

  1. A;
  2. for(int i = 0;i < n;i++){
  3. B;
  4. C;
  5. }
  6. D;

1.2 while循环

  1. A;
  2. while(p){
  3. B
  4. }
  5. C;

循环回到判断菱形的端点,和菱形上方的线效果相同。

1.3 do while 循环

  1. A;
  2. do{
  3. B
  4. }while(p);
  5. C;

2. 实际例题分析

image.png
本题的原始流程图,过程分析如下:

  • 执行flag = True
  • 一个循环结构,循环继续的条件是 p && flag
    • 执行g
    • 进行q条件判断
      • q成立,则啥也不干
      • q不成立,则让flag = false

对应这个逻辑,是一个while循环的结构:
原始流程图.png
接下来要将它改成没有flag的版本。首先分析,flag在什么时候会被改变。
可以看到flag只有在q不成立的时候,被赋值为false,赋值为false之后,由于判断循环跳出的条件中有q,因此循环最后跳出,不再执行。也就是说,如果q为false,就跳出循环。因此可以将q放进循环判断的条件:
但这和原来的流程又有些不同,第一次判断时候,原先判断的内容是:
image.png
由于flag是true,即要只先判断一次p。也就是说,流程为:

  • 判断p
  • 执行g
  • 判断p && q
  • 执行g
  • 判断p && q
  • 执行g
  • ……

直到循环结束。
如果直接使用刚刚我们修改的流程图代替,效果是:

  • 判断p && q
  • 执行g
  • 判断p && q
  • 执行g
  • ……

这样出现的一个差异的情况:当一开始q是false,p是true的时候:

  • 原始流程图只判断一次p,执行一次g,后再跳出循环
  • 新流程图一开始就判断p && q,直接结束程序,不执行g

这样就少执行了一次g,和原先的图意思不符合。
因此我们要对流程图进行修改,单独来判断一次p,后再让循环来判断p && q
无flag流程图.png