目录
5.4.2-3、常见问题3:缺少迭代部分,如果循环条件满足,会进入死循环
5.4.2-4、常见问题4:缺少初始值、循环条件、迭代部分,程序进入死循环
5.7.2、break语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块
5.1、循环结构的四要素及分类
1.循环结构的四要素
(1)初始化条件(初始值)
(2)循环条件--->是boolean类型
(3)循环操作
(4)迭代条件
注意:通常情况下,循环结构都是因为(2)循环条件返回false了。
while循环
初始值; int =1; //初始值
while(循环条件){ while(i<=100){ //循环条件
//循环操作; System.out.println("第"+i+"遍:好好学习,天天向上!");//循环操作
//迭代部分 i++; //迭代条件
} }
2.循环语句分类
- while循环
- do-while循环
- for循环
5.2、while循环
5.2.1、语法结构、执行规律、注意事项
while循环
语法结构:
初始值;
while(循环条件){
//循环操作;
//迭代部分
}
执行规律:
(1)执行1次初始值操作
(2)判断循环条件,如果循环条件满足,执行循环操作代码,循环操作执行完,进行迭代,迭代后再次去判断循环条件是否满足
循环条件不满足,则结束整个循环结构的执行,继续执行循环结构之后的代码
注意:
(1)初始值只执行1次
(2)循环条件为布尔值,要么为true,要么为false
(3)迭代部分的作用是改变循环条件的变量值,从而让其在某一时刻不满足循环条件,结束循环结构
如果没有迭代部分,容易出现死循环,要尽量避免使用死循环
5.2.2、练习
(1)案例1:
使用while循环结构输出100遍“好好学习,天天向上”
package com.bdqn.demo03; public class Demo01 { public static void main(String[] args) { //使用while循环结构输出100遍“好好学习,天天向上” //初始值 int i =1; while(i<=100){ //循环条件 System.out.println("第"+i+"遍:好好学习,天天向上!"); //循环操作 i++; //迭代部分:改变i的值,让i在某一时刻不满足循环条件,结束循环结构 } System.out.println("程序执行完毕"); } }
(2)案例2:
/*
* 老师每天检查张浩的学习任务是否合格,
* 如果不合格,则继续进行。老师给张浩安排的每天的学习任务为:上午阅读教材,学习理论部分,下午上机编程,掌握代码部分
*/package com.bdqn.demo03; import java.util.Scanner; public class Demo03 { public static void main(String[] args) { /* * 老师每天检查张浩的学习任务是否合格, * 如果不合格,则继续进行。老师给张浩安排的每天的学习任务为:上午阅读教材,学习理论部分,下午上机编程,掌握代码部分 */ //创建SCanner类对象 Scanner input =new Scanner(System.in); System.out.println("请输入张浩的学习任务是否合格:"); //初始值,从键盘获取数据 String answer = input.next(); //只要学习任务不合格,就一直循环进行学习 while(answer.equals("不合格")){ System.out.println("上午阅读教材,学习理论部分,下午上机编程,掌握代码部分"); System.out.println("学习是否合格:"); answer = input.next(); } System.out.println("继续努力"); /* * 1、循环输出1,2,3,4,......98,99,100 * 2、求出1-100之间所有整数之和 1+2+3+4+......+98+99+100 * 3、循环输出1-100之间所有的偶数,2,4,6,8,...96,98,100 * 4、求出1-100之间所有偶数之和2+4+6+8+.....+98+100 * 5、循环输出1000-2000年之间的所有闰年 */ } }
(3)作业练习:
/*
* 1、循环输出1,2,3,4,......98,99,100
* 2、求出1-100之间所有整数之和 1+2+3+4+......+98+99+100
* 3、循环输出1-100之间所有的偶数,2,4,6,8,...96,98,100
* 4、求出1-100之间所有偶数之和2+4+6+8+.....+98+100
* 5、循环输出1000-2000年之间的所有闰年
*/package com.bdqn.demo03; public class Demo1 { public static void main(String[] args) { /* * 1、循环输出1,2,3,4,......98,99,100 * */ //初始值 int i = 1; while (i <= 100) { //循环条件 System.out.println(i); //循环操作 i++; //循环条件 } } }
package com.bdqn.demo03; public class Demo2 { public static void main(String[] args) { /* * 2、求出1-100之间所有整数之和 1+2+3+4+......+98+99+100 * */ //声明一个int类型变量sum用来存储数据之和 int sum=0; //初始值 int i = 1; while(i<=100){//循环条件 sum += i; //sum=sum+i; 循环操作 i++;//迭代条件 } System.out.println("整数之和为:"+sum); } }
package com.bdqn.demo03; public class Demo3 { public static void main(String[] args) { /* * 3、循环输出1-100之间所有的偶数,2,4,6,8,...96,98,100 * */ //初始值 int i=1; while(i<=100){ //循环条件 //现在只输出偶数,那么在输出i之前要对i之前是不是偶数进行判断 if(i%2==0){ //循环操作 System.out.println(i); } i++; //迭代条件 } } }
package com.bdqn.demo03; public class Demo4 { public static void main(String[] args) { /* * 4、求出1-100之间所有偶数之和2+4+6+8+.....+98+100 * */ //声明一个int类型的变量sum存储数据之和 int sum=0; //初始值 int i=1; while(i<=100){ //循环条件 //求1-100之间的偶数之和,那么在相加之前,要对i进行判断,判断是不是偶数 if(i%2==0){ //循环操作 sum +=i; } i++; //迭代条件 } System.out.println(sum); } }
package com.bdqn.demo01; public class Demo05 { public static void main(String[] args) { /* * 5、循环输出1000-2000年之间的所有闰年 * * 闰年的条件: * (1)能被4整数,但不能被100整除,普通闰年 * (2)能被400整数,世纪闰年 */ //初始值 int year = 1000; while (year <= 2000) {//循环条件 //判断year是不是闰年 if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { System.out.println(year); } year++;//迭代条件 } } }
5.3、do-while循环
5.3.1、语法结构、执行规律、注意事项
do-while循环
语法结构:
初始值;
do{
循环操作代码
迭代;
}while(循环条件);
执行规律:
(1)执行一次初始值代码
(2)先执行一次循环操作和迭代,然后判断循环条件是否满足,如果循环条件满足,则继续执行循环操作和迭代
如果循环条件不满足,则结束整个do-while循环结构,执行do-while循环结构后面的代码
注意:
do-while循环结构,是先执行一次循环操作,再判断循环条件,也就是说do-while循环至少会执行一次循环操作
while循环结构,是先判断循环条件,再根据循环条件的结果决定是否执行循环操作,如果第一次循环条件就不能满足,循环操作就一次都不执行
5.3.2、练习
(1)案例1:
/*
* 经过几天的学习,老师给张浩一道测试题,
* 让他先上机编写程序完成,然后老师检查是否合格。
* 如果不合格,则继续编写……
*/(2)案例2:
/*
* 使用do-while循环求1-100之间所有偶数之和
*/
(3)案例3:
/*
* 使用do-while循环输出1-100,每5个数字一行
* */(4)案例4:
/*使用do-while循环输出1000-2022之间所有的闰年,每5个年份一行
* 创造一个变量用来统计闰年的个数
* 判断闰年的条件:
* 1.能被4整除,但不能被100整除、
* 2.能被400整除
* */案例1: package com.bdqn.demo02; import java.util.Scanner;//导包 public class Demo01 { public static void main(String[] args) { /* * 经过几天的学习,老师给张浩一道测试题, * 让他先上机编写程序完成,然后老师检查是否合格。 * 如果不合格,则继续编写…… */ //创建Scanner类对象 Scanner input = new Scanner(System.in); //声明一个String类型的变量answer用来存储从键盘获取到的数据 String answer; do{ System.out.println("上机编程......"); System.out.println("测试是否合格?:"); //从键盘获取数据 answer = input.next(); }while(!answer.equals("合格")); //判断从键盘获取的数据是否为“合格”,为true继续执行,为false结束循环 System.out.println("继续努力......"); } }
案例2: package com.bdqn.demo02; public class Demo02 { public static void main(String[] args) { //使用do-while循环求1-100之间所有偶数之和 //声明一个int类型的变量sum用来存储数据之和 int sum = 0; //初始值 int i=1; do{ //对i进行偶数判断 if(i%2==0){ //是偶数就进行累加 sum+=i; } i++; }while(i<=100); System.out.println(sum); } }
案例3 package com.bdqn.demo02; public class Demo03 { public static void main(String[] args) { /* * 使用do-while循环输出1-100,每5个数字一行 * */ //初始值 int i =1; do{ System.out.print(i+" "); //在输出数据之后进行是否需要换行的判断:如果输出的这个数能被5整除,就换行 if(i%5==0){ System.out.println(); } i++; }while(i<=100); } }
案例4: package com.bdqn.demo02; public class Demo04 { public static void main(String[] args) { /*使用do-while循环输出1000-2022之间所有的闰年,每5个年份一行 * 创造一个变量用来统计闰年的个数 * 判断闰年的条件: * 1.能被4整除,但不能被100整除、 * 2.能被400整除 * */ //创建一个int类型的变量用来统计闰年的个数 int count= 0; //声明一个int类型变量year并赋初始值1000 int year = 1000; do{ //判断年份是否是闰年 if(year%4==0&&year%100!=0||year%400==0){ System.out.print(year+" "); count++; //对count进行判断,判断其是不是5的倍数,如果是,就进行换行 if(count%5==0){ System.out.println(); } } year++; }while(year<=2022); } }
5.4、for循环
5.4.1、语法结构、执行规律、注意事项
for循环:
语法结构:
for(初始值;循环条件;迭代部分){
//循环操作代码
}
执行规律:
(1)先执行一次初始值代码
(2)判断循环条件是否满足,如果循环条件为true,则执行循环操作代码,执行完循环操作,进行迭代,迭代完再次进行循环条件判断,根据循环条件判断结果决定是否继续执行循环操作
如果循环条件为false,则结束整个循环结构,继续往下执行循环结构后面的代码
注意:
for循环也是先判断循环条件再决定是否执行循环操作。如果循环条件第一次就不满足,循环操作一次都不会执行
5.4.2、for循环常见问题
5.4.2-1、常见问题1:变量没有初始化
错误代码:
//变量没有初始化
for (; i < 10; i++) {
System.out.println("这是 " + i);
}
正确代码:
int i =0;
for (; i < 10; i++) {
System.out.println("这是 " + i);
}
5.4.2-2、常见问题2: 缺少循环条件,会进入死循环
package com.bdqn.demo00;
public class Demo1 {
public static void main(String[] args) {
//缺少循环条件,会进入死循环
for(int i=0;;i++){ //此部分缺少循环条件
System.out.println("这是 "+i);
}
}
}
5.4.2-3、常见问题3:缺少迭代部分,如果循环条件满足,会进入死循环
package com.bdqn.demo00;
public class Demo1 {
public static void main(String[] args) {
//缺少迭代部分,如果循环条件满足,会进入死循环
for(int i=0;i<10;){
System.out.println("这是 "+i);
//i++; 缺少此部分将进入死循环
}
}
}
5.4.2-4、常见问题4:缺少初始值、循环条件、迭代部分,程序进入死循环
package com.bdqn.demo00;
public class Demo1 {
public static void main(String[] args) {
//缺少初始值、循环条件、迭代部分,程序进入死循环
for(;;){
System.out.println("这是测试");
}
}
}
5.4.3、练习
(1)案例1:
// 循环输入某同学S1结业考试的5门课成绩,并计算平均分
(2)案例2:
输出如下图所示的加法表:
案例1: package com.bdqn.demo03; import java.util.Scanner; public class Demo02 { public static void main(String[] args) { // 循环输入某同学S1结业考试的5门课成绩,并计算平均分 //创建Scanner类对象 Scanner input = new Scanner(System.in); System.out.println("输入学生姓名:"); //从键盘获取学生姓名 String studentName = input.next(); // 声明一个变量用来存储学生成绩之和 double sum = 0; for (int i = 1; i <= 5; i++) { System.out.println("请输入5门课中第" + i + "门课的成绩:"); //从键盘获取成绩 double score = input.nextDouble(); sum += score; } // 计算平均分 double avg = sum/5; System.out.println(studentName+"的平均分是:"+avg); } }
案例2: package com.bdqn.demo03; import java.util.Scanner;//导包 public class Demo03 { public static void main(String[] args) { // 创建Scanner类对象 Scanner input = new Scanner(System.in); System.out.print("请输入一个值:"); // 从键盘获取数据 int num = input.nextInt(); System.out.println("根据这个值可以输出以下加法表:"); // 声明int型变量i和j for (int i = 0, j = num; i <= num && j >= 0; i++, j--) { System.out.println(i + "+" + j + "=" + num); } } }
5.5、嵌套循环结构(多重循环)
1、嵌套循环(多重循环)
(1)将一个循环在另一个循环体内,就形成了嵌套循环。其中,for、while、do-while均可以作为外层循环或内层循环。
(2)实质上,嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的循环条件为false时,才会完全跳出内层循环,才可结束外层的当次循环,开始下一次的循环。
(3)设外层循环次数为m次,内层为n次,则内层循环体实际上需要执行m*n次。
2、注意:
- n各循环可互相嵌套
- n一般不超过三层
- n外层循环变量变化一次,内层循环变量要变化一遍
2、 例题
1、如何使用循环输出以下图形?
2、九九乘法表
3、100以内的所有质数
5.6、 while、do-while、for循环总结
1、语法
while、do-while、for语法结构不一样
2、执行顺序
- while循环:先判断,再执行
- do-while循环:先执行,再判断
- for循环:先判断,再执行
3、适用情况
- 循环次数确定的情况,通常选用for循环
- 循环次数不确定的情况,通常选用while或do-while循环
5.7、break、continue的使用
5.7.1、break语句(作用场景、作用和注意)
1、作用场景
在switch选择结构中和循环结构中
2、作用
(1) 在switch选择结构中遇到break,结束整个switch选择结构,执行switch选择结构后面的代码
(2) 在循环结构中遇到break,结束循环后续所有操作,跳出整个循环结构,执行循环结构后面的代码
3、注意
(1)break语句只能作用在switch选择结构和循环结构中
(2)break语句一般结合条件语句一起使用,因为结束某个代码是需要条件
5.7.2、break语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块
a: { ...... b: { ...... c: { ...... break b; ...... } } }
案例:
5.7.3、continue
- continue 语句
- continue只能使用在循环结构中
- continue语句用于跳过其所在循环语句块的一次执行,继续下一次循环
- continue语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环
5.7.4、 break和continue对比
(1)使用场合
break常用于switch结构和循环结构中
continue一般用于循环结构中(2)作用(循环结构中)break语句终止某个循环,程序跳转到循环块外的下一条语句
continue跳出本次循环,进入下一次循环
双重循环亦如此
5.8、 程序调试
5.8.1、为什么需要程序调试
问题:
(1)编写程序过程中有时出现错误,但不好发现和定位错误,有没有好的方法呢?
(2)通过代码阅读或者加输出语句查找程序错误,当程序结构越来越复杂时,需要专门的技术来发现和定位错误,就是“程序调试”
什么是程序调试
(1) 当程序出错时,我们也希望能这样
5.8.2、如何执行程序调试
程序执行时忽闪一下就运行结束,怎么让程序一步一步运行?