04 循环结构
1.1 为什么要使用循环?
java中存在3中循环的形式:while/dowhile/for
1.2 while循环
[1] 初始化内容 while([2]循环控制条件){ [3]循环操作 [4]迭代变化 }
需求:在控制台依次输出1-5
public class Test01{ public static void main(String[] args){ // while // [1] 初始化内容(循环控制变量) int i = 1; // [2]循环控制条件 while(i<=5){ // [3]输出 System.out.println(i); // [4] 迭代变化 i++; } } }
需求:求1+2+3+…10的和
public class Test02{ public static void main(String[] args){ // 求和:1+2+3+...+10 int i = 1; int sum =0; while(i<=5){ sum += i; i++; } System.out.println("sum="+sum); } }
列举法:列举循环的执行过程。
i |
i<=5 |
sum |
i++ |
1 |
✔ |
1 |
2 |
2 |
✔ |
3 |
3 |
3 |
✔ |
6 |
4 |
4 |
✔ |
10 |
5 |
5 |
✔ |
15 |
6 |
6 |
✘ |
|
|
while可以和if结合使用。
public class Test03{ public static void main(String[] args){ // 求和:1-100偶数的和 int i = 1; int sum = 0; while(i<=100){ if(i % 2 == 0){ sum += i; } i++; } System.out.println("sum = "+sum); } }
1.3 do…while 循环
// [1]初始化 do{ // [2]循环体 // [3]迭代变化 }while([4]循环控制条件)
需求:输出1-5
public class Test06{ public static void main(String[] args){ int i = 1; int sum = 0; do{ if(i%2==0){ sum += i; } i++; }while(i<=10); System.out.println("sum="+sum); } }
while和do…while的区别
相同点:[1]-[4]个条件都相同。
不同点:while先判断,后执行。do…while先执行,后判断。dowhile至少执行循环体一次。
1.4 双层循环
循环支持嵌套。
需求:请在控制台输出以下图形
****
****
****
int i = 1; int j; while(i<=3){ // i 控制行 j=1; while(j<=4){ // j控制列 System.out.print("*"); j++; } System.out.println(""); i++; }
总结:
双层循环中
[1] 外层循环控制行,内层循环控制列。外层循环执行一次,内层循环执行n。
[2] 时间复杂度和空间复杂度??
[3] 在双层循环中,一定要注意不要过度申请变量。
[4] 双层循环 《=》二维结构的问题 《=》行列问题
1.5 for循环
for([1]初始化;[2]循环控制条件;[4]迭代变化){ [3]循环体 }
for执行过程
- 执行初始化代码
- 执行循环控制条件,如果不成立,循环不执行。如果条件成立,执行步骤3
- 循环体执行
- 迭代变量执行,重复2-3-4步骤
需求:1-5输出
public class Test10{ public static void main(String[] args){ // 1-5 for(int i=1;i<=5;i++){ System.out.println(i); } } }
列举法
i |
i<=5 |
输出 |
i++ |
需求:求1-10所有偶数的和
public class Test12{ public static void main(String[] args){ int sum = 0; for(int i=1;i<=10;i++){ if(i%2 == 0){ sum += i; } } System.out.println("sum="+sum); }
特殊情况1: 把[1]初始化提升到for循环外
public class Test12{ public static void main(String[] args){ int i = 1; for(;i<=10;i++){ System.out.println("*"); } System.out.println(i); } }
特殊情况2:省略[2]循环控制条件=>导致死循环
for(int i = 1;;i++){ System.out.println("*"); }
特殊情况3:省略[4]迭代变化=>导致死循环
for(int i = 1;i<=10;){ System.out.println("*"); if(条件){ i++; }else{ i+=2; } }
总结
[1]死循环 for(;;){} / while(true) / do…while(true)
for循环的回退操作
import java.util.Scanner; public class Test13{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); int up30 = 0; int age = 0; for(int i=1;i<=10;i++){ System.out.print("请输入第"+i+"位顾客的年龄:"); age = sc.nextInt(); if(age < 0){ System.out.println("年龄输入不合法,请重新输入!"); i--; }else{ if(age >= 30){ up30++; } } } System.out.println("30岁以上的比例是"+(up30 / 10.0)); } }
复杂的for循环
import java.util.Scanner; public class Test14{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); System.out.println("请输入一个数字:"); int num = sc.nextInt(); /* for(int i=0;i<=num;i++){ System.out.println(i+"+"+(num-i)+"="+num); } */ // int i = 1,j = 2; for(int i=0,j=num;i<=num;i++,j--){ System.out.println(i+"+"+j+"="+(i+j)); } } }
for循环的嵌套
****
****
****
public class Test15{ public static void main(String[] args){ for(int i=1;i<=3;i++){ for(int j=1;j<=i;j++){ System.out.print("*"); } System.out.println(); } } }
1.6 break和continue
break:用于终止整个循环。
continue:用于中止本次循环,进入下一次循环。
public class Test16{ public static void main(String[] args){ /* // 需求:输出1-10 for(int i=1;i<=10;i++){ // 遇到2就终止整个循环 if(i == 2){ break; } System.out.println(i); } System.out.println("我是for循环后的语句"); */ // 需求:输出1-10 for(int i = 1;i<=10;i++){ if(2 == i){ continue; } System.out.println(i); } } }
总结:
break和continue的异同
相同点:
[1]break/continue 后边的语句都不能被执行。
[2]都可以用于循环中
不同点
[1]break终止循环。continue 中止循环,继续下一次循环。
[2]break还可以用于跳出switch…case
案例:模拟atm取款
import java.util.Scanner; public class Test18{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); int type = 0; boolean willQuit = false; for(;;){ System.out.println("1.取款\t2.转账\t3.存款\t4.退出"); System.out.print("请选择:"); type = sc.nextInt(); switch(type){ case 1:{ System.out.println("当前操作取款..."); break; } case 2:{ System.out.println("当前操作转账..."); break; } case 3:{ System.out.println("当前操作存款..."); break; } case 4:{ System.out.println("程序退出,谢谢使用..."); willQuit = true; break; } } if(willQuit){ break; }else{ continue; } } } }
import java.util.Scanner; public class Test19{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); int type = 0; for(;;){ System.out.println("1.取款\t2.转账\t3.存款\t4.退出"); System.out.print("请选择:"); type = sc.nextInt(); switch(type){ case 1:{ System.out.println("当前操作取款..."); continue; } case 2:{ System.out.println("当前操作转账..."); continue; } case 3:{ System.out.println("当前操作存款..."); continue; } case 4:{ System.out.println("程序退出,谢谢使用..."); break; } } break; } } }
1.7 作业
1.输出9*9乘法 2. * * * * * * 3. * * * * * * * * * 4. * * * * * * * *