今日大綱
- 掌握循環(huán)跳轉(zhuǎn)語句break和continue的用法
- 掌握循環(huán)嵌套相關(guān)案例
- 掌握Random類的用法
- 掌握猜數(shù)字案例
1. 循環(huán)跳轉(zhuǎn)
1.1 概述
有些時候, 我們想提前終止循環(huán)的執(zhí)行, 或者跳過循環(huán)的某一次執(zhí)行, 例如: 打印1~10之間, 所有不是3倍數(shù)的數(shù)字, 或者采用死循環(huán)讓用戶不斷的錄入他/她的賬號和密碼, 直到用戶錄入正確, 再終止循環(huán). 這些都要用到循環(huán)控制跳轉(zhuǎn)
知識點.
1.2 分類
- break: 是用來終止循環(huán)的, 循環(huán)不再繼續(xù)執(zhí)行.
- continue: 用來結(jié)束本次循環(huán), 進行下一次循環(huán)的, 循環(huán)還會繼續(xù)執(zhí)行.
1.3 案例一: break入門
需求
打印10次HelloWorld
, 當(dāng)打印第五次的時候, 結(jié)束循環(huán).
參考代碼
//案例: 打印10次`HelloWorld`, 當(dāng)打印第五次的時候, 結(jié)束循環(huán).
public class BreakDemo01 {
public static void main(String[] args) {
System.out.println("start");
//1. 定義for循環(huán), 打印10次HelloWorld
for (int i = 1; i <= 10 ; i++) {
//2.當(dāng)i等于5的時候, 結(jié)束循環(huán)
if (i == 5)
break;
System.out.println("Hello World! " + i);
}
System.out.println("end");
}
}
圖解
1.4 案例二: continue入門
需求
打印1~10之間, 所有不是3倍數(shù)的整數(shù).
參考代碼
//案例; 打印1~10之間, 所有不是3倍數(shù)的整數(shù).
public class ContinueDemo02 {
public static void main(String[] args) {
System.out.println("start");
//1. 通過for循環(huán), 獲取1 - 10之間所有的整數(shù)
for (int i = 1; i <= 10; i++) {
//2. 判斷該數(shù)字是否是3的倍數(shù).
if (i % 3 == 0)
//3. 如果是, 就結(jié)束本次循環(huán)
continue;
//4. 如果不是, 就打印該數(shù)字的值.
System.out.println(i);
}
System.out.println("end");
}
}
圖解
2. 循環(huán)嵌套
所謂的循環(huán)嵌套指的是循環(huán)結(jié)構(gòu)中還包裹著循環(huán)結(jié)構(gòu), 外邊的循環(huán)結(jié)構(gòu)叫外循環(huán), 里邊的循環(huán)結(jié)構(gòu)叫內(nèi)循環(huán).
2.1 格式
循環(huán)嵌套用的最多的就是for循環(huán)的嵌套
, 具體格式如下:
for(初始化條件; 判斷條件; 控制條件) { //外循環(huán), 例如: 5 1 2
for(初始化條件; 判斷條件; 控制條件) { //內(nèi)循環(huán), 例如: 3 1,2,3 1,2,3
//循環(huán)體;
}
}
2.2 執(zhí)行流程
- 外循環(huán)執(zhí)行一次, 內(nèi)循環(huán)執(zhí)行一圈.
- 循環(huán)嵌套的總執(zhí)行次數(shù) = 外循環(huán)的次數(shù) * 內(nèi)循環(huán)的次數(shù).
例如:
- 現(xiàn)實世界中的年月關(guān)系, 即: 1年 = 12個月
- 現(xiàn)實世界中的時分, 分秒關(guān)系, 即: 1小時 = 60分鐘, 1分鐘=60秒.
2.3 案例一: 打印年月
需求
打印2020年1月至2023年12月之間所有的月份, 格式為: XXXX年XX月
參考代碼
-
復(fù)雜寫法
//案例: 打印年月 public class ForForDemo04 { public static void main(String[] args) { //1. 定義循環(huán), 打印2021年所有的月份 for (int j = 1; j <= 12 ; j++) { System.out.print("2021年" + j + "月\t"); } System.out.println(); //記得加換行 //2. 定義循環(huán), 打印2022年所有的月份 for (int j = 1; j <= 12 ; j++) { System.out.print("2022年" + j + "月\t"); } System.out.println(); //記得加換行 //3. 定義循環(huán), 打印2023年所有的月份 for (int j = 1; j <= 12 ; j++) { System.out.print("2023年" + j + "月\t"); } System.out.println(); //記得加換行 } }
-
簡單寫法
//案例: 打印年月 public class ForForDemo04 { public static void main(String[] args) { //1. 定義外循環(huán), 控制年份的變化. for (int i = 2020; i <= 2023 ; i++) { //外循環(huán)執(zhí)行一次, 內(nèi)循環(huán)執(zhí)行一圈. System.out.println("start"); //變量i的取值: 2021, 2022, 2023 //2. 定義內(nèi)循環(huán), 控制月份的變化. for (int j = 1; j <= 12 ; j++) { System.out.print(i + "年" + j + "月\t"); } System.out.println(); //記得加換行 System.out.println("end\r\n"); } } }
2.4 案例二: 打印時分
需求
打印1天內(nèi)的所有時間, 格式: 13時14分.
參考代碼
public class ForForDemo05 {
public static void main(String[] args) {
//1. 定義外循環(huán), 控制小時的變化.
for (int hour = 0; hour <= 23 ; hour++) {
//2. 定義內(nèi)循環(huán), 控制分鐘的變換.
for (int minute = 0; minute <= 59; minute++) {
System.out.println(hour + "時" + minute + "分");
}
}
}
}
2.5 案例三: 打印矩形
需求
-
在控制臺打印一個3行5列的矩形星星序列, 具體格式如下:
***** ***** *****
要求: 一次只能打印一個"*"
參考代碼
public class ForForDemo06 {
public static void main(String[] args) {
for (int i = 0; i < 3; i++) { //外循環(huán)控制行
for (int j = 0; j < 5; j++) { //內(nèi)循環(huán)控制列
System.out.print("*"); //每次打印一個"*"
}
System.out.println(); //內(nèi)循環(huán)執(zhí)行結(jié)束, 意味著一行打印完畢, 記得要換行.
}
}
}
2.6 案例四: 打印正三角形
需求
-
在控制臺打印一個5行5列的正三角形星星序列, 具體格式如下:
* ** *** **** *****
要求: 一次只能打印一個"*"
參考代碼
public class ForForDemo07 {
public static void main(String[] args) {
for (int i = 1; i <= 5; i++) { //外循環(huán)控制行
for (int j = 1; j <= i; j++) { //內(nèi)循環(huán)控制列
System.out.print("*"); //每次打印一個"*"
}
System.out.println(); //內(nèi)循環(huán)執(zhí)行結(jié)束, 意味著一行打印完畢, 記得要換行.
}
}
}
小技巧: 打印正三角形和打印矩形相比: 判斷條件發(fā)生變化.
2.7 案例五: 打印倒三角形
需求
-
在控制臺打印一個5行5列的正三角形星星序列, 具體格式如下:
***** **** *** ** *
要求: 一次只能打印一個"*"
參考代碼
public class ForForDemo08 {
public static void main(String[] args) {
for (int i = 1; i <= 5; i++) { //外循環(huán)控制行
for (int j = i; j <= 5; j++) { //內(nèi)循環(huán)控制列
System.out.print("*"); //每次打印一個"*"
}
System.out.println(); //內(nèi)循環(huán)執(zhí)行結(jié)束, 意味著一行打印完畢, 記得要換行.
}
}
}
小技巧: 打印倒三角形和打印矩形相比: 初始化條件發(fā)生變化.
2.8 案例六: 打印99乘法表
需求
打印99乘法表, 格式如下:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
參考代碼
public class ForForDemo09 {
public static void main(String[] args) {
for (int i = 1; i <= 9; i++) { //外循環(huán)控制行
for (int j = 1; j <= i; j++) { //內(nèi)循環(huán)控制列
//1 * 3 = 3 2 * 3 = 6 3 * 3 = 9
System.out.print(j + " * " + i + " = " + i * j + "\t");
}
System.out.println(); //內(nèi)循環(huán)執(zhí)行結(jié)束, 意味著一行打印完畢, 記得要換行.
}
}
}
3. 帶標(biāo)號的循環(huán)操作
來看一下下面的代碼, 打印結(jié)果是什么呢?
public class ForForDemo10 {
public static void main(String[] args) {
for (int i = 1; i <= 5; i++) { //外循環(huán), 控制行. i的值: 1,
for (int j = 1; j <= 5 ; j++) { //內(nèi)循環(huán), 控制列. j的值: 1,2,3(整個循環(huán)結(jié)束)
if (j == 3) {
break; //這個break, 是用來結(jié)束哪個循環(huán)呢?
}
System.out.print("*");
}
System.out.println();
}
}
}
上述的代碼, 打印結(jié)果是一個5行2列的矩形星星圖案
, 而我的需求是獲取一個1行2列的星星圖案
, 這就意味著, 上述代碼中的break, 只要能直接結(jié)束外循環(huán)即可.
實際開發(fā)中, 為了方便我們操作循環(huán)嵌套
中的指定循環(huán), 就需要用到帶標(biāo)號的循環(huán)操作
了.
格式
A: for(初始化條件; 判斷條件; 控制條件) { //外循環(huán)
B: for(初始化條件; 判斷條件; 控制條件) { //內(nèi)循環(huán)
循環(huán)體;
}
}
2.1 案例一: break用法
優(yōu)化上述的代碼, 改為打印一個1行2列的星星圖案
.
參考代碼
public class ForForDemo10 {
public static void main(String[] args) {
A: for (int i = 1; i <= 5; i++) { //外循環(huán), 控制行.
B: for (int j = 1; j <= 5 ; j++) { //內(nèi)循環(huán), 控制列.
if (j == 3) {
break A; //這個break, 是用來結(jié)束哪個循環(huán)呢?
}
System.out.print("*");
}
System.out.println();
}
}
}
2.9 案例二: continue用法
需求
打印1~100之間所有的質(zhì)數(shù), 并按照3個一行的形式進行輸出.
解釋:
- 質(zhì)數(shù)指的是只能被1及它自身整除的數(shù)字. 例如: 2, 3, 5, 7, 11, 13
- 最小的質(zhì)數(shù)是2
- 該題的目的是演示: 帶標(biāo)號的循環(huán)的continue操作.
參考代碼
public class ForForDemo10 {
public static void main(String[] args) {
//打印1~100之間所有的質(zhì)數(shù), 并按照3個一行的形式進行輸出.
//定義變量, 用來記錄1-100之間的 質(zhì)數(shù)個數(shù).
int count = 0;
//定義變量, 用來記錄一行打印幾個數(shù).
int flag = 3;
a: for (int i = 2; i < 100; i++) {
for (int j = 2; j < i ; j++) {
if (i % j == 0) {
//走到這里, 說明i不是質(zhì)數(shù).
continue a;
}
}
System.out.print(i + (++count % flag == 0 ? "\r\n" : "\t"));
}
}
}
4. 生成隨機數(shù)
4.1 概述
Random類似Scanner橄镜,也是Java提供好的API(Application Programming Interface)臭埋,內(nèi)部提供了產(chǎn)生隨機數(shù)的功能. API后續(xù)課程詳細(xì)講解蛇捌,現(xiàn)在可以簡單理解為Java已經(jīng)寫好的代碼, 我們可以直接拿來用.
4.2 使用步驟
-
導(dǎo)入包
import java.util.Random;
-
創(chuàng)建隨機數(shù)Random對象.
Random r = new Random();
-
調(diào)用方法, 產(chǎn)生隨機數(shù)
int num = r.nextInt(10); //小括號中可以傳入任意的正整數(shù) double num = r.nexDouble(); // [0, 1.0)之間的任意小數(shù) boolean num = r.nextBoolean(10); // 生成均等的布爾值
r.setSeed()
public void setSeed(long seed)
該方法的作用是重新設(shè)置Random對象中的種子數(shù)毕贼。
設(shè)置完種子數(shù)以后的Random對象和相同種子數(shù)使用
new關(guān)鍵字創(chuàng)建出的Random對象相同务漩。
解釋:
- 小括號中寫的整數(shù)是生成的隨機數(shù)的上限.
- 例如: 小括號中寫10 , 說明生成0~10之間的隨機數(shù), 包含0, 但是不包含10, 即: 包左不包右.
- 小括號中必須傳入正整數(shù), 否則會報
IllegalArgumentException(非法參數(shù)異常)
.
4.3 案例一: Random入門
需求
使用Random類拄衰,生成5個10以內(nèi)的隨機整數(shù), 并將結(jié)果打印到控制臺.
參考代碼
import java.util.Random;
public class RandomDemo01 {
public static void main(String[] args) {
//1. 創(chuàng)建Random對象.
Random r = new Random();
//2. 定義for循環(huán), 用來獲取3個隨機數(shù).
int num;
for (int i = 1; i <= 3; i++) {
//3. 調(diào)用r.nextInt(數(shù)字)方法, 獲取具體的隨機數(shù).
num = r.nextInt(10);
System.out.println(num);
}
}
}
4.4 案例二: 隨機職業(yè)
需求
- 提示用戶錄入他/她的名字并接收.
- 通過隨機數(shù), 來打印用戶上輩子的職業(yè).
- 0: 宰相, 1: 一品帶刀侍衛(wèi), 2:皇帝, 3: 大內(nèi)總管, 4: 店小二, 5: 江湖郎中
參考代碼
import java.util.Random;
import java.util.Scanner;
public class RandomDemo03 {
public static void main(String[] args) {
/*
1. 提示用戶錄入他/她的名字并接收.
2. 通過隨機數(shù), 來打印用戶上輩子的職業(yè).
3. 0: 宰相, 1: 一品帶刀侍衛(wèi), 2:皇帝, 3: 大內(nèi)總管, 4: 店小二, 5: 江湖郎中
*/
//1. 創(chuàng)建Random類的對象.
Random r = new Random();
//2. 提示用戶錄入他/她的名字并接收.
Scanner sc = new Scanner(System.in);
System.out.println("請錄入您的姓名, 我來算一下您上輩子的職業(yè): ");
String name = sc.nextLine();
//3. 生成一個0-5之間的隨機數(shù).
int num = r.nextInt(6);
String occupation = "";
switch (num) {
case 0:
occupation = "宰相";
break;
case 1:
occupation = "一品帶刀侍衛(wèi)";
break;
case 2:
occupation = "皇帝";
break;
case 3:
occupation = "大內(nèi)總管";
break;
case 4:
occupation = "店小二";
break;
case 5:
occupation = "宰相";
break;
default:
System.out.println("江湖郎中");
break;
}
//4. 根據(jù)生成的隨機數(shù), 打印用戶上輩子的職業(yè).
System.out.println("您好, " + name + ", 經(jīng)過大數(shù)據(jù)分析, 您上輩子的職業(yè)是: " + occupation);
}
}
4.5 案例三: 猜數(shù)字
需求
- 生成一個1-100之間的隨機數(shù), 讓用戶來猜.
- 如果猜的數(shù)字比生成的隨機數(shù)大,提示你猜的數(shù)據(jù)大了
- 如果猜的數(shù)字比生成的隨機數(shù)小饵骨,提示你猜的數(shù)據(jù)小了
- 如果猜的數(shù)字與生成的隨機數(shù)相等翘悉,提示恭喜你猜中了
參考代碼
import java.util.Random;
import java.util.Scanner;
public class RandomDemo02 {
public static void main(String[] args) {
//1. 創(chuàng)建Random類的對象.
Random r = new Random();
//2. 生成一個隨機數(shù)讓用戶來猜.
int guessNum = r.nextInt(100) + 1;
//3. 因為不知道用戶多少次能猜對, 所以用while(true)死循環(huán).
int inputNum = 0;
while (true) {
//4. 提示用戶錄入猜的數(shù)據(jù), 并接收.
System.out.println("請錄入您猜的數(shù)據(jù)(1-100): ");
inputNum = new Scanner(System.in).nextInt();
//5. 比較用戶錄入的數(shù)據(jù) 和 生成的隨機數(shù)是否一致, 并提示.
if (inputNum > guessNum)
System.out.println("您猜的數(shù)字大了!");
else if (inputNum < guessNum)
System.out.println("您猜的數(shù)字小了");
else {
System.out.println("恭喜您, 猜對了, 請找班任領(lǐng)取獎品... 就業(yè)班晉級卡");
break;
}
}
}
}