循环结构
1. do-while循环
do {
循环操作
} while ( 循环条件 );
do-while循环可以用于处理循环次数确定 或者 循环次数不确定的情况
通常用于处理循环次数不确定的情况
while和do-while的区别?
while循环先判断 后执行 条件不成立 一次都不执行
do-while循环 先执行 后判断 不管条件是否成立 至少执行一次
package com.atguigu.test1;
import java.util.Scanner;
/**
* 经过几天的学习,老师给赵四一道测试题,让他先上机编写程序完成,然后老师检查是否合格。
* 如果不合格,则继续编写……
*
* do-while循环可以用于处理循环次数确定 或者 循环次数不确定的情况
* 通常用于处理循环次数不确定的情况
* */
public class Test1 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String answer; // 计数器
do{
System.out.println("赵四上机编写测试题"); // 循环体
System.out.print("请输入学习任务是否合格? y/n:");
answer = input.next(); // 计数器初始化 变化
}while (answer.equals("n")); // 判断条件
System.out.println("恭喜你完成学习任务");
}
}
package com.atguigu.test1;
/**
* 使用do-while循环打印100遍好好学习
*
* while和do-while的区别?
* while循环 先判断 后执行 条件不成立的话 一次都不执行
* do-while循环 先执行 后判断 不管条件是否成立 至少执行一次
* */
public class Test2 {
public static void main(String[] args) {
int i = 1; // 初始化
do {
System.out.println("第" + i + "遍好好学习"); // 循环体
i++; // 计数器变化
}while (i <= 100); // 判断条件
}
}
2. for循环
for循环 用于处理循环次数确定的情况
for循环执行顺序
第一轮:
1.计数器初始化 并且只执行一次
2.执行判断条件
3.执行循环体
4.执行计数器变化
第二轮:
直接从 第2步:执行判断条件 开始
package com.atguigu.test2;
/**
*
* for循环 用于处理循环次数确定的情况
*
* for循环执行顺序
* 第一轮:
* 1.计数器初始化 并且只执行一次
* 2.执行判断条件
* 3.执行循环体
* 4.执行计数器变化
* 第二轮:
* 直接从 第2步:执行判断条件 开始
*
* 使用for循环打印100次好好学习
* */
public class Test1 {
public static void main(String[] args) {
for (int i = 0; i <= 100; i++) {
System.out.println("第" + i + "遍好好学习");
}
System.out.println("程序结束");
}
}
package com.atguigu.test2;
import java.util.Scanner;
/**
* 循环输入某同学结业考试的5门课成绩,并计算平均分
* */
public class Test2 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
double sum = 0;
for (int i = 1; i <= 5; i++) {
System.out.print("请输入第" + i + "门成绩:");
double score = input.nextDouble();
sum += score;
}
System.out.println("平均分为:" + sum / 5);
System.out.println("程序结束");
}
}
package com.atguigu.test2;
import java.util.Scanner;
/**
* 输出加法表
* */
public class Test3 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("请输入一个数字:");
int num = input.nextInt();
for (int i = 0; i <= num; i++) {
System.out.println(i + "+" + (num - i) + "=" + num);
}
}
}
3.for循环常见问题
for循环常见问题1:没有计数器初始化
package com.atguigu.test3;
/**
* for循环常见问题1:没有计数器初始化
* */
public class Test1 {
public static void main(String[] args) {
for (int i = 1; i < 10; i++) {
System.out.println("这是" + i);
}
System.out.println("程序结束");
}
}
for循环常见问题2:没有判断条件 导致死循环
for循环中 两个分号 一个都不能缺少 否则编译报错
package com.atguigu.test3;
/**
* for循环常见问题2:没有判断条件 导致死循环
* for循环中 两个分号 一个都不能缺少 否则编译报错
* */
public class Test2 {
public static void main(String[] args) {
for (int i = 0;; i++) {
System.out.println(i);
}
// System.out.println("程序结束"); // 不可到达的代码
}
}
for循环常见问题3:缺少计数器变化 导致死循环
package com.atguigu.test3;
/**
* for循环常见问题3:缺少计数器变化 导致死循环
* */
public class Test3 {
public static void main(String[] args) {
for (int i = 1; i <= 10;) {
System.out.println(i);
}
}
}
for循环常见问题4:小阔号中只写两个分号 导致死循环
package com.atguigu.test3;
/**
* for循环常见问题4:小括号中只写两个分号 导致死循环
* */
public class Test4 {
public static void main(String[] args) {
for(;;){
System.out.println("hello world");
}
}
}
4. 三种循环对比
区别2:执行顺序
while 循环:先判断,再执行
do-while循环:先执行,再判断
for循环:先判断,再执行
区别3:适用情况
循环次数确定的情况,通常选用for循环
循环次数不确定的情况,通常选用while或do-while循环
5. break关键字
使用循环和break关键字 模拟跑步中途退出的效果
break关键字:可以用于switch和循环中 在switch中表示跳出switch结构
在循环中表示中断循环 未执行完的循环次数 不再执行
break在循环中通常(99%)要结合分支语句一起使用
循环中存在switch switch中的break只会跳出switch 并不会中断循环
package com.atguigu.test4;
/**
* 使用循环和break关键字 模拟跑步中途退出的效果
*
* break关键字:可以用于switch和循环中 在switch中表示跳出switch结构
* 在循环中表示中断循环 未执行完的循环次数 不再执行
*
* break在循环中通常(99%)要结合分支语句一起使用
* 循环中存在switch switch中的break指挥跳出switch 并不会中断循环
* */
public class Test1 {
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
System.out.println("跑步第" + i + "圈");
if (i == 5){
System.out.println("太累了,退出");
break; // 代码执行到这里 将中断循环 未执行完的次数 不再执行
// System.out.println(); // 这里依然是不可到达的代码,因为遇到break直接中断循环
}
}
System.out.println("程序结束");
}
}
循环录入某学生5门课的成绩并计算平均分,如果某分数录入为负,停止录入并提示录入错误
package com.atguigu.test4;
import java.util.Scanner;
/**
* 循环录入某学生5门课的成绩并计算平均分,如果某分数录入为负,停止录入并提示录入错误
* */
public class Test2 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("请输入您的名字:");
String name = input.next();
int sum = 0; // 定义sum变量 用于累计总和
boolean flag = true; // 定义布尔类型变量 作为是否录入负数成绩的标识
for (int i = 1; i <= 5; i++) {
System.out.print("请输入第" + i + "门成绩:");
int score = input.nextInt();
if (score < 0){
flag = false;
System.out.println("录入分数错误,停止录入");
break;
}
sum += score;
}
if (flag){
System.out.println(name + "的平均分是:" + sum / 5);
}else{
System.out.println("分数录入有误,不再计算平均分");
}
}
}
1~10之间的整数相加,得到累加值大于20的当前数
package com.atguigu.test5;
/**
* 1~10之间的整数相加,得到累加值大于20的当前数
* */
public class Test1 {
public static void main(String[] args) {
int sum = 0;
for (int i = 1; i <= 10; i++){
sum += i;
if (sum > 20){
System.out.println("大于20的总和为" + sum + ", i的取值为:" + i); // 大于20的总和为21, i的取值为:6
break;
}
}
}
}
6. continue关键字
continue :只能用在循环里
continue 作用:跳过循环体中剩余的语句而执行下一次循环
package com.atguigu.test5;
import java.util.Scanner;
/**
* 循环录入Java课的学生成绩,统计分数大于80分的学生比例
* */
public class Test2 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("请输入班级总人数:");
double count = input.nextInt();
int sum = 0; // 定义变量 用于统计大于80分的人数
for (int i = 1; i <= count; i++) {
System.out.print("请输入第" + i + "个人的成绩:");
int score = input.nextInt();
if (score <= 80){
System.out.println("分数小于等于80分,不进行统计");
continue;
}
sum++;
}
System.out.println("大于80分的总人数为:" + sum);
System.out.println("分数大于80分的人数占比是:" + sum / count * 100 + "%");
}
}
求1~10之间偶数和
package com.atguigu.test5;
/**
* 求1~10之间的所有偶数和
* */
public class Test3 {
public static void main(String[] args) {
// 方式1:使用continue
int sum = 0;
for (int i = 1; i <= 10; i++){
if (i % 2 != 0){
continue;
}
sum += i;
}
System.out.println("1~10之间偶数和为:" + sum); // 1~10之间偶数和为:30
// 方式2
int sum1 = 0;
for (int i = 1; i <= 10; i++){
if (i % 2 == 0){
sum1 += i;
}
}
System.out.println("1~10之间偶数和为:" + sum1); // 1~10之间偶数和为:30
}
}
7. break和continue对比
使用场合
break用于switch结构和循环结构中
continue用于循环结构中作用(循环结构中)
break语句终止某个循环,程序跳转到循环块外的下一条语句
continue跳出本次循环,进入下一次循环
双重循环亦如此
8. 程序调试
9.多重循环打印图案
多重循环规律:1.外层循环变量变化一次,内层循环变量变化一轮
9.1 矩形
使用多重循环打印图案:
1.外层循环控制行数
2.内层循环控制列数
package com.atguigu.test6;
/**
* 分别使用单层循环 以及 多重循环是心啊打印 5行5列的矩形
*
* 多重循环规律:1.外层循环变量变化一次,内层循环变量变化一轮
*
* 使用多重循环打印图案:
* 1.外层循环控制行数
* 2.内层循环控制列数
* */
public class Test1 {
public static void main(String[] args) {
for (int i = 1; i <= 5; i++){
System.out.println("*****");
}
System.out.println("----------------");
for (int i = 1;i <= 5; i++){ // 外层循环控制行数
for (int j = 1; j <= 5; j++){ // 内层循环控制列数
System.out.print("*");
}
System.out.println(); // 这里不打印任何内容 只有换行的效果
}
}
}
9.2 平行四边形
分析:
1.外层循环控制行数 一共5行 所以可以书写一个执行5次的循环作为外层循环
2.每一行包含两种元素 左半部分空白 和 右半部分*号 两种元素打印在一行 统一来一次换行
使用多重循环打印三角形:
1.第一行元素的个数决定了计数器的初始值
如果元素个数越来越多 那么就++ 此时 我们必须给计数器设置一个上限
也就是条件必须为 小于或者 小于等于某个值
如果元素个数越来越少 那么就-- 此时 我们必须给计数器设置一个下限
也就是条件必须为 大于或者 大于等于某个值
3.因为三角形每一行元素的个数是不相同的 所以 最终的条件 不能是一个固定的值
也就是 我们必须找到一个不断在变化的值
package com.atguigu.test6;
/**
* 使用多重循环打印平行四边形
*
* 分析:
* 1.外层循环控制行数 一共5行 所以可以书写一个执行5次的循环作为外层循环
* 2.每一行包含两种元素 左半部分空白 和 右半部分*号 两种元素打印在一行 统一来一次换行
* 使用多重循环打印三角形:
* 1.第一行元素的个数决定了计数器的初始值
* 2.如果元素个数越来越多 那么就++ 此时 我们必须给计数器设置一个上限 也就是条件必须为 小于 或者 小于等于 某个值
* 如果元素个数越来越少 那么就-- 此时我们必须给计数器设置一个下限 也就是条件必须为 大于 或者 大于等于 某个值
*
* 3.因为三角形每一行元素的个数是不相同的 所以 最终的条件 不能是一个固定的值 也就是 我们必须找到一个不断在变化的值
*
*
* */
public class Test2 {
public static void main(String[] args) {
for (int i = 1; i <= 5; i++){
// 左半部分
for (int j = 5; j >= i; j--){
System.out.print(" ");
}
// 右半部分
for (int j = 1; j <= 5; j++){
System.out.print("*");
}
// 换行一次
System.out.println();
}
}
}
9.3 正三角形
package com.atguigu.test6;
public class Test3 {
public static void main(String[] args) {
for (int i = 1; i <= 5; i++){ // 外层循环5行
// 左半部分 倒三角
for (int j = 5; j >= i; j--){
System.out.print(" ");
}
// 右半部分 直角三角形
// 右半部分规律 每一行元素的个数 是 行号 * 2 - 1
for (int j = 1; j <= 2 * i - 1; j++){
System.out.print("*");
}
// 换行
System.out.println();
}
}
}