提示:为了与文字对应,代码中的变量定义及初值已被省略
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);
}