Java基础之:循环
首先Java中的循环结构包括:for , while ,do...while
但不管是哪一种循环结构一定包含以下循环四要素:
-
循环变量初始化
-
循环执行条件判断
-
循环体
-
循环变量迭代
for循环体
循环流程图:
for([循环变量初始化];循环执行条件判断;[循环变量迭代]){ 循环体; } //循环变量初始化和循环变量迭代可以不写在()内,但两个";"不可以省略。 //具体结构如下: 循环变量初始化; for(;循环执行条件判断;){ 循环体; 循环变量迭代; }
说明:
-
当循环体只有一条语句时,可以省略{},但并不建议这样写代码。
-
循环执行条件判断语句的返回值一定是一个boolean值。(往往在写for循环时,这一部分是最难的)
-
循环变量初始化和循环变量迭代都可以是多条,中间用逗号分隔。
简单案例:
//打印100以内所有7的倍数的整数,通过化繁为简的思想 //首先我们先思考如何打印1-100,然后再思考通过判断谁是7的倍数 for(int i = 1 ; i <= 100 ; i++){ //System.out.println(i); // 1-100 if(i % 7 == 0){ System.out.println(i); } }
while循环体
循环流程图:
基本语法:
循环变量初始化 while(循环条件判断){ 循环体: 循环变量迭代: }
可以看到while循环体同样包含了循环四要素,其实所有的循环体在底层都是同样的结构,但为什么要分几种循环体呢?这就好比有人习惯用叉子,有人习惯用筷子一样。
说明:
-
while循环是先判断条件是否满足再进行循环,这点儿与do...whlie不同。
-
在写while循环时一定不要忘记了退出循环的条件,例如循环变量的迭代。
简单案例:
//不断输入内容,直到输入内容为exit,则退出循环 import java.util.Scanner; public class While { public static void main(String[] args){ Scanner input = new Scanner(System.in); String name = ""; //String对象声明时,要习惯对它进行初始化 while(!"exit".equals(name)){ //使用常量"exit"调用equals()方法,防止出现空指针异常 name = input.next(); } System.out.println("程序结束!"); } }
通过这个案例我们看到,while循环并不一定要使用变量值的迭代来进行判断是否退出循环。
我们甚至可以这样使用while循环:
boolean flag = true; while(flag){ 循环体; if(条件判断){ flag = false; } }
当然使用for循环也可以实现这样的功能,只是使用while循环能让我们更清晰的看出,可以通过boolean值的改变来控制何时退出循环。
do...while循环体
循环流程图:
基本语法:
循环变量初始化 do{ 循环体; 循环变量迭代; }while(循环条件判断);
说明:
-
从do...while循环的流程图我们就可以看出,do...while循环是先执行一次循环体,再进行循环条件判断。也就是说do...while循环不管如何一定会执行一次,适合用于菜单的打印。
-
要注意在while()之后有一个";",这一点与for循环体和while循环体不同。因Java将do...while循环体看作是一条语句。
简单案例:
//统计1——200之间能被5整除但不能被3整除的个数 import java.util.Scanner; public class While { public static void main(String[] args){ int a = 1; int count = 0; do{ if(a % 5 == 0 && a % 3 != 0){ count += 1; //计数 } a += 1; }while(a <= 200); System.out.println("1——200之间能被5整除但不能被3整除的数有" + count + "个" ); } }
多重循环(重难点)
多重循环即循环的嵌套,就如同之前的if条件判断时的嵌套格式一样。
多重循环实际上就是将内层循环当作外层循环的循环体,所以只有当内层循环退出时(即内层循环的循环条件判断结果为false时)才会执行外层循环的下一次循环。
例如:
for(int i = 1;i <= 10;i++){ //只有当j>10时,才会执行下一次的i循环。 for(int j = 1;j <= 10;j++){ System.out.println("奋斗的小范同学!"); //一共将打印100次。 i * j } }
简单案例1:
//统计3个班成绩情况,每个班有3名同学,求出各个班的平均分和所有班级的平均分[学生的成绩从键盘输入]。 //并统计3个班的总及格人数。 import java.util.Scanner; public class DoubleFor { public static void main(String[] args){ Scanner input = new Scanner(System.in); double classAvg = 0.0; double allClassAvg = 0.0; int count = 0; //及格人数 for(int i = 0; i<3;i++){ //三个班 double classSum = 0.0;//计算每个班的成绩总和 System.out.println("班级"+(i+1)); System.out.println("输入班级人数:"); //每个班3个学生 int classNum = input.nextInt(); //通过控制台输入每个班学生人数 for(int j = 0;j< classNum ;j++){ double temp = 0.0; //用于接收控制台输入的成绩 System.out.println("输入成绩:"); temp = input.nextDouble(); classSum += temp; if(temp >= 60){ //统计及格人数 count += 1; } } classAvg = classSum / classNum; System.out.println("班级"+(i+1)+"的平均成绩为:" + classAvg); allClassAvg += classAvg; } System.out.println("所有班平均成绩为:"+(allClassAvg/3)); System.out.println("所有班及格人数为:"+count); } }
运行结果:
简单案例2:
//打印空心等腰三角形 化繁为简的思想!! // * 1.首先尝试打印一半的实心金字塔 // * * 2.再尝试打印整个的实心金字塔 // * * 3.最后思考如何打印空心金字塔 // * * // * * //*********** import java.util.Scanner; public class DayHomeWork { public static void main(String[] args){ Scanner input = new Scanner(System.in); System.out.println("请输入等腰三角形层数:"); int num = input.nextInt(); for(int i = 0 ; i <= num;i++){ //外层循环控制层数 for(int j = 0;j<num-i;j++){ //内层循环控制 每行打印的空格数 System.out.printf(" "); } for(int k = 0;k < (2*i-1);k++){ //内层循环控制 每行打印的*数 if(i == 0 || i == num){ //第一行和最后一行正常输出 System.out.printf("*"); }else{//空心打印 if(k == 0 || k == (2*i-1)-1){ //第一个和最后一个"*"打印 System.out.printf("*"); }else{ //其他时候打印空格 System.out.printf(" "); } } } System.out.println(); } } }
跳转控制语句
作用于循环体内的跳转控制语句有:break,continue ,return
break
流程示意图(while循环体为例):
之前我们在switch中也用到了break关键字,其作用是退出switch语句。在三大循环体中,它的作用同样如此。
break关键字使用场景通常时我们不知道循环次数时,用break来退出循环。
简单案例:
public class Ninety { public static void main(String[] args){ int count = 0; for(int i = 0 ; i < 100 ; i++){ count += 1; if(((int)(Math.random()*100)) == 90 ){ break; } } System.out.println("一共用了:"+count+"次!"); } }
continue
流程示意图(以while循环体为例):
continue关键字作用:退出此次循环,直接进入下一次循环。
简单案例:
public class ContinueTest { public static void main(String[] args) { int i = 1; while( i <= 4) { i++; if( i == 2) { continue; //跳过2,不进行打印直接进入下次循环 } System.out.println("i=" + i); } } } //打印结果为: 1 3 4 5 // 1 3 4 5 // 1 3 4 5
return
return使用在方法,表示跳出所在的方法。这里只做简单了解,有个概念就行。
标签
break 与 continue 出现在多重嵌套的语句块中时,可以通过标签指定 具体要跳转到哪一层语句块。
若不适用标签,即默认跳出最近的一层语句块,就如同上面的案例。
简单案例(这里以continue为例):
lable1: for(int i = 1 ; i < 3;i++){ lable2: for(int j = 1 ; j < 4;j++){ if(j == 2){ continue lable2; // continue lable1; } System.out.println(j); } }
如果使用 continue lable2将打印输出:1 3 ; 1 3
如果使用 continue lable1将打印输出:1 ; 1
注:本文所有流程图转载自:尚硅谷-韩顺平B站视频地址(https://www.bilibili.com/video/BV15C4y1b76A?p=1)