for、while、do while循环的流程图表示及相应continue、break的流程图表示

时间:2024-10-30 09:31:56

提示:为了与文字对应,代码中的变量定义及初值已被省略

for循环可以理解为

for( 循环变量初始化 ; 循环判断 ; 循环变量自增 )
{
    循环体
}

先举个例子,for循环求1到100的和

for( i=1; i<=100; i++ )
{
    sum+=i;
}

对应关系

循环变量初始化 i=1
循环判断 i<=100
循环变量自增 i++
循环体 sum+=i

for循环用程序流程图表示

可以看到,图中循环变量初始化只执行了1次

每次循环执行的其实是图中红色箭头指向的部分

循环判断循环体循环变量自增下一次循环判断

画出for循环求和的流程图

while循环可以理解为

循环变量初始化
while( 循环判断 )
{
    循环体【其中包含循环变量自增】
}

仍然用1到100求和举例

i=1;
while( i<=100 )
{
    sum+=i;
    i++;
}

对应关系

循环变量初始化 i=1
循环判断 i<=100
循环变量自增 i++
循环体

sum+=i

i++

while循环用程序流程图表示

(注意:while循环的 循环体 包含 循环变量自增)

可以看到,图中循环变量初始化只执行了1次

每次循环执行的其实是图中红色箭头指向的部分

循环判断循环体(包含循环变量自增)下一次循环判断

画出while循环求和的流程图

(虚框仅为了表示循环体,真正的流程图不会画这个)

do while循环可以理解为

循环变量初始化
do
{
    循环体【其中包含循环变量自增】

}while( 循环判断 );

仍然用1到100求和举例

i=1;
do
{
    sum+=i;
    i++;

}while( i<=100 );

对应关系

循环变量初始化 i=1
循环判断 i<=100
循环变量自增 i++
循环体

sum+=i

i++

do while循环用程序流程图表示

(注意:do while循环的 循环体 包含 循环变量自增)

可以看到,图中循环变量初始化只执行了1次,而且循环体在循环判断之前

即无论是否满足循环判断,do while的循环体必定会执行一次

每次循环执行的其实是图中红色箭头指向的部分

循环体(包含循环变量自增)下一次循环判断

画出do while循环求和的流程图

(虚框仅为了表示循环体,真正的流程图不会画这个)

============================================

continue语句会跳过在它之后的循环体,跳转到下一次循环判断

for循环中的continue

举例:求1到100的偶数和

常规做法是直接判断偶数(i%2==0)

for(i=1; i<=100; i++)
{
    if(i%2==0) sum+=i;
}

非常规做法就是用continue跳过奇数 (i%2!=0)

for(i=1; i<=100; i++)
{
    if(i%2) continue;
    sum+=i;
}

解释一下,直接写 if(表达式) 等价于 if(表达式 != false) ,对于数值表达式, != false就是 !=0。

所以if(i%2) 等价于 if(i%2 != 0) //判断奇数

if(i%2) continue; //遇到奇数时跳过,遇到偶数时不跳过进行后续的求和,然后进行下一次循环

画出非常规做法使用for循环continue的流程图

可以看到当 i%2 != 0 为真时(蓝色箭头),即奇数,执行continue,直接到i++,跳过了sum+=i

只有当 i%2 != 0 为假,也就是 i%2 == 0时,即偶数,正常执行sum+=i 进行求和

while循环中的continue

如果想当然的按照上面形式将for循环改为while循环就错了

错误例:

i=1;
while( i<=100 )
{
    if(i%2) continue;
    sum+=i;
    i++;
}

画出错误例的流程图

因为while循环的循环变量自增 i++是在循环体中

当i%2 != 0为真时(奇数,比如 i==1),执行continue,此时sum+=i 和 i++ 都被跳过

因为i++被跳过,所以i的值不变i==1,继续进入循环,i%2 != 0为真,继续continue

再进入循环,再continue跳过,因为i始终不变,造成死循环

正确例:(在continue之前让 i 自增即可避免死循环)

i=1;
while( i<=100 )
{
    if(i%2) 
    {
        i++;
        continue;
    }
    sum+=i;
    i++;
}

画出正确例的流程图

do while循环中的continue

do while循环和while循环一样,也是循环变量自增包含在循环体中,直接改同样是错的

错误例:

i=1;
do
{
    if(i%2) continue;
    sum+=i;
    i++;

}while( i<=100 );

画出错误例的流程图

 

 

因为continue会跳转到下一次循环判断,而do while循环的循环判断在循环体之后

所以画出来的continue箭头方向跟for和while循环是不一样的

  

正确例:(在continue之前让 i 自增即可避免死循环)

i=1;
do
{
    if(i%2) 
    {
        i++;
        continue;
    }
    sum+=i;
    i++;

}while( i<=100 );

画出正确例的流程图

 

============================================

break语句可以退出当前循环(在多层嵌套循环中仅能退出一层循环)

for循环中的break

举例:判断正整数n是否为素数(质数)

(这是最普通的方法,用sqrt()函数还能更快)

for(i=2; i<n; i++)
{
    if(n%i==0) break;
}
if(i==n) 
{
    printf("%d",n); //以C语言输出为例
}

解释一下,素数是只能被1和本身(变量n)整除的数,循环变量 i 从2到n-1,看n是否能被 i 整除,

如果n%i==0,说明不光有1和本身(变量n),还有 i 能整除n,所以n不是素数而是合数。

因为if(n%i==0)在循环体中,所以肯定满足循环条件i<n。

如果满足if,此时break,退出循环,必定有i<n,n不是素数而是合数

如果循环正常结束,则2到n-1不能整除n,

最后一次循环 i==n-1时,n%i != 0 ,执行i++,此时i==n退出循环,n是素数

画出for循环中的break的流程图

​​​​​​​

 

 

while循环中的break

以前面为基础改写成while循环

i=2;
while( i<n )
{
    if(n%i==0) break;
    i++;
}
if(i==n) 
{
    printf("%d",n);
}

画出while循环中的break的流程图

do while循环中的break

以前面为基础改写成do while循环

i=2;
do
{
    if(n%i==0) break;
    i++;

}while( i<n );

if(i==n) 
{
    printf("%d",n);
}

画出do while循环中的break的流程图