循环语句
一、for循环
- for循环语句格式:
for(初始化语句①; 循环条件语句②; 迭代语句④){
循环体语句③
}
for(;;){
循环体语句块;//如果循环体中没有跳出循环体的语句,那么就是死循环
}
注意:
(1)for(;;)中的两个;是不能多也不能少
(2)循环条件必须是boolean类型
(3)如果循环条件语句②省略的话,就默认为循环条件成立
- 执行流程:
-
第一步:执行初始化语句①,完成循环变量的初始化;
-
第二步:执行循环条件语句②,看循环条件语句的值是true,还是false;
- 如果是true,执行第三步;
- 如果是false,循环语句中止,循环不再执行。
-
第三步:执行循环体语句③
-
第四步:执行迭代语句④,针对循环变量重新赋值
-
第五步:根据循环变量的新值,重新从第二步开始再执行一遍
-
案例:
如何获取5-1?
for(int x=5; x>=1; x--){
System.out.println(x);
}
二、while循环
注意:
while(循环条件)中循环条件必须是boolean类型
- while循环语句格式:
初始化语句①;
while (循环条件语句②) {
循环体语句③;
迭代语句④;
}
执行流程:
- 第一步:执行初始化语句①,完成循环变量的初始化;
- 第二步:执行循环条件语句②,看循环条件语句的值是true,还是false;
- 如果是true,执行第三步;
- 如果是false,循环语句中止,循环不再执行。
- 第三步:执行循环体语句③
- 第四步:执行迭代语句④,针对循环变量重新赋值
- 第五步:根据循环变量的新值,重新从第二步开始再执行一遍
练习:趣味折纸
世界最高山峰是珠穆朗玛峰,它的高度是8844.43米,假如我有一张足够大的纸,它的厚度是0.1毫米。
请问,我折叠多少次,可以折成珠穆朗玛峰的高度?
public class WhileTest01 {
public static void main(String[] args) {
//定义一个计数器,初始值为0
int count = 0;
//定义纸张厚度
double paper = 0.1;
//定义珠穆朗玛峰的高度
int zf = 8844430;
while(paper < zf) {
paper *= 2;
count++;
}
System.out.println("需要折叠:" + count + "次");
}
}
三、do…while循环
- do…while循环语句格式:
初始化语句①
do {
循环体语句②;
迭代语句③;
} while (循环条件语句④);
注意:
(1)while(循环条件)中循环条件必须是boolean类型
(2)do{}while();最后有一个分号
(3)do…while结构的循环体语句是至少会执行一次,这个和for和while是不一样的
执行流程:
- 第一步:执行初始化语句①,完成循环变量的初始化;
- 第二步:执行循环体语句②;
- 第三步:执行迭代语句③,针对循环变量重新赋值;
- 第四步:执行循环条件语句④,看循环条件语句的值是true,还是false;
- 如果是true,根据循环变量的新值,重新从第二步开始再执行一遍;
- 如果是false,循环语句中止,循环不再执行。
拔高案例:
案例需求:大乐透(前区“35选5”+后区“12选2”),即前区在1-35之间的号码中随机选取5个,后区在1-12之间的号码中随机选取2个,组成一期的中奖号码,请用程序模拟产生一组大乐透中奖号码。
开发提示:
- 声明一个int类型的数组front,长度为35,默认值都是0;
- 声明一个int类型的数组after,长度为12,默认值都是0;
- 随机产生[0,35)之间的整数。如果随机产生的是0,那么就把front[0]修改为1,如果随机产生的是5,那么就把front[5]修改为1,如果随机产生的是10,就把front[10]修改为1。但是如果本次随机产生的是5,而front[5]已经是1了,那么需要重新随机产生一个整数。用这种方式把front数组的这5个元素修改为1。
- 随机产生[0,12)之间的整数。使用同样的方式,把after数组的2个元素修改为1。
- 遍历front和after数组,输出大乐透中奖号码,判断front和after数组元素是否为1,如果为1,就显示它的下标+1值。
public class Homowork {
public static void main(String[] args) {
int[] front = new int[35];
int[] after = new int[12];
for (int i = 1; i <=5; i++) {
/*
Math.random():[0,1)的小数
Math.random() * front.length:[0,front.length)的小数
(int)(Math.random() * front.length):[0,front.length)的整数,[0,front.length-1]
*/
int index;
do{
index = (int)(Math.random() * front.length);
}while(front[index]==1);
front[index] = 1;
}
for (int i = 1; i <=2; i++) {
int index;
do{
index = (int)(Math.random() * after.length);
}while(after[index]==1);
after[index] = 1;
}
System.out.println("本期大乐透中奖号码:");
System.out.print("前区号码为:");
for (int i = 0; i < front.length; i++) {
if(front[i] == 1){
System.out.print(i+1+"\t");
}
}
System.out.print("\n后区号码为:");
for (int i = 0; i < after.length; i++) {
if(after[i] == 1){
System.out.print(i+1+"\t");
}
}
System.out.println();
}
}
四、循环语句的区别
-
从循环次数角度分析
-
do…while循环至少执行一次循环体语句
-
for和while循环先判断循环条件语句是否成立,然后决定是否执行循环体,至少执行零次循环体语句
-
-
如何选择
- 遍历有明显的循环次数(范围)的需求,选择for循环
- 遍历没有明显的循环次数(范围)的需求,循环while循环
- 如果循环体语句块至少执行一次,可以考虑使用do…while循环
- 本质上:三种循环之间是可以互相转换的,都能实现循环的功能
-
三种循环结构都具有四要素:
(1)循环变量的初始化表达式
(2)循环条件
(3)循环变量的修改的迭代表达式
(4)循环体语句块 -
死循环比较
for(; ; ){循环体} ,除循环体外不需要执行其他语句,性能略高while(true){ 循环体},除循环体外还需要执行小括号里的表达式
五、 嵌套循环
- 嵌套循环,是指一个循环的循环体是另一个循环。比如for循环里面还有一个for循环,就是嵌套循环。总共的循环次数=外循环次数*内循环次数。当然可以是三种循环任意互相嵌套。
- 嵌套循环格式:
for(初始化语句①; 循环条件语句②; 迭代语句⑦) {
for(初始化语句③; 循环条件语句④; 迭代语句⑥) {
循环体语句⑤;
}
}
练习:
打印空心菱形(实心菱形在此基础上进行更改在if条件判断那里进行更改)
public void diamond() {
System.out.println("请输入一个整数(奇数)");
int a = scanner.nextInt();
for (int i = 1; i <= (a + 1) / 2; i++) {
for (int j = 1; j <= a; j++) {
if (j == (a + 1) / 2 - i + 1 || j == (a + 1) / 2 + i - 1)
System.out.print("*\t");
else System.out.print("\t");
}
System.out.println();
}
六、 关键字:break和continue
1、break关键字
-
使用场景:终止switch或者当前循环
-
在选择结构switch语句中
-
在循环语句中
-
离开使用场景的存在是没有意义的
-
案例 :判断是否是素数(速度更快)
public void isPrime() {
boolean bool = true;
boolean isPrime = true;
while (bool) {
System.out.println("请输入一个正整数:");
int num = scanner.nextInt();
if (num == 0)
bool = false;
if (num != 2 && num % 2 == 0) {
isPrime = false;
} else {
for (int i = 3; i <= Math.sqrt(num); i += 2) {
if (num % i == 0) {
isPrime = false;
break;
}
}
}
if (isPrime) {
System.out.println(num + "是一个素数");
} else {
System.out.println(num + "不是一个素数");
isPrime = true;
}
}
}
2、 关键字:continue
- 使用场景:结束本次循环,继续下一次的循环
练习:打印1-100之间的整数,跳过7的倍数和7结尾的数
public static void main(String[] args){
//打印1-100之间的整数,跳过7的倍数和7结尾的数
for(int i=1; i<=100; i++){
if(i%7==0 || i%10==7){
continue;
//break;
}
System.out.println(i);
}
}