循环结构
-
程序中的循环
概念:通过某个条件,重复执行一段逻辑代码
-
while循环
语法:
while(布尔表达式) {
//逻辑代码(循环操作)
}
执行流程:
-
先对布尔表达式进行判断,结果为true,则执行了逻辑代码
- 本次执行完毕后,再次进行判断,结果仍为true,则再次执行逻辑代码
- 直至布尔表达式的结果为false时,才会退出循环结构,执行后续代码
-
-
循环的组成
package demo; public class TestWhile { public static void main(String[] args) { int i = 1;//1.初始部分,用以判断的变量 while(i <= 100) {//2.循环条件:决定是否继续循环的依据 System.out.println("Hello");//3.循环操作:单词执行的逻辑代码或任务 i++;//4.迭代部分:控制循环条件改变的增量 } } }
注:循环有四部分组成
练习:以下代码,哪一行是初始部分?哪一行是迭代部分?
public class TestWhile { public static void main(String[] args) { int a = 1; int b = 1; int c = 1;//初始部分 while (c <= 100) { System.out.println("Hello"); a++; b++; c++;//迭代部分 } } }
注:被循环条件判断的变量,才是初始部分和迭代部分
-
while循环的特点
public class TestWhile { public static void main(String[] args) { int i = 1000; while(i <= 100) { System.out.println("HelloWorld"); } System.out.println("程序结束"); } }
注:首次判断不满足,则一次都不会执行(执行次数:0~n次)
特点:首次即是入口条件,先判断,再执行,适用于循环次数明确的情况
-
课堂案例
1.计算1 + 2 + 3 + 4 +…+ 98 + 99 + 100的总和
//1.计算1 + 2 + 3 + 4 +...+ 98 + 99 + 100的总和 public class TestSum { public static void main(String[] args) { int i = 1; int sum = 0; while(i <= 100) { sum += i; i++; } System.out.println(sum); } }
- 计算1~100之间,所有偶数的和
//2.计算1~100之间,所有偶数的和 public class TestSum1 { public static void main(String[] args) { int i = 1; int sum = 0; while(i <= 100) { if(i % 2 == 0) { sum += i; } i++; } System.out.println(sum); } }
-
do while循环
语法:
do{
逻辑代码(循环操作)
} while(布尔表达式);
执行流程:
-
先执行一次循环操作之后,再进行布尔表达式的判断
- 如果结果为true,则再次执行循环操作
- 如果结果为false,才会退出循环结构,执行后续代码
-
-
do while的特点
public class TestDoWhile { public static void main(String[] args) { int i = 1; do{ System.out.println("HelloWorld"); i++; }while(i <= 100);//判断满足,则循环;不满足,则至少执行一次(执行次数:1~n次) } }
特点:首次没有入口条件,先执行,再判断
-
do while的应用场景
import java.util.Scanner; public class TestDoWhile1 { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("请按如下选项进行选择"); int num; do { System.out.println("1.登录 2. 注册 3. 注销"); num = input.nextInt(); } while(num != 3 ); System.out.println("程序结束"); } }
import java.util.Scanner; public class TestDowhile { public static void main(String[] args) { //需求:检查学生作业完成情况,输入教师评语,决定学生是否需要抄写代码 Scanner input = new Scanner(System.in); char answer;//记录老师当次的评语 do { System.out.println("抄写作业"); answer = input.next().charAt(0);//输入y,表示及格,退出循环;否则继续循环 }while(answer != 'y'); System.out.println("作业已完成"); } }
应用场景:适用于循环次数不明确的情况
-
for循环
语法:
for(初始条件;循环条件;迭代部分) {
//循环操作
}
执行流程:
-
首次执行初始部分(仅一次)
- 对布尔表达式进行判断,结果为true,则执行逻辑代码
- 本次执行完毕后,执行迭代部分,再次判断,结果仍旧为true,则再次执行逻辑代码
- 直至布尔表达式的结果为false时,才会退出循环结构,执行后续代码
-
-
for循环的特点
public class TestFor { public static void main(String[] args) { for (int i = 1;i <= 100;i++) { System.out.println("Hello"); } System.out.println("程序结束"); } }
代码分析如下:int i = 1;1. 初始部分(只执行一次)
i <= 100;2. 循环条件
System.out.println(“Hello”);3. 循环操作
i++;4. 迭代部分
注:for循环与while循环相同,首次判断不满足;则一次都不会执行(执行次数:0 ~ n次)
特点:首次即有入口条件,先判断、再执行,适用于循环次数明确的情况
import java.util.Scanner; public class TestMultiply { public static void main(String[] args) { //需求:控制台输入整数n,计算n的阶乘 Scanner input = new Scanner(System.in); System.out.println("请输入一个需要计算阶乘的整数:"); int num = input.nextInt(); int sum = 1;//int类型的sum,最多只能计算到12的阶乘,12以上的会超过int的取值范围,不精确 for(int i = 1 ; i <= num ; i++){ sum = sum * i; } System.out.println(sum); } }
import java.util.Scanner; public class TestAverageScore { public static void main(String[] args) { // 现有一个班级的5名学生,请通过控制台输入5名学生的分数,求平均数 Scanner input = new Scanner(System.in); float sum = 0F; for(int i = 1 ; i <= 5 ; i++){ System.out.println("请输入学生的成绩:"); float num = input.nextFloat(); sum += num; } float average = sum/5;//默认提升为float类型(sum已经是float类型) System.out.println(average); } }
-
流程控制
break:终止,跳出switch、循环条件
public static TestBreak { public static void main(String[] args) { for(int i = 1;i <= 10; i++) { if(i == 5) { break; } System.out.println("当前次数:" + i); } System.out.println("循环结束"); } }
注:循环执行中,遇到break,则推出整个循环结构
break练习如下:
import java.util.Scanner; public class TestAverageScore { public static void main(String[] args) { // 现有一个班级的5名学生,请通过控制台输入5名学生的分数,求平均数 Scanner input = new Scanner(System.in); //如果输入过程中,存在非法数据,则整班成绩作废 boolean flag = true;//true 代表合法 double sum = 0D; for(int i = 1 ; i <= 5 ; i++){ System.out.println("请输入第" + i + "学生的成绩:"); double score = input.nextDouble(); if(score < 0 || score > 100) { flag = false;// 存在非法数据 break; } sum += score; } if(flag) { double average = sum/5; System.out.println(average); }else { System.out.println("输入有误,请重新输入!"); } } }
continue:结束本次,进入下一次循环
public static TestBreak { public static void main(String[] args) { for(int i = 1;i <= 10; i++) { if(i == 5) { continue; } System.out.println("当前次数:" + i); } System.out.println("循环结束"); } }
注:循环执行中,遇到continue,则跳过此次,进入下一次循环
continue练习如下:
import java.util.Scanner; public class TestContinue { public static void main(String[] args) { // 现有一个班级的5名学生,请通过控制台输入5名学生的分数,求平均数 Scanner input = new Scanner(System.in); //如果输入过程中,存在非法数据,则整班成绩作废 double sum = 0D; for(int i = 1 ; i <= 5 ; ){ System.out.println("请输入第" + i + "学生的成绩:"); double score = input.nextDouble(); if(score < 0 || score > 100) { continue; } sum += score; i++; } double avg = sum / 5; System.out.println(avg); } }
流程控制总结:
import java.util.Scanner; public class TestGuess { public static void main(String[] args) { Scanner input = new Scanner(System.in); //Scanner input = new Random;//随机工具 // 人机猜拳(1.剪刀 2.石头 3. 布) int cCount = 0;//电脑计数器 int pCount = 0;// 玩家计数器 for(int i = 1; i <= 3; ) { int computer = ((int)(Math.random() * 10)) % 3 + 1 ; System.out.println("请输入猜拳的编号:"); int player = input.nextInt(); // 比较 if(computer == player) { System.out.println("平局"); continue; }else if((player == 1 && computer == 3) || (player == 2 && computer == 1) || (player == 3 && computer == 2)) { System.out.println("you win"); pCount++ ; }else { System.out.println("you failure"); cCount++; } if(cCount == 2 || pCount == 2) { break; } i++; } if(pCount == 2) { System.out.println("玩家胜利,奥利给~"); }else { System.out.println("电脑胜利"); } } }
-
嵌套循环
概念:在一个完整的循环结构中,嵌套另一个完整的循环结构
public class TestNestFor { public static void main(String[] args) { for(int i = 1;i <= 3;i++) {//外层控制循环次数 for(int j = 1;j <= 5; j++) {//内层控制单次循环次数 //计算一个班5名学生的平均成绩 } } } }
嵌套循环练习如下:
import java.util.Scanner; public class TestNestedForGet { public static void main(String[] args) { // 现有三个班级的5名学生,请通过控制台输入5名学生的分数,求平均数 Scanner input = new Scanner(System.in); // 将内部代码反复执行3遍 for(int i = 1;i <= 3; i++) { double sum = 0D; for(int j = 1 ; j <= 5 ; j++){ System.out.println("请输入第" + j + "学生的成绩:"); double score = input.nextDouble(); sum += score; } double avg = sum / 5; System.out.println(avg); } } }
-
课堂案例
打印直角三角形
// 需求:打印直角三角形 public class TestNestStars { public static void main(String[] args) { int rows = 6; for(int i = 1; i <= rows; i++) { //外层控制行数 for(int j = 1; j <= i * 2 - 1; j++) { //内层控制列数 System.out.print("*"); } System.out.println(); } } }
打印等腰三角形
// 需求:打印等腰三角形 /* * *** ***** ******* ********* ************ */ public class TestNestStars { public static void main(String[] args) { int rows = 6; for(int i = 1; i <= rows; i++) { //外层控制行数 for(int j = rows - 1; j >= i; j--) { //内层控制列数 System.out.print(" "); } for(int k = 1; k <= i * 2 -1; k++) { System.out.print("*"); } System.out.println(); } } }
打印菱形
import java.util.Scanner; // 需求:打印菱形 public class TestStars { public static void main(String[] args) { int totalRows = 0; do{ System.out.println("请输入菱形的总行数:"); Scanner input = new Scanner(System.in); totalRows = input.nextInt(); } while(totalRows % 2 == 0); int rows = totalRows / 2 + 1; for(int i = 1; i <= rows; i++) { //外层控制行数 for(int j = rows - 1; j >= i; j--) { //内层控制列数 System.out.print(" "); } for(int k = 1; k <= i * 2 -1; k++) { System.out.print("*"); } System.out.println(); } } }
-
总结
- 循环的概念:通过某个条件,重复的执行一段逻辑代码
- while循环:while() {}
- do while循环:do {} while();
- for循环:for(初始;条件;迭代) {操作;}
- 流程控制关键字:break,continue
- 嵌套循环:在一个完整的循环结构中,嵌套另一个完整的循环结构
作业
1.(for循环)计算1 + 2 + 3 + … + 100
2.(for循环)计算1+3+5+…+99
3.(while/do while循环)把1,2两题用while循环或do…while循环改写
4.(for循环)读入一个小于10的整数n,输入它的阶乘n
5.(for循环)求100以内所有能被3整除但不能被5整除的数字的和
8.(for循环)编程找出四位整数中满足(ab + cd)(ab + cd) = abcd的数