第五章 循环控制
为什么需要循环语句?
- 需要反复执行同样的操作
- 如果不用循环语句,顺序执行相同代码,代码拖沓冗余
- 循环语句精简,重用代码
- 循环语句代码可读性、可维护性更好
while和do-while循环
while循环语句
- 语句
while、do-while和for均属于循环语句
while(循环条件){ // 循环条件:循环持续执行
循环操作语句 // 循环中被重复执行的操作
}
- 要点
(1)先判断再执行
(2)循环次数不定
(3)避免死循环 - 示例:输入一个正整数,把整数逆序输出,比如12345,输出54321.
问题分析步骤:- 确定循环条件:什么情况下一定要循环下去
- 确定循环操作:确定循环做什么事情
- 把循环条件和循环语句填入合适的循环语句结构中即可。
import java.util.Scanner;
public class whileDemo{
public static void main(String[] args){
Scanner input=new Scanner(System.in);
System.out.println("请输入一个整数");
int number=input.nextInt();
//number=12345;
while(number!=0){
int res=number%10;
System.out.print(res);
number/=10;
}
}
}
do-while循环语句
- 语法
while循环又称当前循环 → 先判断后执行
do ··· while循环又称直到型循环 → 先执行后判断
do{
循环操作语句 ← 先执行一次循环
}while(循环条件); ← 满足条件:循环继续执行
- 要点
- 先执行再判断
- 至少执行一次
- 最后的分号勿漏
- 示例:计算从1开始的连续n个自然数之和,当其和值刚好超过100时结束,求这个n值。
问题分析步骤:
* 确定循环条件:什么情况下要一直循环下去。
* 确定循环操作:确定循环做什么事情。
* 把条件循环和循环操作语句填入合适的循环语句结构中即可。
public class doWhileDemo{
public static void main(String[] args){
int n=0; //要被加的数
int sum=0; //累加求和
do{
n++;
sum+=n;
}while(sum<=100);
System.out.println("sum="+sum); //sum=105
System.out.println("n="+n); //n=14
}
}
for循环
for循环语句
- 语法
for(表达式1;表达式2;表达式3){
循环操作;
}
表达式1:参数初始化,给变量赋值
表达式2:条件判断
表达式3:更新循环变量,防止死循环
- 运行步骤:
① 参数初始化 → ② 条件判断,条件为true时 → ③ 循环操作被执行 → ④ 更新循环变量
→ ② ③ ④ ··· ② ③ ④ → ② 条件判断,条件为false时 → 整个循环终止 - 示例:
public class forDemo{
public static void main(String[] args){
// for循环的三个表达式都省略
// 表达式1可以省略,我们可以把它提到for循环之前
// 表达式2省略了会导致死循环,条件永远为true
// 表达式3省略,可能会导致条件永远成立,形成死循环
// 强调:3个表达式都可以省略,但两个分号不能省略
for(int i=0;i<10;i++){
System.out.println(i);
}
/* 等同于上面的for循环
int i=0;
for(;i<10;){
System.out.println(i);
i++;
}
*/
}
}
while循环和for循环的对比
循环类型
- while循环是不确定型循环(循环次数不确定)
- for循环时确定型循环(循环次数确定)
相互转换
- while循环和for循环可以相互转换
使用场合
- 当循环次数确定时,使用for循环
- 当循环次数不确定时,使用while循环
- 循环示例:输出1000以内能同时被3和7整除的正整数
问题分析:
- 根据需求,要循环判断1~1000这些整数是否符合条件
- 显然,这是一个确定型循环问题,适合使用for循环
- 使用while循环也能实现,不过没有for循环直观
- 整除问题涉及到取模运算
public class forDemo2{
public static void main(String[] args){
for(int i=1;i<=1000;i++){
if (i%3==0 && i%7==0){
System.out.println(i);
}
}
}
}
- 有下面程序题,语句a=a+1执行的次数是(无数次)
public class Test{
public static void main(String[] args){
int x=8,a=1;
do{
a=a+1;
}while(x>0);
}
}
- 以下循环体的执行次数是(1)
int i,j;
for(i=0,j=1;i<=j+1;j--){
i=i+2;
}
二重循环
- 二重循环的语法
for (表达式1;表达式2;表达式3) { // 外循环
for (表达式1;表达式2;表达式3) { // 内循环
}
}
- 二重循环的特点
- 在循环体内含有一个循环语句的循环称为二重循环
- 当外循环一次,内循环也要循环完毕,再回到外循环进入下一次循环,直到外循环循环完毕为止。
-
编程语句示例
编程实现输出*号的三角形阵列共9行,第一行输出1颗 *,第二行输出2颗 * ,··· ···,第九行输出9颗 * 。问题分析:
- 外循环控制打印行数,共九行。
- 内循环控制每行打印的*号数。
- 共9行,每行打印的*号个数跟行号正好一致。
public class PrintStar{
public static void main(String[] args){
// 外循环控制打印行数,共九行
for(int i=1;i<=9;i++){
// 内循环控制每行打印的*
for (int j=1;j<=i;j++){
System.out.print("*");
}
System.out.println();
}
}
}
# 运行结果:
*
**
***
****
*****
******
*******
********
*********
break和continue语句
break语法及使用
-
语法
break:改变程序控制流- 在switch/case语句中用于跳出switch代码块
- 在循环语句中,用于跳出循环而执行后面的语句
break一般和条件语句一起使用,有条件跳转。
-
要点
- 结束循环的作用
- 改变循环执行的次数
- 只跳出本循环
- 扩展用法
- 后跟标签
定向跳转至标签处,可以突破本层循环控制,标签放在循环之前,和循环之间不能有其他语句。
continue语法及使用
- 语法
- continue作用:跳过循环体中剩余的语句而执行下一次循环。(结束本次循环,进入下一次循环。)
—————————————————————
↓ |
while (… …) { |
… … |
… … |
… … |
continue;------------
… …
… …
… …
}
continue 一般和条件语句一起使用,有条件进入下一次循环从而提前结束本次循环。
- 要点
- 没有结束循环
- 没有改变循环执行行数
- 只在本层循环中起作用
- 扩充用法
- 后跟标签
定向跳转至标签处,可以突破本层循环限制,标签放在循环之前,和循环之间不能有其他语句。
- 打印100~200之间的质数
public class PrimeDemo{
public static void main(String[] args){
for(int i=100;i<=200;i++){
boolean flag=true;
for (int j=2;j<i;j++){
flag=false; // 非质数
break; // 终止的是内循环
}
//当是质数的时候打印
/*if(flag){
System.out.println(i);
}*/
if(!flag){
continue; // 继续下一次循环
}
System.out.println(i);
}
}
}